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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:06:02