2017-07-28 14 views
0

「ResourceOwnerPassword」として認可タイプを使用する認証にIDサーバー4を使用しています。私はユーザーを認証できますが、ユーザーに関連するクレームを取得することはできません。だから、どうすれば入手できますか?以下はリソース所有者のパスワードを使用してIDサーバーのクレームを取得する

は私のコード

クライアント

Startup.cs

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions 
      { 
       Authority = "http://localhost:5000", 
       RequireHttpsMetadata = false, 
       ApiName = "api1" 
      }); 

コントローラ

public async Task<IActionResult> Authentication(LoginViewModel model) 
     { 
      var disco = await DiscoveryClient.GetAsync("http://localhost:5000"); 

      // request token 
      var tokenClient = new TokenClient(disco.TokenEndpoint, "ro.client", "secret"); 
      var tokenResponse = await tokenClient.RequestResourceOwnerPasswordAsync(model.Email, model.Password, "api1"); 

      if (tokenResponse.IsError) 
      { 
       Console.WriteLine(tokenResponse.Error); 
      } 
// Here I am not getting the claims, it is coming Forbidden 
      var extraClaims = new UserInfoClient(disco.UserInfoEndpoint); 
      var identityClaims = await extraClaims.GetAsync(tokenResponse.AccessToken); 
      if (!tokenResponse.IsError) 
      { 
       Console.WriteLine(identityClaims.Json); 
      } 

      Console.WriteLine(tokenResponse.Json); 
      Console.WriteLine("\n\n"); 
} 

サーバー Startup.cs

です
services.AddIdentityServer() 
       .AddTemporarySigningCredential() 
       .AddInMemoryPersistedGrants() 
       .AddInMemoryIdentityResources(Config.GetIdentityResources()) 
       .AddInMemoryApiResources(Config.GetApiResources()) 
       .AddInMemoryClients(Config.GetClients(Configuration)) 
       .AddAspNetIdentity<ApplicationUser>() 
       .AddProfileService<IdentityProfileService>() 
       .AddResourceOwnerValidator<ResourceOwnerPasswordValidator>(); 

Config.cs

public static IEnumerable<Client> GetClients(IConfigurationRoot Configuration) 
     { 
      // client credentials client 
      return new List<Client> 
      { 

       // resource owner password grant client 
       new Client 
       { 
        ClientId = "ro.client", 
        AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, 

        ClientSecrets = 
        { 
         new Secret("secret".Sha256()) 
        }, 
        AlwaysSendClientClaims = true, 
        AlwaysIncludeUserClaimsInIdToken = true, 


        AccessTokenType = AccessTokenType.Jwt 

       } 

      }; 
     } 

public static IEnumerable<ApiResource> GetApiResources() 
     { 
      return new List<ApiResource> 
      { 
       new ApiResource("api1", "My API") 
      }; 
     } 

しかし、私はそこjwt.ioで私のアクセストークンをチェックするとき、私は、特許請求の範囲を見ることができますしかし、私は、コントローラに取得することはできませんよ、なぜ?

この点に関するお役に立ちましたか?

答えて

2

:これを試してみてください。

例えば

ではなく、あなたのようなあなたのApiResourceの定義は以下のとおりです。あなたが展開形式を使用して、このスコープのアクセストークンを取得するときにしたいのですがどのようなUserClaims定義することができます

new ApiResource("api1", "My API") 

。たとえば :

new ApiResource 
{ 
    Name = "api1", 
    ApiSecrets = { new Secret(*some secret*) }, 
    UserClaims = { 
     JwtClaimTypes.Email, 
     JwtClaimTypes.PhoneNumber, 
     JwtClaimTypes.GivenName, 
     JwtClaimTypes.FamilyName, 
     JwtClaimTypes.PreferredUserName 
    }, 
    Description = "My API", 
    DisplayName = "MyApi1", 
    Enabled = true, 
    Scopes = { new Scope("api1") } 
} 

はその後IProfileServiceの独自の実装では、あなたはGetProfileDataAsyncに呼び出すことができます主張は、コンテキスト(ProfileDataRequestContext.RequestedClaimTypes)で要求されているもののリストを持っています。何が求められているのかというリストがあれば、その方法から戻ったcontext.IssuedClaimsに好きなような任意の主張を追加することができます。これらはアクセストークンの一部になります。

UserInfoエンドポイントを特に呼び出すことによって特定のクレームのみが必要な場合は、IdentityResource定義を作成し、そのスコープを元のトークン要求の一部として含めることをお勧めします。たとえば :

new IdentityResource 
{ 
    Name = "MyIdentityScope", 
    UserClaims = { 
     JwtClaimTypes.EmailVerified, 
     JwtClaimTypes.PhoneNumberVerified 
    } 
} 

しかし、あなたはのUserInfoエンドポイントへの応答として、「禁じられた」されませんので、あなたの最初の問題は、ここで他の答えは以下の通りです!

0

UserInfoEndpointを呼び出すときに、要求に沿ってトークンを送信してみます。あなたはあなたの例に従って、UserInfoEndpointを呼び出すことができますが、あなたがそれらを必要としてあなたApiResourceを定義する場合は、追加の請求を得ることができます

var userInfoClient = new UserInfoClient(doc.UserInfoEndpoint, token); 

var response = await userInfoClient.GetAsync(); 
var claims = response.Claims; 

official docs

関連する問題