ASP.NET Core 2.2带角色的Authorize属性无法正常工作问题
解决ASP.NET Core 2.2角色授权导致的ERR_SPDY_PROTOCOL_ERROR问题
我之前迁移ASP.NET项目时碰到过类似的角色授权坑,结合你的情况,咱们一步步排查解决:
1. 先确认Startup中间件顺序(最容易踩的坑)
ASP.NET Core的中间件执行顺序直接影响授权逻辑,你得确保UseAuthentication和UseAuthorization的位置绝对正确:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // 其他中间件(异常处理、HTTPS、静态文件等)... // 必须先启用身份认证,再启用授权 app.UseAuthentication(); app.UseAuthorization(); // 最后才是MVC路由,而且默认路由要指向Leads/Create app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Leads}/{action=Create}/{id?}"); }); }
如果授权中间件放在MVC之后,或者认证和授权顺序搞反,就会出现跳转时的协议异常或授权失效。
另外,ConfigureServices里的Identity配置也要确保角色服务正确注册:
services.AddIdentity<YourCustomUser, IdentityRole>() .AddRoles<IdentityRole>() // 显式添加角色支持,和自定义User类对应 .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders();
ASP.NET Core 2.2中AddIdentity<TUser, TRole>本身包含角色基础支持,但显式添加AddRoles能避免一些隐性的注册遗漏问题。
2. 验证角色声明是否真的加载成功
虽然数据库里的用户角色关联正确,但有时候认证后的ClaimsPrincipal里并没有携带角色声明。你可以在Create Action里加一段调试代码:
[Authorize(Roles = "CreateLead")] public IActionResult Create() { // 打印当前用户的所有声明,检查是否有Role类型的条目 foreach (var claim in User.Claims) { System.Diagnostics.Debug.WriteLine($"Claim类型: {claim.Type}, 值: {claim.Value}"); } return View(); }
如果看不到类型为http://schemas.microsoft.com/ws/2008/06/identity/claims/role的声明,说明角色没有被正确注入。这时候可以检查:
- 自定义User类是否正确继承
IdentityUser,且DbContext里的UserRoles关联配置正常 - 登录逻辑是否调用了
SignInManager.PasswordSignInAsync,确保是完整的身份认证流程
3. 排查ERR_SPDY_PROTOCOL_ERROR的协议/缓存问题
这个错误大多和HTTP/2、HTTPS缓存有关,你可以试试:
- 用浏览器隐身模式打开,避免旧会话缓存干扰
- 开发环境暂时关闭HTTPS(注释掉
app.UseHttpsRedirection()),看是否还会报错 - 检查是否存在重定向循环:比如授权失败后跳转到登录,登录成功又跳回Create,但授权逻辑再次出问题导致无限跳转(虽然你说认证成功,但可以通过日志确认)
4. 启用详细日志抓细节
在appsettings.Development.json里调高日志级别,能看到授权过程的详细错误:
{ "Logging": { "LogLevel": { "Default": "Debug", "Microsoft.AspNetCore.Authorization": "Debug", "Microsoft.AspNetCore.Identity": "Debug" } } }
查看控制台或日志文件,重点关注授权阶段是否有异常抛出,比如角色验证失败的具体原因。
内容的提问来源于stack exchange,提问作者Edgias
相关产品推荐
相关产品推荐

