ASP.NET CORE 解析JWT token中的信息 ,比如token中的userid
介绍
某些情况我们需要解析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 获取用户信息。
注册IHttpContextAccessor && TokenActionFilter
最后还需要在Startup,注册IHttpContextAccessor 服务和TokenActionFilter过滤器
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddScoped<TokenActionFilter>();
// 其他服务
}
注意:
一定要记得在Startup
中注册IHttpContextAccessor
。
如果需要获取用户其他信息,可以自行扩展。