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

Azure应用服务虚拟目录中IdentityServer的URL配置问题

解决IdentityServer在Azure虚拟目录下生成带/auth后缀链接的问题

这个问题的核心是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:18:31