我在点网核心网络2.2 API应用程序有智威汤逊认证还有期满截止日期
在这里我对这个JWT令牌和安全的Web API令牌基地的一些问题
1:在这里我有具有相同重新登录(为同一用户),我以前的JWT令牌的问题就在这里令牌是不同的,但与前一个同样有效,直至其到期日,所以我想知道我怎么能处理以前的令牌这仍然是有效的,但没有为同一creandiantial产生一个新的令牌
2:想验证我的令牌来自受信任的来源(在这里我也加入了CROS在我startup.cs)。所以有验证令牌命中来自可信任/ varify(用户身份验证令牌)任何地方更安全的方法
3:我应该怎么做才能让我的安全令牌上(用户到服务器和服务器到用户端)喜欢使用HTTPS的SSL认证
我需要一些建议,做出最佳的安全安全DOTNET核心Web API
代码生成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);
}
一旦JWT产生,它被认为是有效的,直到它的到期日失效,或签名变为无效。这是一个令牌可以“过期”的唯一途径。生成多个令牌是完全有效的。但是,他们应该总是因为如果他们受到损害,他们可以由任何人使用的寿命很短(几分钟)。
处理这种情况的方法是使用刷新标记。它们允许你存储你的服务器,你可以用它来启用/禁用令牌的进一步补发特定用户上的值。
为了更完整的解释和例子,看看这个页面:http://jasonwatmore.com/post/2018/08/14/aspnet-core-21-jwt-authentication-tutorial-with-example-api
要点2:即通过AuthHeader进来的所有令牌被认为是进行验证。验证在磊科采用自动根据您在配置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]**
[ApiController]
[Route("[controller]")]
public class UsersController : ControllerBase
{
}
其基本思想是,你“创建”你的“登录”方法的标记,并将其返回给调用者 - 然后传递同样的道理回从客户端服务。所提供的令牌与你用于设置ConfigureServices方法相同的设置创建的,它由中间件被读取并施加到用户属性上的HttpContext像这样:
public Controller(IHttpContextAccessor httpContextAccessor)
{
var userId = HttpContextAccessor.HttpContext.User;
}
如果令牌被拒绝,401一个的HTTPStatus代码将被自动发送回主叫方消息“未授权”
要点3:是的,最好的,也许只有这样,才能确保JWT令牌本身是正确的,通过使用HTTPS真的。令牌的“签名”组分犯规将其固定或防止它被盗用;它只是提供了一种手段来确保它未被篡改