2016-11-27 8 views
0

Я следующие OpenId варианты:маркер доступа является недействительным для сервера идентификации клиента

app.UseCookieAuthentication(new CookieAuthenticationOptions 
      { 
       AuthenticationType = "Cookies", 
      }); 



      app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions 
      { 
       AuthenticationType = "oidc", 
       SignInAsAuthenticationType = "Cookies", 
       Authority = "http://localhost:5000",    
       ClientId = "mvcClient", 
       ClientSecret = "secret", 
       RedirectUri = "http://localhost:5002/signin-oidc", 
       PostLogoutRedirectUri = "http://localhost:5002", 
       ResponseType = "code id_token",        
       Scope = "openid profile", 

       Notifications = new OpenIdConnectAuthenticationNotifications 
       { 
        SecurityTokenValidated = async n => 
        { 
         var claims_to_exclude = new[] 
         { 
          "aud", "iss", "nbf", "exp", "nonce", "iat", "at_hash" 
         }; 

         var claims_to_keep = 
          n.AuthenticationTicket.Identity.Claims 
          .Where(x => false == claims_to_exclude.Contains(x.Type)).ToList(); 
         claims_to_keep.Add(new Claim("id_token", n.ProtocolMessage.IdToken)); 




         if (n.ProtocolMessage.AccessToken != null) 
         { 
          claims_to_keep.Add(new Claim("access_token", n.ProtocolMessage.AccessToken)); 

    }  
    }  
} 
} 

Я вижу n.ProtocolMessage.AccessToken всегда нуль.

Я настроил клиента в сервере личных данных, как это:

new Client() 
       { 
        ClientId = "mvcClient", 
        ClientName = "MVC Client",      
        AllowedGrantTypes = GrantTypes.HybridAndClientCredentials, 

        ClientSecrets = new List<Secret>() 
        { 
         new Secret("secret".Sha256()) 
        }, 

        // RequireConsent = false, 

        // where to redirect to after login 
        RedirectUris = { "http://localhost:5002/signin-oidc" }, 
        // where to redirect to after logout 
        PostLogoutRedirectUris = { "http://localhost:5002" }, 

        AllowedScopes = 
        { 
         StandardScopes.OpenId.Name, 
         StandardScopes.Profile.Name, 
         StandardScopes.OfflineAccess.Name, 
         StandardScopes.Roles.Name, 
         "API" 
        } 
       }, 

Я хочу знать, почему n.ProtocolMessage.AccessToken равно нулю, и как я могу получить его значение

UPDATE

Если я изменю тип клиента на гибрид следующим образом:

AllowedGrantTypes = GrantTypes.Hybrid,

и ResponseType = «Код id_token маркер:

Я получаю invalid_request ошибки на сервере

Если я пытаюсь получить маркер доступа, как это (в уведомлениях):

var client = new TokenClient("http://localhost:5000/connect/token", "mvcClient", "secret"); 
          var response = client.RequestClientCredentialsAsync("testscope").Result; 
          var accesstoken = response.AccessToken; 
          claims_to_keep.Add(new Claim("access_token", accesstoken)); 

Результат лексемы имеет только одну область (т.е. testcope), а не все другие области, определенные для этого клиента.

ответ

1

Это значение null, потому что вы не запрашиваете токен доступа.

ResponseType = "code id_token" означает предоставление клиенту «Авторизуемого кода» и «Идентификатор идентификатора» в обратном вызове. Чтобы получить маркер доступа, либо

  1. включает token в ResponseType как ResponseType = "code id_token token" & обновлении Потока клиента гибридного потока (код + маркер), так как это то, что мы сейчас делаем.

или

  1. получать маркер доступа, используя /token конечную точку, используя «код авторизации» доступный на ProtocolMessage.
+0

как только я добавить «маркер» в типе ответа, он говорит unauthorize_client, я также изменил конфигурацию клиента GranTypes.Hybrid на сервере –

+0

Да, вы должны позволить клиенту использовать этот поток (гибрид) как корректно. Обновлено. –

+0

Я пробовал это, но он не работал. Я также обновил этот вопрос. –