Я только что обновил свое приложение (которое использует сервер удостоверений 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