gpt4 book ai didi

c# - 如何读取已过期的 JWT token

转载 作者:行者123 更新时间:2023-12-05 05:17:49 24 4
gpt4 key购买 nike

我在我的 ASP.NET Core 2 Web API 项目中使用 JWT token

我的前端 Web 客户端发送它最初从 Web API 登录 API 获得的 JWT token ,每个请求都可以正常工作。但是,我也有一个离线客户端,它使用相同的 API,最初在线登录,然后存储 JWT 离线,仅当用户同步应用程序时才发送它,这可能是一周后。 token 可能已过期或服务器网络应用程序同时重新启动。

如果 JWT token 因离线客户端过期而失败,我仍然希望调用 Web API Controller 方法并填充 ASP.NET Identity User 对象,因为我需要用户名。我将记录此事件,但我还需要来自过期/无效 token 的用户名。目前,如果身份验证失败,则不会输入 Controller 方法,因此我添加了一个 [AllowAnonymous] 属性,但这将导致 User.Identity 在我想要用户名的地方为空

我的代码:

启动.cs

    public void ConfigureServices(IServiceCollection services)
{

services.AddAuthentication()
.AddJwtBearer(cfg =>
{
cfg.TokenValidationParameters = new TokenValidationParameters()
{
ValidIssuer = _config["Tokens:Issuer"],
ValidAudience = _config["Tokens:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"]))
};

});

当用户登录时

   private IActionResult CreateToken(ApplicationUser user, IList<string> roles)
{
var claims = new List<Claim>
{
new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(JwtRegisteredClaimNames.UniqueName, user.UserName)
};



var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"]));

var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

var token = new JwtSecurityToken(
_config["Tokens:Issuer"],
_config["Tokens:Audience"],
claims.ToArray(),
expires: DateTime.Now.AddMinutes(60),
signingCredentials: creds);

var results = new
{
token = new JwtSecurityTokenHandler().WriteToken(token),
expiration = token.ValidTo,
};

return Created("", results);

我确保在对各种 API 调用进行身份验证后传递 JWT token 。

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class MyController : Controller
{

这允许我使用以下代码为各种 API 调用捕获登录用户

 var loggedInUser = User.Identity.Name;

如果 JWT token 已过期或无效,我如何从中读取用户名?

最佳答案

如果您希望即使 token 已过期也能通过授权,您可以通过将其添加到 TokenValidationParameters 来简单地禁用生命周期验证

services.AddAuthentication()
.AddJwtBearer(cfg =>
{
cfg.TokenValidationParameters = new TokenValidationParameters()
{
ValidIssuer = _config["Tokens:Issuer"],
ValidAudience = _config["Tokens:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"]))

//Do not check the expiry of token
ValidateLifetime = false,
};

});

这将确保 token 被授权中间件视为有效,并填充 MVC 中间件中的 User.Identity 对象。

但是,此检查也会禁用您的 Web 客户端的到期检查。您将必须确定合适的客户端(不能绝对完成)并检查 Controller 中的到期时间。

更好的方法是寻找更好的设计来解决您的基本需求。

The token could have expired or the server web app restarted in the meant time

我对这个说法有点困惑。如果服务器 Web 应用程序同时重新启动并且您遇到 token 过期,我假设您正在使用临时签名 key 来签署 JWT token 。您应该改用永久签名 key 。

对于需要长期 token 的离线客户端,请查看刷新 token 。刷新 token 通常具有更长的生命周期,可用于将自身交换为更新的访问 token 。指定范围 offline_access 时,标准 oauth2.0 实现会发出刷新 token 。范围的名称应指示刷新 token 的常见用例。

您可以在您的授权服务器上将网络客户端和离线客户端配置为两个不同的客户端,从而确保只有离线客户端才能获得刷新 token 。

关于c# - 如何读取已过期的 JWT token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48707281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com