解析token中的信息 ,比如token中的userid

发布时间 2023-04-21 14:57:48作者: 追梦少年ヽ

介绍

某些情况我们需要解析token中的信息,比如token中的用户id,方便我们后面用于查询。
上一篇 我们讲了如何生成token,登录鉴权,怎么验证接口权限的。接下来我们讲讲如何获取token中的信息

基本思路:

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

新建过滤器TokenActionFilter,代码如下:

public class TokenActionFilter : 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;
    }
}

添加扩展方法GetUserId,代码如下:

public static class TokenHelper
{
    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;
        }
    }
}

然后就是获取用户id的方法:

[ApiController]
[Route("[controller]")]
public class UserController : ControllerBase
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public UserController (IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }


    /// <summary>
    /// 获取UserId
    /// </summary>
    /// <returns></returns>
    [HttpGet("GetUser")]
    [TokenActionFilter]
    [Authorize(AuthenticationSchemes = "Bearer")]
    [Authorize(Roles = "Admin")]
    public int GetUser()
    {
        var id = _httpContextAccessor.HttpContext.User.GetUserId();
        return id;
    }
}

此处需要注入IHttpContextAccessor 服务,通过IHttpContextAccessor 获取用户信息。

最后还需要在Startup,注册IHttpContextAccessor 服务和TokenActionFilter过滤器

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    services.AddScoped<TokenActionFilter>();

    // 其他服务
}

注意:

如果需要获取用户其他信息,可以自行扩展。