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

How to access Token data from controller method?

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

这没有用:

或者这样:

太...

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

您只需要在 JWT 令牌的负载中获取声明。 访问 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;
        }

试试这个:

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

结果: