如何从控制器方法中访问令牌数据?

8

如何访问从客户端传递到我的控制器方法的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令牌数据

或者这个:

在控制器中检索访问令牌

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

10

试试这个:

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

结果: 输入图像描述

3
你用什么程序制作这些动画?这是展示事物运作的绝佳方式。 - Rebecca
1
你是怎么知道使用字符串“access_token”的? - christiaantober

3
您只需要获取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 - Wallen
是的,您应该在HTTP请求的标头中从客户端发送访问令牌。因此,假设您正在从API端点接收来自客户端的请求,则应能够在服务器端访问Http上下文对象(HttpContext);在此对象内部,您可以访问属性(Request.Headers.HeaderAuthorization)。如果您在客户端使用Bearer授权,则在此对象中,您将拥有类似于“Bearer <access-token>”的内容。您可以从中获取访问令牌。 - qbacid313
你有这方面的代码示例吗?这就是我一直在寻找但实际上找不到的东西。每个示例基本上都已经有了字符串访问令牌(它来自哪里,你是如何获得它的,在示例中)。 - Wallen
我只需要实际检索令牌的代码。yourStringAccessToken 在哪里初始化并分配给 @QbaCid313? - Wallen
如果您有特定的代码/问题需要分享,我会尽力帮助您解决。通常,您可以从身份验证服务器获取访问令牌,并将该令牌包含在您的 Http 请求中,如下所示:httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); - qbacid313

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接