我想访问令牌信息,例如服务中存储令牌的声明。我尝试在服务中注入AuthorizationHandlerContext
。但是api无法解析AuthorizationHandlerContext
并引发异常。还有其他方法可以访问服务内部的令牌信息吗?
答案 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();
}
就是这样。