ASP.NET Core OIDC 不能使用多个代理

问题描述 投票:0回答:0

我是 MSAL 和 OIDC 的新手,所以如果我说错了,请提前道歉。

我正在运行一个 ASP.NET Core 6.0 应用程序,该应用程序公开一个网页供员工访问。此应用程序最常部署到本地客户端服务器,因此它可能位于一个或多个负载平衡器或其他代理后面,具体取决于客户端的网络。

员工网页使用 OIDC 来质询请求并将用户重定向到 Microsoft 登录,之后他们将导航回身份验证重定向 URL 并允许访问该页面。当我的集成位于单个代理后面时,这似乎没有问题,但只要有多个代理,就会出现几个问题,从而阻止成功授权。

在我的测试设置中,我同时使用 Azure API 管理服务和 ngrok 来测试我的 Web 应用程序的本地运行实例。 API 管理服务设置为将请求转发到 ngrok,后者将请求转发到我在本地主机上的应用程序。

我在 Startup.cs 中使用 ForwardedHeaderMiddleware,其中有一些与默认选项不同的选项:

// In ConfigureServices()
services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = ForwardedHeaders.All;
    options.ForwardLimit = null;
    options.RequireHeaderSymmetry = false;
});

// In Configure()
app.UseForwardedHeaders();
app.UseAuthentication();
app.UseAuthorization();

使用此设置,如果我通过 API 管理(例如 https://myorg.azure-api.net/myApiPath/myPage)向我的网页发出请求,一旦请求,我将收到“关联失败”错误被重定向回我的应用程序。这是因为请求的 host 是“myorg.azure-api.net”,path 是“/myPage”,因此它们分别设置为 Nonce 和 Correlation cookie 的域和路径。这意味着当我的请求最终通过 API 管理重定向回我的应用程序时(例如 https://myorg.azure-api.net/myApiPath/signin-oidc),相关和随机数 cookie 被从响应中过滤掉因为它们与重定向请求的路径不匹配。它们的路径是“/myPage”,但重定向请求的路径是“/myApiPath/myPage”。

我试图通过手动将这些 cookie 的路径设置为“/”来解决这个问题:

services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
    options.NonceCookie.Path = options.CorrelationCookie.Path = "/";
});

这可以防止 cookie 在重定向回我的应用程序后被从请求中过滤掉,但我会遇到一个不同的错误:

AADSTS500112:回复地址'https://123456789.ngrok.io/signin-oidc'与请求授权时提供的回复地址'https://myorg.azure-api.net/myApiPath/signin-oidc'不匹配代码。

这使得 ASP.NET Core 似乎期望重定向请求的主机与初始质询中提供的重定向 URI 的主机相匹配。我不确定在具有多个代理的设置中如何实现。我尝试从此处修改一些 SameSite 策略,但这只会导致 Chrome 出于各种原因再次过滤掉这些 cookie。

我想我的问题有两个方面。

  • 我在这里做错了什么?我是否缺少一些允许此直通工作的配置?
  • 我是否使此设置过于复杂?在我看来,一个应用程序在多个代理之后运行并不少见,所以我觉得必须有更好的方法来处理这个问题。将 Nonce 和 Correlation cookie 的路径设置为“/”感觉像是解决问题的方法,而不是解决方案,我很惊讶我必须做这么多手动摆弄才能在两个代理后面工作。
asp.net-core openid-connect azure-api-management
© www.soinside.com 2019 - 2024. All rights reserved.