ASP.NET Core 6.0中特定认证方案无法正常授权的问题
问题分析与解决方案
你的问题核心在于登录时使用的认证方案和授权时指定的"SchemeName"不匹配:
- 仅使用
[Authorize]时,系统会用默认认证方案验证身份,而你登录时恰好依托这个默认方案完成了认证,因此能正常访问。 - 但指定
[Authorize(AuthenticationSchemes = "SchemeName")]后,系统只会校验属于"SchemeName"方案的身份,可你登录时并未用该方案签发认证凭证,导致授权失败触发登录页重定向——此时User.Identity.IsAuthenticated显示true,是因为默认方案的身份仍处于有效状态。
解决方法
方法1:将"SchemeName"设为全局默认认证方案
修改Program.cs中的认证配置,把自定义Scheme设为全局默认,让登录和授权流程自动使用它:
builder.Services.AddAuthentication("SchemeName") // 指定默认方案为"SchemeName" .AddCookie("SchemeName", options => { options.LoginPath = "/identity/account/login"; });
方法2:登录时明确指定使用"SchemeName"方案
若不想修改全局默认方案,需在登录逻辑中显式指定用"SchemeName"签发认证Cookie。例如在登录Action中:
// 假设已构建好身份凭证ClaimsPrincipal var principal = new ClaimsPrincipal(/* 你的身份信息 */); await HttpContext.SignInAsync("SchemeName", principal);
额外说明(若使用ASP.NET Core Identity)
如果用的是Identity框架默认登录功能,它默认使用Identity.Application作为Scheme。此时需修改Identity配置,让它适配你的自定义Scheme:
builder.Services.AddIdentity<IdentityUser, IdentityRole>(options => /* 配置选项 */) .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders() .AddDefaultUI() .AddCookieAuthentication(options => { options.LoginPath = "/identity/account/login"; }, "SchemeName"); // 指定Identity使用的Cookie Scheme为"SchemeName"
这样Identity的登录逻辑会自动用"SchemeName"签发凭证,与授权时指定的Scheme匹配,即可正常通过授权。
内容的提问来源于stack exchange,提问作者joeshmoe301
相关产品推荐
相关产品推荐

