【发布时间】:2023-03-15 08:58:01
【问题描述】:
我的客户正在发送带有一些请求的 jwt 令牌。几乎所有请求都在使用 [Authorize] 属性的 Web api 控制器。有了这个,我确信我的 jwt 令牌得到了正确的验证,但对于某些端点来说,真的只是想获取 JWT 令牌并获取子值。我通过使用这种扩展方法来做到这一点:
public static class HttpContextAccessorExtensions
{
public static string GetUserIdFromToken(this IHttpContextAccessor httpContextAccessor)
{
if (httpContextAccessor == null)
{
throw new ArgumentNullException(nameof(httpContextAccessor));
}
var context = httpContextAccessor.HttpContext;
string userId = null;
if (httpContextAccessor != null)
{
if (context != null)
{
var request = context.Request;
if (request != null)
{
request.Headers.TryGetValue("Authorization", out var bearer);
if (bearer.Any())
{
string t = bearer[0].Split(" ")[1];
var handler = new JwtSecurityTokenHandler();
var token = handler.ReadToken(t) as JwtSecurityToken;
var utcNow = DateTime.UtcNow;
if (utcNow >= token.ValidFrom &&
utcNow <= token.ValidTo)
{
userId = token.Claims.FirstOrDefault(_ => _.Type.Equals("sub")).Value;
}
else
{
userId = String.Empty;
}
}
}
}
}
return userId;
}
}
我唯一的问题是 jwt 令牌没有经过验证,所以我猜测“坏人”可能只是与有效的日期时间混在一起,并继续延长令牌的生命周期。如果我在这方面错了,请纠正我。
我想知道的是:有没有办法让我验证令牌?我知道 JwtSecurityTokenHandler 可以调用“ValidateToken”,但是这个方法需要一个签名密钥,我真的不知道如何得到这个。我使用 IdentityServer 4 来生成令牌。是否有一些简单的方法可以将密钥注入 IoC 以便我可以获取它,或者是否有一种简单的方法可以验证令牌,但我不知道?
感谢任何帮助
【问题讨论】:
-
为什么采用这种方法?从上下文中读取 sub 声明不是更容易吗?
-
我不知道我可以做 [AllowAnonymous] 和 [Authorize]。如果它是授权用户,我只是在检查 IsAuthenticated 之后从身份中获取子项 :) 我看不到树木的福雷斯特。
标签: asp.net-core jwt asp.net-identity identityserver4