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

如何在自定义/默认认证方案中正确使用.NET Identity的UserManager与SignInManager

解决方案

问题的核心是ASP.NET Core Identity的SignInManager默认使用IdentityConstants.ApplicationScheme作为认证方案,而非你自定义的cookie方案,导致生成默认名称的Cookie。以下是完整的修正配置和最佳实践:

1. 调整Identity配置,绑定自定义认证方案

在注册Identity服务时,显式指定SignIn使用的认证方案为你的自定义cookie方案:

const string CookieScheme = "cookie";

// 先配置自定义Cookie认证方案
builder.Services.AddAuthentication(CookieScheme)
    .AddCookie(CookieScheme, options =>
    {
        options.Cookie.Name = "MyCustom.Identity";
        options.Cookie.SameSite = SameSiteMode.Lax;
        options.Cookie.Path = "/";
        options.Cookie.HttpOnly = true;
        // 可选:API场景可忽略登录路径配置,因为我们用SignInManager手动处理登录
        // options.LoginPath = "/api/auth/login";
    });

// 配置Identity使用自定义认证方案
builder.Services.AddDefaultIdentity<IdentityUser>(options => 
{
    options.SignIn.RequireConfirmedAccount = false;
    // 关键:指定SignIn使用的认证方案
    options.SignIn.AuthenticationScheme = CookieScheme;
})
.AddEntityFrameworkStores<ApplicationDbContext>() // 替换为你的项目DbContext
.AddSignInManager();

如果使用AddIdentity而非AddDefaultIdentity,配置方式如下:

builder.Services.AddIdentity<IdentityUser, IdentityRole>(options =>
{
    options.SignIn.RequireConfirmedAccount = false;
    options.SignIn.AuthenticationScheme = CookieScheme;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddSignInManager();

2. 确保中间件顺序正确

在Program.cs的管道配置中,必须保证中间件顺序为:UseRouting → UseAuthentication → UseAuthorization,否则认证逻辑无法生效:

app.UseRouting();

// 认证中间件必须在授权中间件之前
app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

3. 控制器路由优化(可选)

为了让路由更简洁易维护,建议在控制器上使用[Route("api/[controller]")],动作方法的路由会自动拼接:

[ApiController]
[Route("api/[controller]")] // 替换原Route("api/auth")
public class AuthController : ControllerBase
{
    // 注册接口路由变为 api/auth/register
    [HttpPost("register")]
    public async Task<IActionResult> Register([FromBody] RegisterModel model)
    {
        // 原有逻辑保持不变
    }
}

对于需要认证的接口,若默认认证方案已设置为cookie,直接使用[Authorize]即可;若需指定多个方案,可显式声明:

[Authorize(AuthenticationSchemes = CookieScheme)]
[HttpGet("user")]
public async Task<IActionResult> GetUser()
{
    // 原有逻辑保持不变
}

验证效果

完成配置后重新运行项目:

  • 调用注册接口,检查响应头中的Set-Cookie,确认Cookie名称为MyCustom.Identity
  • 携带该Cookie调用/api/user接口,应能正常返回用户信息,不再返回401 Unauthorized

内容的提问来源于stack exchange,提问作者Adharsh M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:01:30