gpt4 book ai didi

authentication - Azure AD 身份验证redirect_uri 在 Linux 托管 (Cloud Foundry) ASP.NET Core 2.2 应用程序上不使用 https

转载 作者:行者123 更新时间:2023-12-02 19:45:31 25 4
gpt4 key购买 nike

我有一个 ASP.NET Core 应用程序托管在 SAP Cloud 环境 (Cloud-Foundry) 的 Linux 容器上。

我正在使用 Microsoft.AspNetCore.Authentication.AzureAD.UI 库实现 Azure AD 身份验证。

身份验证失败,因为无论我最初使用什么协议(protocol)访问 Web 应用程序,它都会使用 http 协议(protocol)生成 redirect_uri

此操作失败,因为它与 Azure 中的应用程序注册中定义的 https URL 不匹配。

AADSTS50011: The reply url specified in the request does not match the reply urls configured for the application

在选项中,您可以传入CallbackPath,但这仅接受相对路径(必须以/开头)。否则,它来自根据 scheme, host, port and path extracted from the current request 自动生成的 redirect_url

我不明白的是,即使我直接在浏览器中使用https访问应用程序,它仍然在redirect_uri中使用http。

我猜根本问题是 Cloud Foundry 中托管的应用程序接受 http 请求。

以下是我如何实现 Azure AD 身份验证的代码部分。

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options => Configuration.Bind("Authentication:AzureAD", options));

services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
{
options.Authority = options.Authority + "/v2.0"; // Microsoft identity platform
options.TokenValidationParameters.ValidateIssuer = true;
});


app.UseHsts();
app.UseHttpsRedirection();


"Authentication": {
"AzureAD": {
"Instance": "https://login.microsoftonline.com/",
"ClientId": "{app-application-id}",
"TenantId": "{my-tenant-id}"
}
}

最佳答案

Tony Ju 提供了一个类似问题的极好链接,帮助我缩小范围并最终解决我的问题。

但是,该解决方案仅提供代码示例,我想多写一些如何实现最终实现的内容。

当您的应用程序位于代理服务器和/或负载平衡器后面时,就会出现此问题。代理会掩盖有关初始请求的信息(例如原始架构),从而使应用程序中依赖此信息的服务表现不正确(例如 return_url)。

There is an excellent documentation about how to configure your ASP.NET Core application .

从文档中,这是我的问题的根本原因。

When HTTPS requests are proxied over HTTP, the original scheme (HTTPS) is lost and must be forwarded in a header.

the Cloud Foundry Security documentation tells the following :

Protocols All traffic from the public internet to the Cloud Controller and UAA happens over HTTPS. Inside the boundary of the system, components communicate over a publish-subscribe (pub-sub) message bus NATS, HTTP, and SSL/TLS.

简而言之,您需要使用标准中间件来转发某些HttpHeader。

services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});

app.UseForwardedHeaders();

但是,当您的应用程序部署在没有 IIS 作为代理的 Linux 计算机上时,.net core 2.1 存在一个已知问题。当您添加 UseHttpRedirection 中间件时,这一点变得更加明显。

取自 this blog post :

OAuth and OIDC also fail in this configuration because they generate incorrect redirects. Calls to UseIISIntegration add and configure forwarded headers middleware when running behind IIS, but there’s no matching automatic configuration for Linux (Apache or Nginx integration). The fix for this issue is discussed in more detail in the doc article Forward the scheme for Linux and non-IIS reverse proxies.

这篇文章最终还提供了针对当前情况的工作解决方案。

    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();
});

看起来 .net core 3 不再需要这个,但 SAP 尚未更新他们的 dotnet 容器,所以在撰写本文时我无法验证它。

关于authentication - Azure AD 身份验证redirect_uri 在 Linux 托管 (Cloud Foundry) ASP.NET Core 2.2 应用程序上不使用 https,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59354864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com