Обработка неполных или ошибочных удаленных выходов - PullRequest
0 голосов
/ 14 ноября 2018

Я только что обновил свое приложение (которое использует сервер удостоверений 4) для использования .net core 2.1 framework. Рабочий экземпляр использует .net core 1.1, и у меня нет этой проблемы там. Приложение поддерживает несколько поставщиков открытого идентификатора, одним из которых является B2C. В отличие от других каталогов, процесс выхода не завершен полностью. В .net core 1.1 выход будет завершен страницей выхода с сервера идентификации. Но с .net core 2.1 я вижу пустую страницу. Последний URL-адрес на стороне сервера идентификации - https://<id-server>/signout-callback-oidc?state=<state>. Я подозреваю, что государство повреждено? К сожалению, эта проблема возникает только после того, как я развернул ее в службе приложений, локально у меня нет проблем.

По отношению к журналам - регистрация заканчивается, когда достигнута конечная точка окончания сеанса (EndSessionEndpoint). Как только EndSessionResult возвращается, регистрация больше не происходит. Поэтому, если я посмотрю на свои журналы, это будет означать успех.

Я пробовал множество вещей, таких как указание отписанного URL-адреса обратного вызова в списке принятых URL-адресов ответов для регистрации B2C, пользовательский формат данных состояния с подозрением на длинные URL-адреса. Но ничего не сработало. Количество претензий к этим пользователям также меньше - около 7/8. Я также пытался использовать OpenIdConnectEvents.OnRemoteSignout и OpenIdConnectEvents.OnSignedOutCallbackRedirect, но не похоже, чтобы эти обратные вызовы вызывались.

Журналы Identity Server

[02:16:36 Information] IdentityServer4.Validation.EndSessionRequestValidator
End session request validation success
{
  "ClientId": "<id>",
  "ClientName": "<nmame>",
  "SubjectId": "<sub-id>",
  "PostLogOutUri": "https://<app>/signout-callback-oidc",
  "State": "<state>",
  "Raw": {
    "post_logout_redirect_uri": "https://<app>/signout-callback-oidc",
    "id_token_hint": "<token-hint>",
    "state": "<state>",
    "x-client-SKU": "ID_NET",
    "x-client-ver": "2.1.4.0"
  }
}

[02:16:36 Debug] IdentityServer4.Endpoints.EndSessionEndpoint
Success validating end session request from <app-client-id>

[02:16:37 Information] Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler
AuthenticationScheme: Identity.Application signed out.

[02:16:37 Information] Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler
AuthenticationScheme: Identity.External signed out.

[02:16:38 Information] Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler
AuthenticationScheme: Identity.TwoFactorUserId signed out.

[02:16:38 Information] Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler
AuthenticationScheme: OpenIdConnect signed out.

Последовательность пройденных URL

.Net core 2.1 (Останавливается на signout-callback-oidc? State = с пустой страницей)

.Net core 1.1 (успешно)

Мои вопросы

  • Есть мысли о том, что происходит?
  • Если выход не завершен полностью, есть ли способ для меня восстановить и перенаправить на предопределенный страница

Настройка открытого идентификатора

services.AddOpenIdConnect(adSettingsB2c.SchemeName, adSettingsB2c.DisplayName, options =>
{
    options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
    options.SignOutScheme = IdentityServerConstants.SignoutScheme;
    options.Authority = $"{adSettingsB2c.AADInstance}/{adSettingsB2c.Tenant}/B2C_1_{adSettingsB2c.SignInPolicyId}/v2.0";
    options.CallbackPath = adSettingsB2c.CallbackPath;
    options.ClientId = adSettingsB2c.ClientId;
    options.ResponseType = OpenIdConnectResponseType.IdToken;
    options.SaveTokens = true;
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true
    };
    options.Events = new OpenIdConnectEvents
    {
        OnRedirectToIdentityProvider = r =>
        {
        var defaultPolicy = adSettingsB2c.SignInPolicyId;
        if (r.Properties.Items.TryGetValue("Policy", out var policy) &&
            !policy.Equals(defaultPolicy))
        {
            r.ProtocolMessage.Scope = OpenIdConnectScope.OpenIdProfile;
            r.ProtocolMessage.ResponseType = OpenIdConnectResponseType.IdToken;
            r.ProtocolMessage.IssuerAddress = r.ProtocolMessage.IssuerAddress.ToLower().Replace(defaultPolicy.ToLower(), policy.ToLower());
            r.Properties.Items.Remove("Policy");
        }
        if (r.Properties.Items.ContainsKey("email_address"))
        {
            r.ProtocolMessage.SetParameter("login_hint", r.Properties.Items["email_address"]);
        }
        return Task.FromResult(0);
        },
        OnRemoteFailure = r => { // ... }
    };
    })

Я также разместил этот вопрос в репозитории на сервере идентификации, если у вас есть какие-то мысли и вы хотите добавить его туда! - https://github.com/IdentityServer/IdentityServer4/issues/2794

1 Ответ

0 голосов
/ 24 ноября 2018

Проблема заключалась в том, что при настройке параметров с использованием метода AddOpenIdConnect я не устанавливал SignedoutCallbackPath для каждого из поставщиков открытого идентификатора, вызывающих эту проблему. Как только это было сделано, выходы из системы начали работать, как и ожидалось!

...