Angular12+ASP.Net Core5下Hangfire仪表盘接入微软SSO的权限认证问题
问题根因
你当前的认证配置仅注册了JWT Bearer认证方案,仅适配API接口的Token校验逻辑。而Hangfire Dashboard是通过浏览器页面直接访问,请求携带的是MSAL Cookie而非JWT请求头,默认不会触发Cookie认证流程,因此HttpContext.User不会被填充身份信息。
解决步骤
1. 调整认证服务配置,同时支持JWT和Cookie认证
修改ConfigureServices中的认证配置,额外注册Azure AD Cookie认证方案,适配Hangfire Dashboard的浏览器访问场景:
services .AddAuthentication(options => { // 全局默认用JWT适配API请求 options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddMicrosoftIdentityWebApi(Configuration) .EnableTokenAcquisitionToCallDownstreamApi() // 新增Azure AD Cookie认证方案,专门用于Hangfire权限校验 .AddMicrosoftIdentityWebApp(Configuration, cookieScheme: "AzureADCookie");
2. 改造Hangfire授权过滤器,手动触发Cookie认证
修改HangfireAuthorisationFilter,在校验权限前手动调用Cookie认证流程,填充完整的用户身份信息:
public class HangfireAuthorisationFilter : IDashboardAuthorizationFilter { public bool Authorize(DashboardContext context) { var httpContext = context.GetHttpContext(); // 手动触发Azure AD Cookie认证,解析MSAL Cookie获取用户身份 var authResult = httpContext.AuthenticateAsync("AzureADCookie").GetAwaiter().GetResult(); if (!authResult.Succeeded) { // 未登录时触发Azure AD登录跳转 httpContext.ChallengeAsync("AzureADCookie").GetAwaiter().GetResult(); return false; } httpContext.User = authResult.Principal; // 同时校验登录状态和Admin角色 return httpContext.User.Identity.IsAuthenticated && httpContext.User.IsInRole("Administrator"); } }
如果你的Hangfire版本支持异步授权过滤器,可改为异步实现避免同步阻塞。
3. 确认中间件顺序
确保Configure方法中UseAuthentication、UseAuthorization中间件的执行顺序在UseHangfireDashboard之前,避免认证逻辑未执行就进入Hangfire权限校验:
app.UseAuthentication(); app.UseRouting(); app.UseAuthorization(); // Hangfire中间件必须放在认证授权之后 app.UseHangfireDashboard("/hangfire", new DashboardOptions { Authorization = new[] { new HangfireAuthorisationFilter() }, AppPath = "/" }); // 后续端点、SPA中间件保持原有顺序即可 app.UseEndpoints(endpoints => { ... }); app.UseSpa(spa => { ... });
补充说明
不需要手动解码MSAL Cookie,Microsoft Identity自带的Cookie认证方案会自动完成Cookie解密、签名校验和Claims填充逻辑,只要Azure AD应用注册中正确配置了角色声明发放规则,就可以直接通过User.IsInRole方法判断用户角色。
内容的提问来源于stack exchange,提问作者tone
相关产品推荐
相关产品推荐

