zoukankan      html  css  js  c++  java
  • identityserver4 踩坑之不同API的ClaimsPrincipal获取用户信息的Type不一致

    在微服务项目中使用的Identityserver4,给各个API添加认证时看到下面两种方式,写法一是原始的写法,写法二是Identityserver4封装的写法,主要是在根据token获取用户信息时存在差异。

    写法一获取用户ID时的claim的type是 http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier  ,对应System.Security.Claims下的 ClaimTypes.NameIdentifier

    写法二获取用户ID时的claim的type是 sub,对应IdentityModel下的 JwtClaimTypes.Subject

    如果你获取用户信息的方法在项目中不是公用的,那你可以分开写,每个API写自己的获取信息;如果你获取用户信息的方法在项目中是公用的那就要统一认证写法了,不然就有问题,我就是这个有问题的。

    因为使用的认证方法不一样,对应的解析结果也不一样,然后有些API就报错了。

    string IdentityUrl= Configuration["IdentityUrl"];
           // 写法1
                //services.AddAuthentication("Bearer")
                //     .AddJwtBearer("Bearer", options =>
                //     {
                //         options.Authority = IdentityUrl;
                //         options.RequireHttpsMetadata = false;
                //         options.Audience = "orderapi";
                //     });
                //微服务中保持结构一致,要么多个API服务都使用上面的结构,要么统一用下面的结构,不一致会对 ClaimsPrincipal 解析不一致

           // 写法2 services.AddAuthentication(options => { options.DefaultScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme; options.DefaultAuthenticateScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme; options.DefaultSignInScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme; options.DefaultForbidScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme; }) .AddIdentityServerAuthentication(options => { options.Authority = IdentityUrl; options.ApiName = "orderapi"; options.RequireHttpsMetadata = false; });

    这是我获取用户ID的方法

    public static int GetUserId(ClaimsPrincipal User)
            {
                
                var claim = User.Claims.Where(a => a.Type == JwtClaimTypes.Subject).FirstOrDefault();
                return Convert.ToInt32(claim.Value);
            }
  • 相关阅读:
    HDFS常用命令总结
    mac 安装zmap
    使用scrapy-redis搭建分布式爬虫环境
    xpath选择兄弟节点、返回上一级和选择多个属性
    什么是套接字(Socket)
    socket编程——一个简单的例子
    python之 __getattr__、__getattr__、__getitem__、__setitem__ 使用
    如何快速转载文章
    如何让类也变成可以迭代的对象
    leecode 第二题 简单
  • 原文地址:https://www.cnblogs.com/zhanghm1/p/13093586.html
Copyright © 2011-2022 走看看