处理先前的jwt令牌,其中新的jwt令牌也针对相同的凭证和安全性生成

时间:2019-01-26 10:34:18

标签: .net .net-core jwt asp.net-core-2.2

我在dot net core 2.2 Web API中有应用程序 有jwt身份验证,也有过期日期

在这里,我对此jwt令牌和webapi令牌库的安全性有疑问

1:在这里,我的以前的jwt令牌具有相同的重新登录问题(对于同一用户) 这里的令牌是不同的,但是前一个令牌有效期至其到期日 所以我想知道如何处理先前仍然有效的令牌,但是为相同的creandiantial生成了一个新令牌

2:要验证我的令牌来自受信任的源(这里我还在我的startup.cs中添加了CROS)。因此,还有其他更安全的方法来验证令牌命中来自受信任/验证(用户身份验证令牌)地方

3:我该怎么做才能确保令牌安全(用户到服务器以及服务器到用户端),例如使用https SSL认证

我需要一些建议以使安全的DOTNET CORE webapi具有最佳的安全性

JWT生成代码

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

        var token = new JwtSecurityToken(
            _configuration["Jwt:Issuer"],
          _configuration["Jwt:Issuer"],
          new List<Claim> {
          new Claim(ClaimTypes.NameIdentifier , userId.ToString())
          },
          expires: GetExpireDate(),
          signingCredentials: creds);

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

1 个答案:

答案 0 :(得分:3)

一旦生成了JWT,它就会一直有效,直到到期日到期或签名失效为止。这是令牌可以“过期”的唯一方法。生成多个令牌是完全有效的。但是它们的寿命应该总是很短(几分钟),因为如果它们受到损害,任何人都可以使用。

处理这种情况的方法是使用刷新令牌。它们使您可以在服务器上存储一个值,该值可用于启用/禁用特定用户的令牌的重新发行。

有关更完整的说明和示例,请查看以下页面:http://jasonwatmore.com/post/2018/08/14/aspnet-core-21-jwt-authentication-tutorial-with-example-api

第2点: 通过AuthHeader传入的所有令牌都被考虑进行验证。 NetCore中的验证会根据您在配置JWT时应用的配置自动进行。

因此,您的令牌验证的配置如下:

public void ConfigureServices(IServiceCollection services)
{
     // configure jwt authentication
     var appSettings = appSettingsSection.Get<AppSettings>();
     var key = Encoding.ASCII.GetBytes(appSettings.Secret);
     services.AddAuthentication(x =>
     {
         x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
         x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
     })
     .AddJwtBearer(x =>
     {
         x.RequireHttpsMetadata = false;
         x.SaveToken = true;
         x.TokenValidationParameters = new TokenValidationParameters
         {
             ValidateIssuerSigningKey = true,
             IssuerSigningKey = new SymmetricSecurityKey(key),
             ValidateIssuer = false,
             ValidateAudience = false
         };
     });
}

在您的应用程序启动中:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseCors(x => x
       .AllowAnyOrigin()
       .AllowAnyMethod()
       .AllowAnyHeader());

    **app.UseAuthentication();**
    app.UseMvc();
}

最后,您需要像这样将[Authorize]属性应用于您的控制器:

**[Authorize]**
[ApiController]
[Route("[controller]")]
public class UsersController : ControllerBase
{
}

基本思想是,您可以在“登录”方法中“创建”令牌,然后将其返回给调用方-然后将相同的令牌从客户端传递回您的服务。假设使用与设置ConfigureServices方法相同的设置来创建令牌,则中间件将读取该令牌并将其应用于HttpContext上的User属性,如下所示:

public Controller(IHttpContextAccessor httpContextAccessor)
{
    var userId = HttpContextAccessor.HttpContext.User;
}

如果令牌被拒绝,则HttpStatus代码401将自动发送回调用者,并显示消息“未授权”

第3点: 是的,真正正确地保护JWT令牌本身的最佳方法(也许是唯一方法)是使用HTTPS。令牌的“签名”部分不会保护它或防止其被欺诈使用;它只是提供一种手段来确保它未被篡改