2015-07-13 2 views
1

Как мне получить id_token для неявного токена, передаваемого в подсказке id_token для выхода из системы для неявного потока или есть другой способ? У меня есть конечная точка/соединение/концессия? id_token_hint =Thinktecture IdentityServer v3 LogOut для неявного потока

Не уверен, как я получаю id_token из потока implict, который я получаю, это access_token и истечение срока действия. Есть ли параметр в IdSvr?

ответ

0

Чтобы получить id_token, вы должны попросить его. Использовать response_type=id_token token

1

Там три компоненты к этому.

Сначала убедитесь, что вы с просьбой к 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 кто-нибудь еще, кто пытается понять это тоже :)

+0

Есть ли разница в Identity Server 4? Если да, я создам новый вопрос о том, как в IdSrv4 должен быть реализован один выход из системы. –

+0

@JonasAxelsson - Идея не с головы. Я попытаюсь обновить эти вопросы, когда перейду в эту часть стека. –

Смежные вопросы