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

.NET5 Blazor Server集成Azure AD重定向URI无限登录循环问题

这个登录循环问题是反向代理部署Blazor+Azure AD认证场景的典型问题,由几个配置错误共同导致,按以下步骤修复即可:

核心问题点
  • 手动覆写OIDC重定向地址时只填了站点根路径,没有拼接/signin-oidc回调端点,Azure AD认证完成后回跳地址和应用监听的回调地址不匹配,认证票据无法被正常接收。
  • 转发头中间件默认仅信任回环地址的代理请求,没有清空默认的已知代理/网络限制,应用始终识别当前请求为HTTP协议,生成的认证Cookie被标记为非安全属性,在外部HTTPS访问时会被浏览器拦截,认证状态无法持久化,触发重复跳转。
  • 中间件顺序错误,UseForwardedHeaders没有放在请求管道最前端,后续认证、路由中间件拿到的还是原始HTTP请求信息。
  • 本地调试时没有配置对应localhost的回调地址,Azure AD无法把认证结果回传到本地调试端口,自然登录失败。
修复方案

1. 调整Startup.cs配置

ConfigureServices 部分

替换为以下配置:

public void ConfigureServices(IServiceCollection services)
{
    // 先配置转发头,清空默认信任限制适配反向代理
    services.Configure<ForwardedHeadersOptions>(options =>
    {
        options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost;
        options.KnownNetworks.Clear();
        options.KnownProxies.Clear();
    });

    services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"))
        .EnableTokenAcquisitionToCallDownstreamApi()
        .AddInMemoryTokenCaches();

    services.AddControllersWithViews().AddMicrosoftIdentityUI();

    // 强制Cookie安全策略适配HTTPS反向代理场景
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.MinimumSameSitePolicy = SameSiteMode.Lax;
        options.Secure = CookieSecurePolicy.Always;
        options.HttpOnly = HttpOnlyPolicy.Always;
    });

    // 修正OIDC重定向地址逻辑
    string redirectUri = Configuration.GetValue<string>("AzureAd:RedirectUri");
    if (!string.IsNullOrWhiteSpace(redirectUri))
    {
        services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
        {
            options.SaveTokens = true;
            options.Events.OnRedirectToIdentityProvider = context =>
            {
                // 拼接完整回调地址,不要直接用根路径
                context.ProtocolMessage.RedirectUri = $"{redirectUri.TrimEnd('/')}{options.CallbackPath}";
                return Task.CompletedTask;
            };
            // 回调时修正请求上下文的Scheme和Host,避免地址校验失败
            options.Events.OnMessageReceived = context =>
            {
                var baseUri = new Uri(redirectUri);
                context.Request.Scheme = baseUri.Scheme;
                context.Request.Host = new HostString(baseUri.Host);
                return Task.CompletedTask;
            };
        });
    }

    // Blazor Server额外配置,避免SignalR回路认证异常
    services.AddServerSideBlazor().AddCircuitOptions(o =>
    {
        o.DetailedErrors = env.IsDevelopment();
    });
}

Configure 部分

严格按照以下顺序放置中间件,转发头必须放在最前面:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 转发头中间件必须放在管道最开头
    app.UseForwardedHeaders();
    app.UseCookiePolicy();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        // 反向代理已经做了HTTPS终止,不需要开启HSTS和HTTPS重定向
        // app.UseHsts();
    }

    // 注释掉UseHttpsRedirection,避免内部HTTP请求被强制跳转
    // app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseRouting();

    // 认证授权中间件顺序不能调换
    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapBlazorHub();
        endpoints.MapFallbackToPage("/_Host");
        endpoints.MapDefaultControllerRoute();
    });
}

2. 修正配置文件

调整appsettings.json,注意转义字符和路径配置,额外开启认证日志方便排查:

{  
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "替换为你的Azure AD域名",
    "TenantId": "替换为你的租户ID",
    "ClientId": "替换为你的应用客户端ID",
    "ClientSecret": "替换为你的客户端密钥",
    "RedirectUri": "https://myapp-test.domain.it",
    "CallbackPath": "/signin-oidc"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information",
      "Microsoft.AspNetCore.Authentication": "Debug"
    }
  },
  "AllowedHosts": "*"
}

3. 修正Azure AD应用注册配置

删除Azure门户里配置的根路径重定向URIhttps://myapp-test.domain.it/,只保留正确的回调地址:

  • 生产环境:https://myapp-test.domain.it/signin-oidc
  • 本地调试额外新增:https://localhost:你的VS调试SSL端口/signin-oidc,本地调试时启动VS的SSL调试即可,不需要走公网地址。

4. 反向代理和IIS检查

  • 确认反向代理正确转发X-Forwarded-For、X-Forwarded-Proto、X-Forwarded-Host三个头,没有修改/signin-oidc路径的请求,也没有给这个路径加额外的鉴权跳转规则。
  • IIS服务器必须安装对应.NET5版本的Hosting Bundle,应用池设置为无托管代码模式。
验证步骤
  • 先清除浏览器所有和该站点相关的Cookie,避免旧Cookie干扰。
  • 打开浏览器开发者工具的网络面板,正常流程为:访问站点→302跳转到Microsoft登录页→登录完成302回跳/signin-oidc→302回到站点根路径,后续请求携带认证Cookie返回200状态码。
  • 如果仍有问题,查看应用日志中的认证错误信息,常见错误为IDX21323(重定向URI不匹配)、Cookie被拦截,对应调整配置即可。

内容的提问来源于stack exchange,提问作者Davide

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:06:13