如何在ASP.NET Core API的服务中获取JWT令牌信息?

时间:2020-07-03 13:56:36

标签: c# asp.net asp.net-core .net-core

我想访问令牌信息,例如服务中存储令牌的声明。我尝试在服务中注入AuthorizationHandlerContext。但是api无法解析AuthorizationHandlerContext并引发异常。还有其他方法可以访问服务内部的令牌信息吗?

3 个答案:

答案 0 :(得分:1)

您可以向服务中注入IHttpContextAccessor,然后像这样从 JWT 获取所有用户声明或用户信息。

IHttpContextAccessor注册到 DI

services.AddHttpContextAccessor();
private readonly IHttpContextAccessor _httpContextAccessor;
public YourService(IHttpContextAccessor httpContextAccessor)
{
    _httpContextAccessor = httpContextAccessor;
}
var username =_httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier)?.Value

答案 1 :(得分:0)

在OnAuthorization(IAuthorizationFilter)操作上尝试以下代码:

  string email=context.HttpContext.User.Claims.FirstOrDefault(c => c.Type == "email").Value;

答案 2 :(得分:0)

由于您要访问JWT令牌信息,因此将采用一种更为结构化的方法,

第1步:创建模型

Sugar.extend();
const now = Sugar.Date.create(); // as of this posting should be '7/3/2020'
const startDate = Sugar.Date.create('7/3/2020');
const endDate = Sugar.Date.create('7/5/2020');

alert(now.isBetween(startDate, endDate));  // returns "true"

步骤2。在授权的Controller方法中使用此模型。喜欢:

    public class AuthorizedUser
    {
        public ClaimsPrincipal Claims { get; set; }        
    }

第3步。创建扩展功能以方便访问

    [Authorized]
    [HttpPost]
    public async Task<IActionResult> Modify([FromForm] RequestDto dto)
    {
        var user = new AuthorizedUser()
        {
            Claims = User
        };
        return Ok(await _service.MakeChanges(user, dto));
    }

第4步。只需访问用户声明和其他JWT属性,如

   public static string GetUserId(this ClaimsPrincipal claims)
   {
        return claims.Claims.Where(c => c.Type == "sub")
            .Select(c => c.Value).SingleOrDefault();
   }

就是这样。