带有 Azure 应用程序网关和基于路径的后端池的 Azure B2C

Azure B2C with Azure Application Gateway and Path Based Backend Pools

我无法理解如何在使用后端池和基于路径的 URL 映射在 Azure 应用程序网关后面配置的 .Net Core 3.1 MVC 应用程序上配置 Azure AD B2C 身份验证。

我有一个使用 Nuget 包的 .Net Core MVC (3.1) 应用程序 (Microsoft.AspNetCore.Authentication.AzureADB2C.UI - v3.1.5).

appsettings.json 文件包含:

"AzureAdB2C": {
    "Instance": "...://foo.com/tfp/",
    "ClientId": "guid",
    "CallbackPath": "/Home/Index",
    "Domain": "foo.onmicrosoft.com",
    "SignUpSignInPolicyId": "do",
    "ResetPasswordPolicyId": "re",
    "EditProfilePolicyId": "mi"
  }

startup.cs(在 ConfigureServices 方法中)有:

services.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme).AddAzureADB2C(options => Configuration.Bind("AzureAdB2C", options));

Azure 应用程序注册: 我创建了一个带有重定向 URI 的应用程序注册:

https://localhost:5555/Home/Index

在本地使用应用程序时,一切正常/可以执行身份验证。

我将应用部署到 Azure 应用服务。此后,我再次更新了应用注册,这次包括了应用服务的 URI(默认提供):

https://myapp.azurewebsites.net/Home/Index

使用应用服务 URL 处理应用程序时,一切正常/可以执行身份验证。

问题: 当我提供后端池以指向我刚刚创建的应用程序服务时出现问题。我执行的步骤是:

  1. 在应用程序网关中,单击 'backend pools' 以创建一个新应用程序网关,其中 'target type' 作为 'app service','target' 作为我创建的应用程序服务。
  2. 在应用程序网关 blade 中,单击 'Rules',更新现有的 'path-based' 规则之一(我们已经配置了具有特定 URL https://ourdomain.com) 为后端池(我创建的那个)包含一个基于路径的规则。
  3. 然后我再次更新了 Azure App 注册,这次包含基于 URL ourdomain.com/myapp/Home/Index
  4. 的后端池路径

当浏览到 https://ourdomain.com/myapp 时,路径解析并且一切正常;然而,身份验证已损坏且无法正常工作。

经过检查,我注意到当我 'sign in' 使用默认的应用程序服务 URL 时,调用是:

....://foo.com/foo.onmicrosoft.com/b2c_1a_signup_signin_loa0/oauth2/v2.0/authorize?client_id=guid&redirect_uri=https%3A%2F%2Fmyapp.azurewebsites.net%2FHome%2FIndex&response_type=id_token&scope=openid%20profile&response_mode=form_post....

参数'Redirect URI'设置为myapp.azurewebsites.net

然而,当我'sign in'使用后端池路径(ourdomain.com/myapp)时,是否正在使用相同的'Redirect URI'?

当然重定向 URI 应该是后端池路径之一 ourdomain.com/myapp

尽管添加了重定向 URI(在应用程序注册中),但为什么它不能用于基于后端池的路径?我还需要配置其他东西吗(在 Azure / Code 中)。你能给我指出正确的方向吗?

提前致谢。

首先解释一下 - 应用注册中的重定向 URI 列表是您允许在此应用注册中使用的 URI 列表。当用户流(在您的情况下 - b2c_1a_signup_signin_loa0)将使用该列表中的任何值作为 redirect_uri 参数打开时,它们将正常工作。

现在是一个您可以尝试的建议,请注意我从未使用过您的组合,所以我没有 1:1 经验。但是,我猜你的应用程序仍然“认为”它是 myapp.azurewebsites.net(不管你是否使用 ourdomain.com),因为这就是它被 Azure 应用程序网关攻击的方式。在这种情况下,重定向 URI 由中间件处理,您只能通过 CallbackPath 选项更改路径。您可以做的是使用特定主机 header 让 App Gateway 访问您的后端。这样,正确的主机将从 App Gateway 向下传播到您的后端,并希望也传播到 redirect_uri.

参考文档如下:https://docs.microsoft.com/en-us/azure/application-gateway/application-gateway-web-app-overview#override-host-header-in-the-request