2017-11-16 23 views
3

私のアイデンティティサーバーのStartup.csファイルには、以下のようにサーバーが構成されています。私はユーザー管理のためにasp.netアイデンティティを使用しています。IDサーバー4のクライアント側で追加のクレームを取得するにはどうすればよいですか?

services.AddIdentityServer() 
       .AddDeveloperSigningCredential() 
       .AddInMemoryPersistedGrants() 
       .AddInMemoryIdentityResources(Config.GetIdentityResources()) 
       .AddInMemoryApiResources(Config.GetApiResources()) 
       .AddInMemoryClients(Config.GetClients()) 
       .AddAspNetIdentity<ApplicationUser>(); 

services.AddTransient<IProfileService, ProfileService>(); 

私のIdentiyResourcesは以下の通りです。ここでは、私のアプリケーションのさらなるビジネスロジックのために使用したいと思う追加のクレームをIS_Tokenとして返したいと思います。

public static IEnumerable<IdentityResource> GetIdentityResources() 
     { 
      return new List<IdentityResource> 
       { 
        new IdentityResources.OpenId(), 
        new IdentityResources.Profile(), 
        new IdentityResource("IS_token", new []{ "IS_token" }), 
       }; 
     } 

私はまた、以下のように私のIProfileService内部IssuedClaimsでこの主張を追加しています。

public class ProfileService : IProfileService 
    { 
     private readonly IUserClaimsPrincipalFactory<ApplicationUser> _claimsFactory; 
     private readonly UserManager<ApplicationUser> _userManager; 

     public ProfileService(UserManager<ApplicationUser> userManager, IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory) 
     { 
      _userManager = userManager; 
      _claimsFactory = claimsFactory; 
     } 

     public async Task GetProfileDataAsync(ProfileDataRequestContext context) 
     { 
      var sub = context.Subject.GetSubjectId(); 
      var user = await _userManager.FindByIdAsync(sub); 
      var principal = await _claimsFactory.CreateAsync(user); 

      var claims = principal.Claims.ToList(); 
      claims = claims.Where(claim => context.RequestedClaimTypes.Contains(claim.Type)).ToList(); 
      claims.Add(new Claim(JwtClaimTypes.GivenName, user.UserName)); 
      claims.Add(new Claim(IdentityServerConstants.StandardScopes.Email, user.Email)); 

      //Get user claims from AspNetUserClaims table 
      var userClaims = await _userManager.GetClaimsAsync(user); 
      claims.AddRange(userClaims); 

      context.IssuedClaims = claims; 
     } 

     public async Task IsActiveAsync(IsActiveContext context) 
     { 
      var sub = context.Subject.GetSubjectId(); 
      var user = await _userManager.FindByIdAsync(sub); 
      context.IsActive = user != null; 
     } 
    } 

私のMVCのクライアントが

私のMVCアプリケーションで
   new Client 
        { 
         ClientId = "mvc", 
         ClientName = "MVC Client", 
         AllowedGrantTypes = GrantTypes.HybridAndClientCredentials, 
         RequireConsent = false, 

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

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

         // where to redirect to after logout 
         PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" }, 

         AllowedScopes = new List<string> 
         { 
          IdentityServerConstants.StandardScopes.OpenId, 
          IdentityServerConstants.StandardScopes.Profile, 
          "IS_token", 
          "api" 
         }, 

         AllowOfflineAccess = true 
        }, 

以下のように構成され、私はアイデンティティサーバーでユーザーを認証してもらうとき、私はStartup.csファイル

services.AddMvc(); 

    JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); 

    services.AddAuthentication(options => 
    { 
     options.DefaultScheme = "Cookies"; 
     options.DefaultChallengeScheme = "oidc"; 
    }) 
    .AddCookie("Cookies") 
    .AddOpenIdConnect("oidc", options => 
    { 
     options.SignInScheme = "Cookies"; 
     options.Authority = "http://localhost:5000"; 
     options.RequireHttpsMetadata = false; 

     options.ClientId = "mvc"; 
     options.ClientSecret = "secret"; 
     options.ResponseType = "code id_token"; 

     options.SaveTokens = true; 
     options.GetClaimsFromUserInfoEndpoint = true; 

     options.Scope.Add("api"); 
     options.Scope.Add("offline_access"); 
    }); 

に次のコードを持っています私のセキュリティで保護されたリンクに戻って私は主張を持っていますが、IS_tokenはユーザーの主張にはありません。

マイ保護されたページのcshtml

<dl> 

    @foreach (var claim in User.Claims) 

    { 

     <dt>@claim.Type</dt> 

     <dd>@claim.Value</dd> 



    } 

    <dt>access token</dt> 
    <dd>@await ViewContext.HttpContext.GetTokenAsync("access_token")</dd> 

    <dt>refresh token</dt> 
    <dd>@await ViewContext.HttpContext.GetTokenAsync("refresh_token")</dd> 

</dl> 

このおIS_tokenが欠落している画像で見ることができるように

My secure page's output

私の保護されたページのスクリーンショットです。どうすればIS_tokenクレームを得ることができますか?

答えて

0

私のクライアントの設定でIDサーバにAlwaysIncludeUserClaimsInIdToken = trueを設定する必要があります。だから私は以下のようにクライアントを定義する必要があります。クライアント構成で

   new Client 
        { 
         ClientId = "mvc", 
         ClientName = "MVC Client", 
         AllowedGrantTypes = GrantTypes.HybridAndClientCredentials, 
         RequireConsent = false, 

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

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

         // where to redirect to after logout 
         PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" }, 

         AllowedScopes = new List<string> 
         { 
          IdentityServerConstants.StandardScopes.OpenId, 
          IdentityServerConstants.StandardScopes.Profile, 
          "IS_token", 
          "poslink" 
         }, 

         AlwaysIncludeUserClaimsInIdToken = true, 

         AllowOfflineAccess = true 
        }, 
+0

の実装によって除外されている。これはしませんIDトークンがリフレッシュトークンまたはアクセストークンではないため、助けてください。 –

0

、AddOpenIdConnectでは、あなたが追加する必要があります:options.Scope.Add("IS_token");

そうでない場合は、この範囲の請求項はGetProfileDataAsync

関連する問題