首页 > 其他分享 >abp 自定义token

abp 自定义token

时间:2023-02-06 17:14:00浏览次数:63  
标签:AddIfNotContains 自定义 userManager abp JwtClaimTypes token new using identity

如何删除访问令牌中未使用的声明?

  • ABP框架版本: v5.2.2

  • 用户界面类型:角度

  • 数据库提供者:EF Core

  • 分层(MVC)或身份服务器分离(角度):是/否

  • 异常消息和堆栈跟踪:

  • 重现问题的步骤:"

嗨,我想删除访问令牌中的“ unique_name ”和“ preferred_username ”声明,但不知道该怎么做,我试图删除 Api Resources 中的所有声明,但这些声明仍然存在。

图片.png

知道如何删除它吗?

 

  • maliming 创建 4月之前 支持团队

    你好

    您可以添加一个新IAbpClaimsPrincipalContributor的以从中删除一些声明context.ClaimsPrincipal.Identities.FirstOrDefault()

    https://docs.abp.io/en/abp/latest/Authorization#claims-principal-factory

     
  • 0
    nhontran 创建 4月之前  

    嗨@maliming,我已经尝试过但它不起作用,索赔列表中未返回索赔:

    public class CustomClaimsPrincipalContributor : IAbpClaimsPrincipalContributor, ITransientDependency
        {
            public Task ContributeAsync(AbpClaimsPrincipalContributorContext context)
            {
                var identity = context.ClaimsPrincipal.Identities.FirstOrDefault();
                if (identity != null)
                {
                    // these 2 claims not found
                    var uniqueNameClaim = identity.FindFirst("unique_name");
                    var preferredUserNameClaim = identity.FindFirst("preferred_username");
                    identity.TryRemoveClaim(uniqueNameClaim);
                    identity.TryRemoveClaim(preferredUserNameClaim);
                }
                return Task.CompletedTask;
            }
        }

     

     
  • 0
    maliming 创建 4月之前 支持团队

    图片.png

     
  • 0
    nhontran 创建 4月之前  

    嗨@maliming,你检查的是哪个版本?它不适用于 5.2.2 版。

    你能查一下并告诉我吗?谢谢。

     
  • 0
    maliming 创建 4月之前 支持团队

    你好

    它不适用于 5.2.2 版。

    请创建一个 5.2.2 项目并重现问题,然后与我分享。谢谢

    [email protected]

     
  • 0
    maliming 创建 4月之前 支持团队

    你好

    public override void ConfigureServices(ServiceConfigurationContext context)
    {
    context.Services.Replace(ServiceDescriptor.Transient<IUserClaimsPrincipalFactory<IdentityUser>, MyUserClaimsFactory<IdentityUser>>());
    }
    using System;
    using System.IdentityModel.Tokens.Jwt;
    using System.Linq;
    using System.Security.Claims;
    using System.Security.Principal;
    using System.Threading.Tasks;
    using IdentityModel;
    using Microsoft.AspNetCore.Identity;
    using Volo.Abp.DependencyInjection;
    using Volo.Abp.Security.Claims;
    using IdentityUser = Volo.Abp.Identity.IdentityUser;
    
    
    namespace AbpApplicationTemplate;
    
    public class MyUserClaimsFactory<TUser> : IUserClaimsPrincipalFactory<TUser>
        where TUser : class
    {
        private readonly IObjectAccessor<IUserClaimsPrincipalFactory<TUser>> _inner;
        private readonly UserManager<TUser> _userManager;
        private readonly ICurrentPrincipalAccessor _currentPrincipalAccessor;
        private readonly IAbpClaimsPrincipalFactory _abpClaimsPrincipalFactory;
    
        public MyUserClaimsFactory(IObjectAccessor<IUserClaimsPrincipalFactory<TUser>> inner,
            UserManager<TUser> userManager, ICurrentPrincipalAccessor currentPrincipalAccessor, IAbpClaimsPrincipalFactory abpClaimsPrincipalFactory)
        {
            _inner = inner;
            _userManager = userManager;
            _currentPrincipalAccessor = currentPrincipalAccessor;
            _abpClaimsPrincipalFactory = abpClaimsPrincipalFactory;
        }
    
        public async Task<ClaimsPrincipal> CreateAsync(TUser user)
        {
            var principal = await _inner.Value.CreateAsync(user);
            var identity = principal.Identities.First();
    
            if (!identity.HasClaim(x => x.Type == JwtClaimTypes.Subject))
            {
                var sub = await _userManager.GetUserIdAsync(user);
                identity.AddIfNotContains(new Claim(JwtClaimTypes.Subject, sub));
            }
    
            var username = await _userManager.GetUserNameAsync(user);
            var usernameClaim = identity.FindFirst(claim =>
                claim.Type == _userManager.Options.ClaimsIdentity.UserNameClaimType && claim.Value == username);
            if (usernameClaim != null)
            {
                identity.RemoveClaim(usernameClaim);
                identity.AddIfNotContains(new Claim(JwtClaimTypes.PreferredUserName, username));
    
                //https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/1627
                //https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/05e02b5e0383be40e45c667c12f6667d38e33fcc/src/System.IdentityModel.Tokens.Jwt/ClaimTypeMapping.cs#L52
                identity.AddIfNotContains(new Claim(JwtRegisteredClaimNames.UniqueName, username));
            }
    
            if (!identity.HasClaim(x => x.Type == JwtClaimTypes.Name))
            {
                identity.AddIfNotContains(new Claim(JwtClaimTypes.Name, username));
            }
    
            if (_userManager.SupportsUserEmail)
            {
                var email = await _userManager.GetEmailAsync(user);
                if (!string.IsNullOrWhiteSpace(email))
                {
                    identity.AddIfNotContains(new Claim(JwtClaimTypes.Email, email));
                    identity.AddIfNotContains(new Claim(JwtClaimTypes.EmailVerified,
                        await _userManager.IsEmailConfirmedAsync(user) ? "true" : "false", ClaimValueTypes.Boolean));
                }
            }
    
            if (_userManager.SupportsUserPhoneNumber)
            {
                var phoneNumber = await _userManager.GetPhoneNumberAsync(user);
                if (!string.IsNullOrWhiteSpace(phoneNumber))
                {
                    identity.AddIfNotContains(new Claim(JwtClaimTypes.PhoneNumber, phoneNumber));
                    identity.AddIfNotContains(new Claim(JwtClaimTypes.PhoneNumberVerified,
                        await _userManager.IsPhoneNumberConfirmedAsync(user) ? "true" : "false",
                        ClaimValueTypes.Boolean));
                }
            }
    
            if (user is IdentityUser identityUser)
            {
                if (!identityUser.Name.IsNullOrEmpty())
                {
                    identity.AddIfNotContains(new Claim(JwtClaimTypes.GivenName, identityUser.Name));
                }
    
                if (!identityUser.Surname.IsNullOrEmpty())
                {
                    identity.AddIfNotContains(new Claim(JwtClaimTypes.FamilyName, identityUser.Surname));
                }
            }
    
            using (_currentPrincipalAccessor.Change(identity))
            {
                await _abpClaimsPrincipalFactory.CreateAsync(principal);
            }
    
            return principal;
        }
    }

     

     

 

转自 https://support.abp.io/QA/Questions/3858/How-to-remove-the-unused-claims-in-access-token

标签:AddIfNotContains,自定义,userManager,abp,JwtClaimTypes,token,new,using,identity
From: https://www.cnblogs.com/wl-blog/p/17095944.html

相关文章

  • 一文搞懂工作流审批(Java+activiti)快速开发+自定义工作流配置
    前言activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。一、项目形式springboot......
  • MySQL5.x msi自定义安装教程_也适用于8.x版本
    下载都会就跳过1、打开安装程序2、选择自定义安装方式3、选择要安装的MySQL版本4、承接3选择自定义安装路径和数据存储路径5、检查文件完整性6、无脑Next7、配置项作为服务......
  • 【微信小程序-原生开发】实用教程07 - Grid 宫格导航,详情页,侧边导航(含自定义页面顶部
    开始前,请先完成成员页的开发,详见【微信小程序-原生开发】实用教程06-轮播图、分类页签tab、成员列表(含Tdesign升级,切换调试基础库,设置全局样式,配置组件按需注入,添加图片......
  • vue cli脚手架 - 删除配置好的自定义预配置
    在系统盘用户根目录里找到 .vuerc文件  编辑文本,删除不要的配置即可  删掉后,我就剩下一个了 ......
  • PHP实现JWT的Token登录认证
    1、Jwt简介JSONWEBToken(缩写JWT),是目前最流行的跨域认证解决方案。session登录认证方案:用户从客户端传递用户名、密码等信息,服务端认证后将信息存储在session中,将sessi......
  • Cesium通过自定义着色器实现倾斜压平
    实现原理PS:使用customShader实现倾斜压平,没改源码获取模型的顶点数据后转以模型中心点的局部坐标系下(这里把所有点数据都在统一的局部坐标系下处理)把绘制的范围转为模......
  • MMLab中自定义模块初始化方法
    这方面好像介绍的少,看了下基本原理,下面介绍下如何在搭载权重的模型中加入自定义模块时方便的进行初始化。MMLab的逻辑时对每个部分进行初始化,若此部分定义了初始化方法为P......
  • tp5.x 自定义错误页
    thinkphp5自定义错误页面,话不多说,直接上干货1.关闭所有app_debug,即把 'app_debug'=>true修改为'app_debug'=>false2.在config.php(tp5.1config目录app.php)中配......
  • qtableview及自定义model的使用,对比qtablewidget性能及内存优化(转)
    以前一直使用qtableiwdget,最近有时间来研究下qtableview,才知道,qtableview和自定义model,比qtablewidget的性能啊,及占用内存啊,优化太多了。以前我使用qtablewidget是进行动态......
  • zabbix自定义监控项
    有时候当我们监控的项目在zabbix预定义的key中没有定义时,这时候我们可以通过编写zabbix的用户参数的方法来监控我们要求的项目item。形象一点说zabbix代理端配置文件中的U......