我在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);
}
答案 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。令牌的“签名”部分不会保护它或防止其被欺诈使用;它只是提供一种手段来确保它未被篡改