ASP.NET Core提供了一个名为Identity的框架,用于处理用户身份验证和授权。使用JWT(JSON Web Tokens)进行身份验证是一种常见的做法。下面是一个包含代码示例的ASP.NET Core身份验证JWT/Identity的解决方案:
首先,在项目中安装以下NuGet包:
在Startup.cs
文件中进行配置:
public void ConfigureServices(IServiceCollection services)
{
// 添加身份验证服务
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "your-issuer", // 设置发行方
ValidAudience = "your-audience", // 设置受众
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-secret-key")) // 设置密钥
};
});
// 添加Identity服务
services.AddIdentity()
.AddEntityFrameworkStores() // 使用Entity Framework Core存储用户和角色信息
.AddDefaultTokenProviders(); // 添加默认的令牌提供程序
// 其他服务配置...
}
AccountController
的控制器,并添加以下代码示例:[Route("api/[controller]")]
[ApiController]
public class AccountController : ControllerBase
{
private readonly SignInManager _signInManager;
private readonly UserManager _userManager;
public AccountController(UserManager userManager, SignInManager signInManager)
{
_userManager = userManager;
_signInManager = signInManager;
}
[HttpPost("register")]
public async Task Register(RegisterModel model)
{
// 创建用户对象
var user = new IdentityUser
{
UserName = model.Email,
Email = model.Email
};
// 注册用户
var result = await _userManager.CreateAsync(user, model.Password);
if (!result.Succeeded)
{
return BadRequest(result.Errors);
}
// 生成JWT token
var token = GenerateJwtToken(user);
return Ok(new { token });
}
[HttpPost("login")]
public async Task Login(LoginModel model)
{
// 使用用户凭据进行登录
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, false, false);
if (!result.Succeeded)
{
return BadRequest("Invalid login attempt");
}
// 获取用户对象
var user = await _userManager.FindByEmailAsync(model.Email);
// 生成JWT token
var token = GenerateJwtToken(user);
return Ok(new { token });
}
private string GenerateJwtToken(IdentityUser user)
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes("your-secret-key");
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, user.UserName),
new Claim(ClaimTypes.Email, user.Email)
}),
Expires = DateTime.UtcNow.AddDays(7), // 设置过期时间
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
}
这是一个简单的示例,用于注册和登录用户,并返回生成的JWT token。在实际应用中,您可能需要根据自己的需求进行更多的身份验证和授权配置。