.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
相关产品推荐
相关产品推荐

