【问题标题】:How to access Token data from controller method?如何从控制器方法访问 Token 数据?
【发布时间】:2020-03-12 04:54:38
【问题描述】:

如何访问从客户端传递到我的控制器方法的 jwt 令牌数据?我需要令牌中的 userId,以便通过我的数据存储库层中的其他方法调用访问有关用户的更多数据。

我已经能够使用硬编码的令牌字符串来做到这一点,但不能使用从客户端传递的令牌。我将如何编写此控制器方法以将 jwt 令牌作为输入...或从此控制器方法中访问令牌字符串,从而检索我要查找的数据?

我如何将令牌实际传递到我的控制器方法中?

[HttpGet("tokenz")]
        public ApplicationUser ParseToken()
        {
            var stringToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJXaWxsQGdtYWlsLmNvbSIsImp0aSI6IjMxMWM3ZGU5LTcxMDctNGI4MC1hMzViLTA4NjJlYTE1MjZjOCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWVpZGVudGlmaWVyIjoiYzE3ZTEyNWItYmE0NC00N2MxLTg2NzUtOTc2ZmJlZDRlMTEyIiwiZXhwIjoxNTc2NDU0NDYxLCJpc3MiOiJodHRwczovL2xvY2FsaG9zdDo1NzA5NiIsImF1ZCI6Imh0dHBzOi8vbG9jYWxob3N0OjU3MDk2In0.VtsMgq7fc17M6y8kKHQRw3vO3M7aSrQgF62gw0-mXWg";

            var handler = new JwtSecurityTokenHandler();

            var tokenS = handler.ReadToken(stringToken) as JwtSecurityToken;

            var tokenSubject = tokenS.Subject;

            var appUser = _unitofWork.User.GetUserFromSubject(tokenSubject);

            return appUser;
        }

这没有奏效:

JWT token data access from action/controller layer

或者这个:

Retrieving access token in controller

太好了……

Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
        [HttpPost("moretokenz")]
        public JwtSecurityToken MoreToken(string strToken)
        {
            //Where would strToken come from?
            return new JwtSecurityTokenHandler().ReadJwtToken(strToken);
        }

【问题讨论】:

    标签: c# asp.net-core asp.net-core-webapi identity jwt-auth


    【解决方案1】:

    试试这个:

    [HttpGet]
    [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
    public async Task<ActionResult<string>> Get()
    {
        var token = await HttpContext.GetTokenAsync("access_token");
        return token;
    }
    

    结果:

    【讨论】:

    • 你用什么程序做这些动画?展示事物运作方式的绝佳方式。
    【解决方案2】:

    您只需要在 JWT Token 的负载中获取声明。 访问https://jwt.io/introduction/

    var securityTokenHandler = new JwtSecurityTokenHandler();
            if (securityTokenHandler.CanReadToken(yourStringAccessToken))
            {
                var decriptedToken = securityTokenHandler.ReadJwtToken(yourStringAccessToken);
                var claims = decriptedToken.Claims;
                //At this point you can get the claims in the token, in the example I am getting the expiration date claims
                //this step depends of the claims included at the moment of the token is generated
                //and what you are trying to accomplish
                var expiredClaimValue = claims.Where(c => c.Type == "exp").FirstOrDefault().Value;
            }
    

    【讨论】:

    • 当我拥有字符串访问令牌时,我可以访问数据本身,但我不知道如何首先获取“yourStringAccessToken”......我只是希望客户端传递字符串对我有价值访问令牌? @QbaCid313
    • 是的,您应该在 HTTP 请求的标头中从客户端发送访问令牌。因此,假设您在 API 端点中接收来自客户端的请求,您应该能够在服务器端访问 Http Context 对象(HttpContext);在此对象中,您可以访问属性 (Request.Headers.HeaderAuthorization)。如果您在客户端上使用 Bearer 授权,则在此对象中您有类似于“Bearer ”的内容。您可以从中获取访问令牌。
    • 你在代码中有这样的例子吗?这是我一直在寻找但实际上无法找到的东西。每个示例基本上都是从已经存在的字符串访问令牌开始的。 (它是从哪里来的,你是怎么得到的,举个例子。)
    • 我只需要一开始就实际检索令牌的代码。 yourStringAccessToken 是在哪里初始化的,它在哪里分配给@QbaCid313?
    • 如果您有特定的代码/问题要分享,我会尽力帮助您。通常,您从身份验证服务器获取访问令牌,并且可以将该令牌包含在您的 Http 请求中。如:httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
    猜你喜欢
    • 2014-01-11
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    相关资源
    最近更新 更多