Azure应用服务虚拟目录中IdentityServer的URL配置问题
这个问题的核心是IdentityServer没有正确识别到它的公共访问根路径——虽然你的重写规则把auth.mydomain.com的请求转发到了/auth目录,但IdentityServer默认会根据当前请求的路径生成issuer和各类链接,所以它误以为自己的根路径是https://auth.mydomain.com/auth,而非域名本身。
下面是具体的修复步骤:
1. 配置Forwarded Headers中间件(关键)
Azure App Service作为反向代理,会向你的应用发送X-Forwarded-Proto、X-Forwarded-Host等请求头,用来传递真实的外部访问地址。你需要让ASP.NET Core应用信任这些头,这样IdentityServer才能获取到正确的公共域名。
在Program.cs中添加以下配置:
var builder = WebApplication.CreateBuilder(args); // 添加Forwarded Headers配置 builder.Services.AddForwardedHeaders(options => { options.ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedFor | Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedProto; // 信任Azure内部代理的IP段,生产环境可按需调整范围 options.KnownProxies.Add(IPAddress.Parse("10.0.0.0/8")); options.KnownProxies.Add(IPAddress.Parse("172.16.0.0/12")); options.KnownProxies.Add(IPAddress.Parse("192.168.0.0/16")); }); // 其他服务配置... builder.Services.AddIdentityServer() .AddInMemoryClients(Config.Clients) .AddInMemoryIdentityResources(Config.IdentityResources) .AddInMemoryApiScopes(Config.ApiScopes) .AddDeveloperSigningCredential(); // 生产环境请替换为正式签名证书 var app = builder.Build(); // 必须在其他中间件之前启用Forwarded Headers app.UseForwardedHeaders(); // 其他中间件配置... app.UseIdentityServer(); app.UseAuthorization(); app.Run();
2. 强制指定IdentityServer的公共原点(Public Origin)
如果Forwarded Headers配置后仍有问题,可以直接指定IdentityServer的公共访问原点,确保它始终使用https://auth.mydomain.com作为根路径:
在AddIdentityServer的配置中添加:
builder.Services.AddIdentityServer(options => { options.PublicOrigin = "https://auth.mydomain.com"; }) // 后续客户端、资源等配置...
这个设置会强制IdentityServer用指定的地址生成所有公共链接,忽略当前请求的路径信息。
3. 优化Web.config的重写规则(可选)
你的现有重写规则已经能正确转发请求,但可以添加一个条件,避免对/auth路径本身重复转发:
<rule name="Rewrite to Auth" stopProcessing="true"> <match url="^(.*)" /> <conditions logicalGrouping="MatchAll"> <add input="{HTTP_HOST}" pattern="^auth.mydomain.com$" /> <add input="{REQUEST_URI}" pattern="^/auth/" negate="true" /> </conditions> <action type="Rewrite" url="auth/{R:0}" /> </rule>
这样可以防止当请求已经包含/auth路径时被重复转发,减少不必要的处理。
验证效果
配置完成后重新部署应用,访问https://auth.mydomain.com/.well-known/openid-configuration,你会看到issuer字段变成https://auth.mydomain.com,所有生成的链接也不再带有/auth后缀,MVC应用生成的链接也会使用正确的根路径。
内容的提问来源于stack exchange,提问作者Alx

