.Net 身份承载多个到期时间

问题描述 投票:0回答:1

我正在使用 Identity 项目开发 .Net WebApi,并且正在使用承载身份验证。我有两种类型的客户。移动和网络项目。他们需要有不同的令牌到期时间。我有不同的 API 用于移动和网络登录。

承载身份验证配置:

builder.Services
       .AddOptions<BearerTokenOptions>(IdentityConstants.BearerScheme)
       .Configure(options =>
                  {
                      options.BearerTokenExpiration = TimeSpan.FromHours(24);
                  });

例如,移动应用程序令牌应在 14 天后到期,Web 令牌应在 1 天后到期。但我只能给出一种方案选择。

我尝试更改控制器中的不记名令牌选项,但没有任何改变:

_bearerTokenOptions.CurrentValue.BearerTokenExpiration = TimeSpan.FromHours(1);
.net asp.net-core identity bearer-token
1个回答
0
投票

您可以通过创建两个不同的 JwtBearer 身份验证方案来实现此目的,每个方案都有自己的令牌过期时间。然后您可以根据客户端类型(移动或 Web)自定义令牌生命周期。

例如:

在Program.cs中配置jwt认证

builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer("WebScheme", options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        // Your token validation parameters
    };
    options.Events = new JwtBearerEvents
    {
        OnTokenValidated = context =>
        {
            // Additional logic when token is validated
            return Task.CompletedTask;
        }
    };
    options.SaveToken = true;
})
.AddJwtBearer("MobileScheme", options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        // Your token validation parameters
    };
    options.Events = new JwtBearerEvents
    {
        OnTokenValidated = context =>
        {
            // Additional logic when token is validated
            return Task.CompletedTask;
        }
    };
    options.SaveToken = true;
});

然后配置更改时间的生成令牌方法

private string GenerateJwtToken(int expirationInDays)
{
    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

    var claims = new[]
    {
        new Claim(JwtRegisteredClaimNames.Sub, "user_id"),
        //...
    };

    var token = new JwtSecurityToken(
        _configuration["Jwt:Issuer"],
        _configuration["Jwt:Audience"],
        claims,
        expires: DateTime.Now.AddDays(expirationInDays),    //difference here
        signingCredentials: creds);

    return new JwtSecurityTokenHandler().WriteToken(token);
}

针对不同的客户端调用此方法

[HttpPost("login-web")]
public IActionResult LoginWeb([FromBody] LoginModel model)
{
    // Perform your user authentication here

    var token = GenerateJwtToken(1); // 1 day for web
    return Ok(new { Token = token });
}

[HttpPost("login-mobile")]
public IActionResult LoginMobile([FromBody] LoginModel model)
{
    // Perform your user authentication here

    var token = GenerateJwtToken(14); // 14 days for mobile
    return Ok(new { Token = token });
}

您还可以尝试将包含客户端标识符(如 deviceid 或 ip)的 jwt 令牌存储在数据库中。

© www.soinside.com 2019 - 2024. All rights reserved.