簡體   English   中英

如何在 asp.net 核心 api 的服務中獲取 JWT 令牌信息?

[英]How to get JWT token information in a Service in asp.net core api?

我想訪問令牌信息,例如服務中存儲令牌的聲明。 我嘗試在我的服務中注入AuthorizationHandlerContext 但是 api 無法解析AuthorizationHandlerContext並拋出異常。 有沒有其他方法可以訪問服務內的令牌信息?

您可以將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

在 OnAuthorization(IAuthorizationFilter) 操作上嘗試此代碼:

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

由於您要訪問 JWT 令牌信息,因此更結構化的方法是,

步驟 1. 創建 Model

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

步驟 2. 在您授權的 Controller 方法中使用此 model。 喜歡:

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

步驟 3. 創建一個擴展 function 以便於訪問

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

第 4 步。只需訪問用戶聲明和其他 JWT 屬性,例如,

    public Task<object> MakeChanges(AuthorizedUser user, RequestDto dto){
          var userId = user.Claims.GetUserId();
    }

而已。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM