【问题标题】:How to get JWT token information in a Service in asp.net core api?如何在 asp.net core api 的服务中获取 JWT 令牌信息?
【发布时间】:2020-07-03 13:56:36
【问题描述】:

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

【问题讨论】:

  • 你用的是什么asp.net核心版本?你的创业班有什么?如果您提供此信息会更好。否则,请尝试 HttpContext.Features.Get(),因为您将通过此获得 ClaimsPrincipal 来检查声明。
  • 您是否使用身份服务器 4 来生成令牌..?

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


【解决方案1】:

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

注册IHttpContextAccessorDI

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      第 1 步。创建模型

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

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

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

      第 3 步。创建一个易于访问的扩展函数

         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();
          }
      

      就是这样。

      【讨论】:

        猜你喜欢
        • 2019-08-03
        • 2018-06-16
        • 2021-02-20
        • 1970-01-01
        • 2021-10-22
        • 2017-10-12
        • 1970-01-01
        • 2020-11-03
        • 2018-11-05
        相关资源
        最近更新 更多