使用 FrontDoor 使用 Azure AD redirect_uri 进行身份验证不正确
Authentication with Azure AD redirect_uri is incorrect using FrontDoor
我已经将 Azure FrontDoor 设置为端口 5443 上的容器 运行 和自定义域之间的反向 proxy/load 平衡器。这样做的目的是为用户提供一个标准地址。 IE。 container.azurecontainer.io:3443 被 https://oursite3.example.com 指向。
同一个aci是运行多个容器:
container.azurecontainer.io:443
container.azurecontainer.io:2443
container.azurecontainer.io:3443
https://oursite1.example.com
https://oursite2.example.com
https://oursite3.example.com
(line 116:
然后我们在全球不同区域部署了多个 aci(因此使用 Frontdoor 在不同实例之间进行负载平衡)。
在此示例中,container.azurecontainer.io:3443 上安装了 MS AD 身份验证。单击 link 时,用户会被重定向到登录,并且会生成 link 并将浏览器重定向到它。 link 中有 redirect_uri。类似于:https://login.microsoftonline.com/00000000-0000-0000-0000-000000000001/oauth2/authorize?client_id=00000000-0000-0000-0000-000000000002&redirect_uri=https%3A%2F%2Foursite3.example.com%3A3443%2Fsignin-oidc&response_type=id_token&scope=openid%20profile&response_mode=form_post&nonce=jkalksdfj alskdjflkjalksdfjalkjA&x-client-SKU=ID_NETSTANDARD2_0&x-client-ver=5.5.0.0
但是,用户在登录时会在网站上看到以下内容:
AADSTS50011: The reply URL specified in the request does not match the reply URLs configured for the application: '00000000-0000-0000-0000-000000000003'
原因是AD应用程序的回复url设置为:
https://oursite3.example.com/signin-oidc
然而,经过仔细检查,用户被重定向到登录的 url 将其作为 redirect_uri:
https://oursite3.example.com:5443/signin-oidc
即端口 5443 已添加到主机名的末尾。
本质上它包括 redirect_uri 中的底层原始端口,我不希望它这样做。
我试过在我们的站点中使用 ForwardedOptions。例如,我们的 startup.cs 文件中包含以下内容 (ConfigureServices):
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor |
ForwardedHeaders.XForwardedProto;
// Only loopback proxies are allowed by default.
// Clear that restriction because forwarders are enabled by explicit
// configuration.
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
});
后跟(配置):
app.UseForwardedHeaders();
这不能解决问题。
我看看是否可以通过查看此处来覆盖设置为 redirect_uri 的值:https://github.com/dotnet/aspnetcore/blob/b7e122fbac4207b003dc07f6101e50218be8ff21/src/Security/Authentication/Core/src/AuthenticationHandler.cs
还有这个:
有人知道还有什么问题吗?
谢谢
我们决定将容器分成不同的容器实例。设计简单。
当 Web 应用位于 Azure Front Door 后面时,我们需要将 /authorize 请求中的 redirect_uri 配置为 Front Door 的地址。
在下面的代码中,我们覆盖了“OnRedirectToIdentityProvider”事件并注入了 Front Door 的地址。当我尝试这个时,我只是对地址进行了硬编码,但理想情况下,您可以从 Front Door 注入请求的 headers 中提取它。
这是我在尝试验证在 Azure 应用程序服务上运行的 Blazor 服务器应用程序 (.net 6) 时使用的代码,受 Azure AD 保护,运行 在 Azure Front Door 后面。
public void ConfigureServices(IServiceCollection services)
{
// ... existing code
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi(new[] { "User.Read" })
.AddInMemoryTokenCaches();
services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.Events = new OpenIdConnectEvents
{
OnRedirectToIdentityProvider = (context) =>
{
// Override the redirect_uri
// Ideally extract this from config
// Or context.Request.Headers["X-Forwarded-Host"]
// see: https://docs.microsoft.com/en-us/azure/frontdoor/front-door-http-headers-protocol#front-door-to-backend
context.ProtocolMessage.RedirectUri
= "https://YOUR-FRONT-DOOR-or-APP-GATEWAY/signin-oidc";
return Task.FromResult(0);
}
};
});
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor |
ForwardedHeaders.XForwardedProto;
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
});
// ... existing code
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ... existing code
// Don't forget to add this ...
app.UseForwardedHeaders();
// ... existing code
}
当代码运行时,“redirect_uri”参数应该指向您的 Front Door/Gateway,如此处所示。
希望对您有所帮助。 ❤️
我已经将 Azure FrontDoor 设置为端口 5443 上的容器 运行 和自定义域之间的反向 proxy/load 平衡器。这样做的目的是为用户提供一个标准地址。 IE。 container.azurecontainer.io:3443 被 https://oursite3.example.com 指向。
同一个aci是运行多个容器:
container.azurecontainer.io:443
container.azurecontainer.io:2443
container.azurecontainer.io:3443
https://oursite1.example.com
https://oursite2.example.com
https://oursite3.example.com
(line 116:
然后我们在全球不同区域部署了多个 aci(因此使用 Frontdoor 在不同实例之间进行负载平衡)。
在此示例中,container.azurecontainer.io:3443 上安装了 MS AD 身份验证。单击 link 时,用户会被重定向到登录,并且会生成 link 并将浏览器重定向到它。 link 中有 redirect_uri。类似于:https://login.microsoftonline.com/00000000-0000-0000-0000-000000000001/oauth2/authorize?client_id=00000000-0000-0000-0000-000000000002&redirect_uri=https%3A%2F%2Foursite3.example.com%3A3443%2Fsignin-oidc&response_type=id_token&scope=openid%20profile&response_mode=form_post&nonce=jkalksdfj alskdjflkjalksdfjalkjA&x-client-SKU=ID_NETSTANDARD2_0&x-client-ver=5.5.0.0
但是,用户在登录时会在网站上看到以下内容:
AADSTS50011: The reply URL specified in the request does not match the reply URLs configured for the application: '00000000-0000-0000-0000-000000000003'
原因是AD应用程序的回复url设置为:
https://oursite3.example.com/signin-oidc
然而,经过仔细检查,用户被重定向到登录的 url 将其作为 redirect_uri:
https://oursite3.example.com:5443/signin-oidc
即端口 5443 已添加到主机名的末尾。
本质上它包括 redirect_uri 中的底层原始端口,我不希望它这样做。
我试过在我们的站点中使用 ForwardedOptions。例如,我们的 startup.cs 文件中包含以下内容 (ConfigureServices):
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor |
ForwardedHeaders.XForwardedProto;
// Only loopback proxies are allowed by default.
// Clear that restriction because forwarders are enabled by explicit
// configuration.
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
});
后跟(配置):
app.UseForwardedHeaders();
这不能解决问题。
我看看是否可以通过查看此处来覆盖设置为 redirect_uri 的值:https://github.com/dotnet/aspnetcore/blob/b7e122fbac4207b003dc07f6101e50218be8ff21/src/Security/Authentication/Core/src/AuthenticationHandler.cs
还有这个:
有人知道还有什么问题吗?
谢谢
我们决定将容器分成不同的容器实例。设计简单。
当 Web 应用位于 Azure Front Door 后面时,我们需要将 /authorize 请求中的 redirect_uri 配置为 Front Door 的地址。
在下面的代码中,我们覆盖了“OnRedirectToIdentityProvider”事件并注入了 Front Door 的地址。当我尝试这个时,我只是对地址进行了硬编码,但理想情况下,您可以从 Front Door 注入请求的 headers 中提取它。
这是我在尝试验证在 Azure 应用程序服务上运行的 Blazor 服务器应用程序 (.net 6) 时使用的代码,受 Azure AD 保护,运行 在 Azure Front Door 后面。
public void ConfigureServices(IServiceCollection services)
{
// ... existing code
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi(new[] { "User.Read" })
.AddInMemoryTokenCaches();
services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.Events = new OpenIdConnectEvents
{
OnRedirectToIdentityProvider = (context) =>
{
// Override the redirect_uri
// Ideally extract this from config
// Or context.Request.Headers["X-Forwarded-Host"]
// see: https://docs.microsoft.com/en-us/azure/frontdoor/front-door-http-headers-protocol#front-door-to-backend
context.ProtocolMessage.RedirectUri
= "https://YOUR-FRONT-DOOR-or-APP-GATEWAY/signin-oidc";
return Task.FromResult(0);
}
};
});
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor |
ForwardedHeaders.XForwardedProto;
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
});
// ... existing code
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ... existing code
// Don't forget to add this ...
app.UseForwardedHeaders();
// ... existing code
}
当代码运行时,“redirect_uri”参数应该指向您的 Front Door/Gateway,如此处所示。
希望对您有所帮助。 ❤️