zoukankan      html  css  js  c++  java
  • .net core Identity集成IdentityServer(2) 实现IprofileService接口在accesstoken中增加自定义claims

    导读

    1. 如何添加自定义的claims.

    前请提要

    目前我们拥有了三个web应用.

    1. localhost:40010, 验证服务器
    2. localhost:40011, mvc客户端, 充当webapp请求者
    3. localhost:40012, webapi, 资源, 受到验证服务器的保护

    http://localhost:40011/Home/secure登录之后, 我们看到了很多的claims, 其中有name, ( 来自aspnetUsers表的userName字段)

    那么, 如果我想在accesstoken中增加其他的字段呢, 比如, 用户头像url, 性别等等

    那么下面我们开始工作

    打开验证服务器(这次只需要修改验证服务器)的Model/ApplicationUser文件, 添加两个字段

    image然后去对应的数据表增加两个字段.

    新增一个ProfileService继承自IdentityServer4.Services.IProfileService

    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都能拿到

  • 相关阅读:
    很简单的企业管理器我写程序的方式,几个自定义控件。
    当OO遇到了持久化?!
    [自定义服务器控件] 第一步:文本框。
    [面向过程——老酒换新瓶] (一)开篇:是面向过程还是面向对象?
    个人理财小助手 —— 设计思路、功能说明
    《Head First 设计模式》 终于出中文版了。
    其实添加数据也可以这样简单——表单的第一步抽象(针对数据访问层)《怪怪设计论: 抽象无处不在 》有感
    基类、接口的应用——表单控件:一次添加、修改一条记录,一次修改多条记录。(上)
    其实添加数据也可以这样简单——表单的第三步抽象(针对UI及后置代码)
    转帖:客户端表单通用验证checkForm(oForm) js版
  • 原文地址:https://www.cnblogs.com/jianjialin/p/9310785.html
Copyright © 2011-2022 走看看