Там три компоненты к этому.
Сначала убедитесь, что вы с просьбой к id_token от идентичности сервера, когда вы настраиваете аутентификации РСИН в вашем Startup.cs (как было упомянуто выше @leastprivilege):
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Authority = "https://localhost:44301/",
...
ResponseType = "id_token token", //(Here's where we request id_token!)
Во-вторых, с помощью уведомлений РСИН & после того, как маркер безопасности проверяется вы добавляете id_token претензий ваших пользователей:
Notifications = new OpenIdConnectAuthenticationNotifications
{
SecurityTokenValidated = async n =>
{
var nid = new ClaimsIdentity(
n.AuthenticationTicket.Identity.AuthenticationType,
Constants.ClaimTypes.GivenName,
Constants.ClaimTypes.Role);
// get userinfo data
var userInfoClient = new UserInfoClient(
new Uri(n.Options.Authority + "/" + Constants.RoutePaths.Oidc.UserInfo),
n.ProtocolMessage.AccessToken);
var userInfo = await userInfoClient.GetAsync();
userInfo.Claims.ToList().ForEach(ui => nid.AddClaim(new Claim(ui.Item1, ui.Item2)));
// keep the id_token for logout (**This bit**)
nid.AddClaim(new Claim(Constants.TokenTypes.IdentityToken, n.ProtocolMessage.IdToken));
n.AuthenticationTicket = new AuthenticationTicket(
nid,
n.AuthenticationTicket.Properties);
},
Наконец, на редирект для SignOut (также уведомление о событии) вы добавляете id_token к протоколу сообщение:
RedirectToIdentityProvider = n =>
{
if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest)
{
var idTokenHint = n.OwinContext.Authentication.User.FindFirst(Constants.TokenTypes.IdentityToken);
if (idTokenHint != null)
{
n.ProtocolMessage.IdTokenHint = idTokenHint.Value;
}
}
return Task.FromResult(0);
}
Вы также должны убедиться, вы настроите PostLogoutRedirectUris на клиенте в идентификации сервера
new Client
{
Enabled = true,
ClientName = "(MVC) Web App",
ClientId = "mvc",
Flow = Flows.Implicit,
PostLogoutRedirectUris = new List<string>
{
"https://localhost:44300/" //(** The client's Url**)
}
}
Это позволит вам дать пользователю возможность вернуться в уполномоченный клиента при входе в систему вне :)
Все это в значительной степени в соответствии с образцом MVC в https://identityserver.github.io/Documentation/docsv2/overview/mvcGettingStarted.html
бит больше, чем вы просили, но мы надеемся, что он lps кто-нибудь еще, кто пытается понять это тоже :)
Есть ли разница в Identity Server 4? Если да, я создам новый вопрос о том, как в IdSrv4 должен быть реализован один выход из системы. –
@JonasAxelsson - Идея не с головы. Я попытаюсь обновить эти вопросы, когда перейду в эту часть стека. –