.net 处理以前的jwt令牌,其中新的jwt令牌也为相同的凭据和安全性生成

.net 处理以前的jwt令牌,其中新的jwt令牌也为相同的凭据和安全性生成,.net,.net-core,jwt,asp.net-core-2.2,.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中添加了CRO)。因此有更安全的方法来验证令牌命中是否来自可

我在dot net core 2.2 web API中有应用程序 有jwt认证,还有到期日期

这里我对这个jwt令牌和webapi令牌库的安全性有一些疑问

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

2:想验证我的令牌是否来自可信来源(这里我还在我的startup.cs中添加了CRO)。因此有更安全的方法来验证令牌命中是否来自可信/可变(用户身份验证令牌)位置

3:我应该怎样做才能使我的令牌在(用户到服务器和服务器到用户端)上安全,比如使用https SSL认证

我需要一些建议,使安全的DOTNET核心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);
    }
stringbuildtoken(int-userId)
{
var key=new-SymmetricSecurityKey(Encoding.UTF8.GetBytes(_-configuration[“Jwt:key”]);
var creds=新的签名凭证(key,SecurityAlgorithms.HmacSha256);
var token=新的JwtSecurityToken(
_配置[“Jwt:Issuer”],
_配置[“Jwt:Issuer”],
新名单{
新声明(ClaimTypes.NameIdentifier,userId.ToString())
},
expires:GetExpireDate(),
签署证书:信誉);
返回新的JwtSecurityTokenHandler().WriteToken(令牌);
}

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

处理此场景的方法是使用刷新令牌。它们允许您在服务器上存储一个值,您可以使用该值为特定用户启用/禁用令牌的进一步重新颁发

有关更完整的解释和示例,请参阅本页:

第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
         };
     });
}
最后,您需要对控制器应用[Authorize]属性,如下所示:

**[Authorize]**
[ApiController]
[Route("[controller]")]
public class UsersController : ControllerBase
{
}
基本思想是在“Login”方法中“创建”令牌并将其返回给调用者,然后从客户端将相同的令牌传递回服务。如果使用与设置ConfigureServices方法相同的设置创建令牌,则中间件将读取令牌并将其应用于HttpContext上的用户属性,如下所示:

public Controller(IHttpContextAccessor httpContextAccessor)
{
    var userId = HttpContextAccessor.HttpContext.User;
}
如果令牌被拒绝,HttpStatus代码401将自动发送回调用者,并显示消息“未授权”

第3点:
是的,正确保护JWT令牌本身的最佳且可能唯一的方法是使用HTTPS。令牌的“签名”组件无法保护令牌或防止其被欺诈使用;它只是提供了一种确保其未被篡改的方法

您使用哪个工具生成jwt令牌???你自己写程序了吗?使用DOTNET core有一个内置的jwt令牌生成库。只需传递一些选项,然后创建jwt令牌并更新问题
public Controller(IHttpContextAccessor httpContextAccessor)
{
    var userId = HttpContextAccessor.HttpContext.User;
}