.NET 8 Identity自定义登录/登出端点实现方法咨询
手动实现ASP.NET Core 8登录/登出端点的参考方向
核心参考来源
- ASP.NET Core Identity官方文档:重点关注
SignInManager<TUser>和SignOutManager<TUser>的API说明,这两个是实现登录、登出的核心依赖,文档会详细讲解它们的常用方法(如PasswordSignInAsync、SignOutAsync)及参数含义。 - MapIdentityApi开源源码:.NET是开源项目,直接查看官方
MapIdentityApi的实现代码,它的登录端点本质也是基于SignInManager封装的,去掉注册等额外逻辑后,核心流程可以直接复用。 - ASP.NET Core认证官方文档:如果使用JWT令牌登录,参考JWT认证的手动颁发流程;如果使用Cookie认证,参考Cookie认证的配置与登录登出实现。
极简登录/登出端点实现示例
1. 配置Identity基础服务
在Program.cs中配置Identity,关闭不必要的默认功能:
builder.Services.AddIdentity<IdentityUser, IdentityRole>(options => { options.SignIn.RequireConfirmedAccount = false; // 根据需求调整,无需邮箱验证等 }) .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); // 如果用JWT,添加JWT认证配置 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = builder.Configuration["Jwt:Issuer"], ValidAudience = builder.Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])) }; });
2. 实现登录/登出端点
[ApiController] [Route("api/auth")] public class AuthController : ControllerBase { private readonly SignInManager<IdentityUser> _signInManager; private readonly IConfiguration _configuration; public AuthController(SignInManager<IdentityUser> signInManager, IConfiguration configuration) { _signInManager = signInManager; _configuration = configuration; } [HttpPost("login")] public async Task<IActionResult> Login(LoginRequest request) { if (!ModelState.IsValid) return BadRequest(ModelState); var result = await _signInManager.PasswordSignInAsync(request.Username, request.Password, request.RememberMe, lockoutOnFailure: false); if (!result.Succeeded) { return Unauthorized("用户名或密码错误"); } // 若使用JWT,生成并返回令牌 var token = GenerateJwtToken(request.Username); return Ok(new { Token = token }); // 若使用Cookie,直接返回成功 // return Ok(new { Message = "登录成功" }); } [HttpPost("logout")] public async Task<IActionResult> Logout() { await _signInManager.SignOutAsync(); return Ok(new { Message = "登出成功" }); } // JWT令牌生成方法(仅JWT场景使用) private string GenerateJwtToken(string username) { var claims = new[] { new Claim(ClaimTypes.Name, username), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"])); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( issuer: _configuration["Jwt:Issuer"], audience: _configuration["Jwt:Audience"], claims: claims, expires: DateTime.Now.AddMinutes(30), signingCredentials: creds); return new JwtSecurityTokenHandler().WriteToken(token); } } public class LoginRequest { [Required] public string Username { get; set; } = string.Empty; [Required] public string Password { get; set; } = string.Empty; public bool RememberMe { get; set; } }
注意事项
- 确保已正确配置DbContext连接字符串,用于Identity存储用户数据。
- 管理员添加账号的逻辑可单独实现,通过
UserManager<TUser>.CreateAsync方法创建用户,无需依赖注册端点。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

