首页 > 其他分享 >解析token中的信息 ,比如token中的userid

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

时间:2023-04-21 15:01:35浏览次数:57  
标签:IHttpContextAccessor userid token context var HttpContext 解析 public

介绍

某些情况我们需要解析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>();

    // 其他服务
}

注意:

一定要记得在Startup中注册IHttpContextAccessor

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

标签:IHttpContextAccessor,userid,token,context,var,HttpContext,解析,public
From: https://www.cnblogs.com/l-monstar/p/17340361.html

相关文章

  • 数据结构 ---> 二叉树 -->堆之解析_01
    老友们好!本期将对堆之构建进行解说!相信,初学此章节的老友!!或多或少,对前一期的部分代码,有所困惑!说真的,堆的有些内容理解起来还是挺困难的!好了,废话不多讲!开始本期的解析之旅吧!希望大家都能有所收获!!下面,先看一组,上一期的图示:>那么该如何操作,才能取得前几名的数值呢?针对这点,部分老友......
  • xHook 源码解析
    xHook是爱奇艺开源的一个PLTHook框架项目地址:https://github.com/iqiyi/xHook该项目实现了PTL/GOTHookPTLhook的本质是修改内存中,PLT表对应的值,来实现跳转到自定义函数的.got和.plt它们的具体含义。TheGlobalOffsetTable(GOT)。简单来说就是在数据段的地址表......
  • git执行push操作时报错:remote: xxx: Incorrect username or password (access token)
    问题:最近用gitpush项目到gitee时报错,提示信息如下:remote:xxx:Incorrectusernameorpassword(accesstoken)fatal:Authenticationfailedfor'https://gitee.com/xxx/xxx.git/'想了一下,原来是几天前我把gitee的密码给改了,所以原先git存留的密码就失效了解决方案清......
  • 智能简历解析系统第一次讨论
    智能简历解析系统第一次讨论_哔哩哔哩_bilibili......
  • 管理员登录解析
    控制器文件:admins/controllers/login.gopackagecontrollersimport("github.com/gin-gonic/gin""github.com/gorilla/sessions""goadmin/common""goadmin/modes""net/http""os"......
  • SpringMvc 视图解析
    重定向forward前缀若要返回/WEB-INF/pages/success.jsp,则直接return"success";即可。若要返回webapp下的helloworld.jsp页面:相对路径../../hello,需return"../../helloworld";forward前缀,转发一个页面,不会进行拼串。需return"forward:/helloworld.jsp";格式:forward:转......
  • 火山引擎 DataLeap 下 Notebook 系列文章二:技术路线解析
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群在Jupyter的生态下,除了Notebook本身,火山引擎DataLeap研发团队还注意到了很多其他组件。彼时,JupyterLab正在逐渐取代传统的JupyterNotebook界面,成为新的标准。JupyterHub使用广泛,是......
  • HTML实现文件上传下载功能实例解析
    ​ 前言文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上传到一半中断后,继续上传却只能重头开始上传,这种让人不爽的体验。那有没有......
  • 论文解析 -- A Survey of AIOps Methods for Failure Management
    此篇Survey是ASystematicMappingStudyinAIOps的后续研究对于AIOPS中占比较高的FailureManagement进行进一步的研究   Comparedtotraditionalapproaches,AIOpsis:•fast,becauseitreactsindependentlyandautomaticallytoreal-timeproblems,with......
  • Spring源码系列:核心概念解析
    前言本文旨在为读者解析Spring源码中的关键类,以便读者在深入阅读源码时,能够了解关键类的作用和用途。在阅读Spring源码时,经常会遇到一些不熟悉的概念,了解关键类的作用可以帮助读者更好地理解这些概念。BeanDefinitionBeanDefinition是Spring框架中的一个重要概念,它定义了一个Be......