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

Posted

技术标签:

【中文标题】如何在 .NET Core Web 应用程序的单个实例中使用动态租户对 Azure Active Directory 中的用户进行身份验证?【英文标题】:How to authenticate users in Azure Active Directory with dynamic tenants inside single instance of .NET Core web application? 【发布时间】:2019-09-03 05:33:12 【问题描述】:

我创建了 .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"
  

【问题讨论】:

【参考方案1】:

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

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

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

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

有关在多租户中验证用户的更多信息,请查看以下文档。 Convert app to be multi-tenant 和 Github sample to authenticate user in multi-tenant

我希望这会有所帮助。

【讨论】:

以上是关于如何在 .NET Core Web 应用程序的单个实例中使用动态租户对 Azure Active Directory 中的用户进行身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

在单个 ASP.NET Core 3.1 Web API 中管理两个 SPA;一个在根目录中,另一个在“管理员”路由中

使用 OData 的 ASP.Net Core Web API 实现对于单个实体 URI 失败

如何在Asp.net Core的登录过程中为“记住我”设置单个cookie超时?

无法在 ASP.Net Core Web api 中启用 CORS

如何在 asp.net core .NET6(Razor 页面)中的单个 cshtml 中显示来自多个表/模型的数据

如何在 ASP.NET (Core 2) Web 应用程序中访问来自 AWS 的认证?