Blazor Server集成MS Identity(AspNetUsers)角色授权异常问题排查
下面是几个大概率导致问题的原因,你可以逐一排查:
登录后的用户Claims里没带角色信息
Blazor Server默认不会自动把数据库里的角色同步到用户的Claims里,得确认Program.cs里有没有正确配置角色服务。比如要加上.AddRoles<IdentityRole>():builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddRoles<IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>();你还可以在组件里加一行
@context.User.Claims,打印出当前用户的所有Claims,看看有没有类型为Role、值为Admin的条目。角色名称大小写不匹配
数据库AspNetRoles表里的角色名是Admin还是admin?代码里写的是Roles="Admin",如果数据库里是小写,授权会失败——角色名称默认是区分大小写的。Circuit缓存了旧的认证信息
Blazor Server靠Circuit维持连接,要是你是在用户登录后才给它加的Admin角色,当前的Circuit不会自动更新这个信息。试试注销再重新登录,或者重启下应用,让Circuit获取最新的角色数据。中间件顺序错了
看看Program.cs里的中间件顺序,UseAuthorization()必须放在UseAuthentication()之后,不然授权逻辑拿不到正确的用户认证信息:app.UseAuthentication(); app.UseAuthorization();自定义授权策略干扰了默认逻辑
如果之前在Program.cs里加过自定义的授权策略,可能覆盖了默认的角色授权。比如要是你定义了AdminOnly策略,那组件里得用@attribute [Authorize(Policy="AdminOnly")],而不是直接指定Roles="Admin"。
内容的提问来源于stack exchange,提问作者Jan Gravgaard

