在本文中,将探讨如何在ASP.NET Core Identity中实现JWT(JSON Web Token)认证。JWT认证是一种基于令牌的认证机制,它允许应用程序在不依赖于会话和cookie的情况下进行安全的用户认证。这种机制特别适用于需要从移动应用或其他客户端安全地调用API的场景。
首先,需要设置一个ASP.NET Core MVC项目,并配置身份数据库。将使用ASP.NET Core Identity来实现用户注册、登录和登出功能。
在ASP.NET Core MVC项目中,可以使用ASP.NET Core Identity来实现用户注册、登录和登出功能。这些功能将使用基于cookie的认证,这对于Web应用来说是一个很好的选择。
对于需要从移动应用或其他客户端安全地调用API的场景,基于cookie的认证可能不是最佳选择。在这种情况下,可以使用基于令牌的认证,特别是JWTToken。
为了在项目中添加JWTToken生成能力,需要在Startup类中的ConfigureServices方法中配置身份中间件的服务。
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity()
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddCookie()
.AddJwtBearer(jwtBearerOptions =>
{
jwtBearerOptions.TokenValidationParameters = new TokenValidationParameters()
{
ValidateActor = false,
ValidateAudience = false,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = Configuration["Token:Issuer"],
ValidAudience = Configuration["Token:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Token:Key"]))
};
});
services.AddMvc();
}
接下来,将添加两个新的Web API控制器:
TokenController中的令牌生成代码如下:
[HttpPost]
public async Task Get(LoginViewModel model)
{
if (ModelState.IsValid)
{
var user = await _userManager.FindByEmailAsync(model.Email);
if (user != null)
{
var result = await _signInManager.CheckPasswordSignInAsync(user, model.Password, lockoutOnFailure: false);
if (!result.Succeeded)
{
return Unauthorized();
}
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, model.Email),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var token = new JwtSecurityToken
(
issuer: _configuration["Token:Issuer"],
audience: _configuration["Token:Audience"],
claims: claims,
expires: DateTime.UtcNow.AddDays(60),
notBefore: DateTime.UtcNow,
signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Token:Key"])), SecurityAlgorithms.HmacSha256)
);
return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });
}
}
return BadRequest();
}
为了测试实现,将使用Postman。首先,将尝试从Postman访问Greeting API(http://localhost:36946/api/greeting)。将看到得到了未授权错误。