如何在应用程序网关后面基于路径的反向代理应用程序服务?
How to path-based reverse proxy app service behind application gateway?
我有一个配置了通配符证书的应用程序网关,我想用它在 myapp.mywebsite.net/mypath 后面代理 myapp.azurewebsites.net(一个 ASP.NET 核心应用程序)。
我在网关中配置了 myapp.mywebsite.net 上的现有站点 运行,但我只希望 /mypath
路由指向应用程序服务。我怎样才能做到这一点?
第 1 步 - 配置网关
- 为
myapp.azurewebsites.net
添加新的后端目标
- 添加新的 http 设置,启用主机名覆盖
myapp.azurewebsites.net
的特定域名。不要添加路径覆盖,我们希望将 /mypath
传递给应用程序服务。
- 编辑站点的现有 path-based 规则:
- 添加新的 path-based 规则
- 路径=
/mypath/*
- name=
mypathname
// 可以随便
- httpssetting=我们刚做的那个
- backendpool=我们刚刚做的那个
这将myapp.mywebsite.net/mypath
指向站点
第 2 步 - 配置应用程序
Startup.cs - 配置
有关详细信息,请参阅 here。
将以下内容添加到 Configure 方法的开头。我们希望 headers 在所有其他中间件发生之前进行调整。
app.UseForwardedHeaders(); // Enable hostname to be derived from headers added by app gateway
app.UsePathBase("/mypath"); // Tell ASP.NET that we have a base path
请参阅 here 以获得调试帮助。
Startup.cs - 配置服务
We need to tell ASP.NET to trust the gateway headers
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
options.AllowedHosts.Add("myapp.mywebsite.net");
options.KnownProxies.Add(IPAddress.Parse("10.my.gateway.ip"));
});
如果您正在使用
services.AddMicrosoftIdentityWebAppAuthentication(config);
对于身份验证,我们需要覆盖回复 url,使其指向 myapp.mywebsite.net/mypath/signin-oidc
而不是 myapp.azurewebsites.net/signin-oidc
。
这可以通过以下方式完成:
if (!env.IsDevelopment())
{
services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
// options.SaveTokens = true; // this saves the token for the downstream api
options.Events = new OpenIdConnectEvents
{
OnRedirectToIdentityProvider = async ctxt =>
{
ctxt.ProtocolMessage.RedirectUri = "https://myapp.mywebsite.net/mypath/signin-oidc";
await Task.Yield();
}
};
});
}
我们在开发中只 运行 这样 运行 将我们的东西放在本地执行默认行为,即使用本地主机填充回复url。
我有一个配置了通配符证书的应用程序网关,我想用它在 myapp.mywebsite.net/mypath 后面代理 myapp.azurewebsites.net(一个 ASP.NET 核心应用程序)。
我在网关中配置了 myapp.mywebsite.net 上的现有站点 运行,但我只希望 /mypath
路由指向应用程序服务。我怎样才能做到这一点?
第 1 步 - 配置网关
- 为
myapp.azurewebsites.net
添加新的后端目标
- 添加新的 http 设置,启用主机名覆盖
myapp.azurewebsites.net
的特定域名。不要添加路径覆盖,我们希望将/mypath
传递给应用程序服务。 - 编辑站点的现有 path-based 规则:
- 添加新的 path-based 规则
- 路径=
/mypath/*
- name=
mypathname
// 可以随便 - httpssetting=我们刚做的那个
- backendpool=我们刚刚做的那个
- 路径=
- 添加新的 path-based 规则
这将myapp.mywebsite.net/mypath
指向站点
第 2 步 - 配置应用程序
Startup.cs - 配置
有关详细信息,请参阅 here。
将以下内容添加到 Configure 方法的开头。我们希望 headers 在所有其他中间件发生之前进行调整。
app.UseForwardedHeaders(); // Enable hostname to be derived from headers added by app gateway
app.UsePathBase("/mypath"); // Tell ASP.NET that we have a base path
请参阅 here 以获得调试帮助。
Startup.cs - 配置服务
We need to tell ASP.NET to trust the gateway headers
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
options.AllowedHosts.Add("myapp.mywebsite.net");
options.KnownProxies.Add(IPAddress.Parse("10.my.gateway.ip"));
});
如果您正在使用
services.AddMicrosoftIdentityWebAppAuthentication(config);
对于身份验证,我们需要覆盖回复 url,使其指向 myapp.mywebsite.net/mypath/signin-oidc
而不是 myapp.azurewebsites.net/signin-oidc
。
这可以通过以下方式完成:
if (!env.IsDevelopment())
{
services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
// options.SaveTokens = true; // this saves the token for the downstream api
options.Events = new OpenIdConnectEvents
{
OnRedirectToIdentityProvider = async ctxt =>
{
ctxt.ProtocolMessage.RedirectUri = "https://myapp.mywebsite.net/mypath/signin-oidc";
await Task.Yield();
}
};
});
}
我们在开发中只 运行 这样 运行 将我们的东西放在本地执行默认行为,即使用本地主机填充回复url。