You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:07:43