• .net core 在代码中使用jwt token中的用户信息


        基本思路,在过滤器中将token中的用户信息存放到context.HttpContext.User或者Thread.CurrentPrincipal中。使用时通过扩展方法或者静态方法获取用户信息。

    存放到context.HttpContext.User中

    services.AddHttpContextAccessor();
    
     public class TokenActionFilter1: ActionFilterAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext context)
            {
                var test = context.HttpContext.Request.Path;
                string bearer = context.HttpContext.Request.Headers["Authorization"].FirstOrDefault();
                if (string.IsNullOrEmpty(bearer) || !bearer.Contains("Bearer")) return;
                string[] jwt = bearer.Split(' ');
                var tokenObj = new JwtSecurityToken(jwt[1]);
    
                var claimsIdentity = new ClaimsIdentity(tokenObj.Claims);
                var claimsPrincipal = new ClaimsPrincipal(claimsIdentity);
                context.HttpContext.User = claimsPrincipal;
            }
        }
    
          public static int GetUserId(this ClaimsPrincipal claimsPrincipal)
            {
                try
                {
                    var claim = claimsPrincipal?.Claims.FirstOrDefault(c => c.Type == "UserId");
                    if (claim == null || string.IsNullOrEmpty(claim.Value))
                    {
                        return 0;
                    }
    
                    return int.Parse(claim.Value);
                }
                catch
                {
                    return 0;
                }
            }
    
            //_httpContextAccessor为IHttpContextAccessor通过构造函数注入
            [HttpGet("get1")]
            [TokenActionFilter1]
            public async Task<int> Get1()
            {
                var id = _httpContextAccessor.HttpContext.User.GetUserId();
                return id;
            }
    

    存放到Thread.CurrentPrincipal中

    public class TokenActionFilter2 : ActionFilterAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext context)
            {
                var test = context.HttpContext.Request.Path;
                string bearer = context.HttpContext.Request.Headers["Authorization"].FirstOrDefault();
                if (string.IsNullOrEmpty(bearer) || !bearer.Contains("Bearer")) return;
                string[] jwt = bearer.Split(' ');
                var tokenObj = new JwtSecurityToken(jwt[1]);
    
                var claimsIdentity = new ClaimsIdentity();
                claimsIdentity.AddClaims(tokenObj.Claims);
                var claimsPrincipal = new ClaimsPrincipal(claimsIdentity);
                Thread.CurrentPrincipal = claimsPrincipal;
            }
        }
    
         public static int GetUserId()
           {
               try
               {
                   var claimsPrincipal = Thread.CurrentPrincipal as ClaimsPrincipal;
                   var claim = claimsPrincipal?.Claims.FirstOrDefault(c => c.Type == "UserId");
                   if (claim == null || string.IsNullOrEmpty(claim.Value))
                   {
                       return 0;
                   }
                   return int.Parse(claim.Value);
               }
               catch
               {
                   return 0;
               }
           }
    
        [HttpGet]
        [TokenActionFilter2]
        public async Task<int> Get2()
        {
            var id = TokenExtension2.GetUserId();
            return id;
        }
  • 相关阅读:
    LeetCode 3-Longest Substring Without Repeating Characters
    LeetCode 2-Add Two Numbers
    LeeCode 1-Two Sum
    Python中Lambda, filter, reduce and map 的区别
    解决Eclipse10配置Pydev不成功的问题
    Pythonxy下载链接
    546C. Soldier and Cards
    欧拉工程第58题:Spiral primes
    欧拉工程第57题:Square root convergents
    Linux编辑器vim键盘详解
  • 原文地址:https://www.cnblogs.com/KQNLL/p/13736798.html
Copyright © 2020-2023  润新知