首页 > 解决方案 > 如何在 .NET Core Web 应用程序的单个实例中使用动态租户对 Azure Active Directory 中的用户进行身份验证?

问题描述

我创建了 .NET Core 2.1 Web 应用程序。之后,此应用程序与 Azure Active Directory ( Microsoft.AspNetCore.Authentication.AzureAD) 集成。我的活动目录中有几个租户,为了验证用户身份,需要提供 AD 租户 ID、AD 应用程序客户端 ID。

有没有办法在我的 Active Directory 中使用所有租户进行身份验证?

public class Startup
{
     // Generated code

     public void ConfigureServices(IServiceCollection services)
     {
          services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
                  .AddAzureAD(options => 
                              Configuration.Bind("AzureAd", options));

          services.Configure<OpenIdConnectOptions> 
                   (AzureADDefaults.OpenIdScheme, options =>
          {
               // OnTicketReceived, OnAuthenticationFailed, OnTokenValidated
          })
     }

     // Generated code
}

这是我的appsettings.json文件:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com",
    "Domain": "some-domain.com",
    "TenantId": "1a10b000-*******",
    "ClientId": "15a0421d-*******",
    "CallbackPath": "/signin-oidc"
  }
}

标签: c#azureasp.net-core.net-coreactive-directory

解决方案


对于多租户应用程序,应用程序不知道用户来自哪个租户,因此我们无法向租户的端点发送请求。要从 AD 获取令牌,所有请求都将转到 /common 端点 ( https://login.microsoftonline.com/common )

当 Azure AD 在 /common 端点上收到请求时,它会登录用户并发现用户来自哪个租户。/common 端点不对应于租户,也不是颁发者,当我们检查 /common 元数据中的颁发者值时,它有一个模板 URL 而不是实际值:颁发者:https://sts.windows。净/租户/

因此,多租户应用程序无法仅通过将元数据中的颁发者值与令牌中的颁发者值进行匹配来验证令牌。多租户应用程序需要逻辑来决定哪些颁发者值有效,哪些不是基于颁发者值的租户 ID 部分。

例如,如果多租户应用程序仅允许已注册其服务的特定租户登录,则它必须检查令牌中的颁发者值或租户 ID声明值,以确保该租户在其列表中的订阅者。

请查看以下文档以获取有关在多租户中对用户进行身份验证的更多信息。 将应用程序转换为多租户Github 示例以在多租户中验证用户

我希望这有帮助。


推荐阅读