.net core Identity集成IdentityServer(2) 實現IprofileService接口在accesstoken中增長自定義claims

導讀web

1. 如何添加自定義的claims.api

 

前請提要服務器

目前咱們擁有了三個web應用.mvc

  1. localhost:40010, 驗證服務器
  2. localhost:40011, mvc客戶端, 充當webapp請求者
  3. localhost:40012, webapi, 資源, 受到驗證服務器的保護

http://localhost:40011/Home/secure登陸以後, 咱們看到了不少的claims, 其中有name, ( 來自aspnetUsers表的userName字段)app

那麼, 若是我想在accesstoken中增長其餘的字段呢, 好比, 用戶頭像url, 性別等等webapp

那麼下面咱們開始工做async

打開驗證服務器(此次只須要修改驗證服務器)的Model/ApplicationUser文件, 添加兩個字段url

image而後去對應的數據表增長兩個字段.spa

新增一個ProfileService繼承自IdentityServer4.Services.IProfileService3d

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

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

        public async Task GetProfileDataAsync(ProfileDataRequestContext context)
        {
            //得到登陸用戶的ID
            var sub = context.Subject.GetSubjectId();
            var user = await _userManager.FindByIdAsync(sub);
            //建立一個以當前用戶爲主體的憑證
            var principal = await _claimsFactory.CreateAsync(user);

            var claims = principal.Claims.ToList();
            //idsv服務器的默認claim
            claims = claims.Where(claim => context.RequestedClaimTypes.Contains(claim.Type)).ToList();

            //自定義claims區間
            claims.Add(new Claim(JwtClaimTypes.GivenName, user.UserName));
            claims.Add(new Claim("headimgurl", user.HeadImgUrl));
            claims.Add(new Claim("gender", user.Gender));

            //設置claims
            context.IssuedClaims = claims;

        } 

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

而後在Startup的註冊idsv的地方添加自定義的ProfileService的注入便可

services.AddIdentityServer()
                 .AddDeveloperSigningCredential()
                 .AddInMemoryPersistedGrants()
                 .AddInMemoryIdentityResources(AuthorizationConfig.GetIdentityResources())
                 .AddInMemoryApiResources(AuthorizationConfig.ApiResources())
                 .AddInMemoryClients(AuthorizationConfig.Clients())
                 .AddAspNetIdentity<ApplicationUser>()
                 .AddProfileService<CustomProfileService>();

運行起全部的服務

imageimage

左圖是mvc客戶端讀取的自定義claims, 右側是在mvc客戶端去請求受保護的webapi後, webapi拿到的信息

 

注意

經過ProfileService的使用, 能夠不受管制地向客戶端發送claims.

這是什麼意思如何理解呢?

在咱們的idsv的配置類中, 有IdentityResources, 有Clients, 有apiResources, 這些配置限制了客戶端能請求到的服務器資源.

在客戶端程序中的startup中, 咱們能看到一句代碼

image

這就是客戶端添加能訪問的資源的地方.  咱們將在之後的consent受權頁面去細說這方面的知識

那麼, 經過profileservice頒發的claims, 任意clients都能拿到

相關文章
相關標籤/搜索