【问题标题】:Authentication using Azure Active Directory使用 Azure Active Directory 进行身份验证
【发布时间】:2019-11-29 05:11:40
【问题描述】:

我在 azure 门户上创建了一个用于 aad 身份验证的组。我想要一个不在任一组中的用户(但存在于 AAD 中) - 甚至不应该能够登录到该站点。我使用 asp.net core 作为后端

【问题讨论】:

  • 您在这里遇到的确切问题/问题是什么,您能详细说明一下吗?
  • 我们可以在 Active Directory 中对特定组的用户进行身份验证吗?如果可以,那么如何?

标签: .net azure asp.net-core azure-active-directory


【解决方案1】:

如果您想配置您的应用程序以接收组声明,您需要在 Manifest 文件中将“groupMembershipClaims”值设置为SecurityGroup

  1. 在应用程序注册门户上的应用程序设置页面中,单击“清单”以打开内联清单编辑器。

  2. 通过找到“groupMembershipClaims”设置并将其值设置为“SecurityGroup”来编辑清单。

  3. 保存清单。

    {
      ...
      "errorUrl": null,
      "groupMembershipClaims": "SecurityGroup",
      ...
    }

为应用程序启用组声明后,Azure AD 会在 JWT 和 SAML 令牌中包含一个声明,其中包含用户所属所有组的对象标识符 (objectId),包括传递组成员身份。

但请注意确保令牌大小不超过 HTTP 标头大小限制,Azure AD 限制它的 objectId 数量 包括在团体索赔中。如果用户是更多组的成员 超额限制(SAML 令牌为 150,JWT 令牌为 200),然后 Azure AD 不会在令牌中发出组声明。相反,它 在令牌中包含一个超额声明,表明 应用程序查询 Graph API 以检索用户的组 会员资格。更多详情请参考blog

所以你需要做一些处理:

  1. 检查声明_claim_names,其中一个值为组。这表示超龄。

  2. 如果找到,请调用 _claim_sources 中指定的端点以获取用户组。

  3. 如果找不到,请查看用户组的组声明。

当然,您可以直接调用Microsoft Graph API 来退出当前用户的群组无需使用group claims

关于如何基于该组进行授权,您可以通过 ASP.NET Core 中间件库来实现。 asp.net 中间件通过在TokenValidationParametersRoleClaimType 属性中指定声明来支持从声明填充的角色。由于 groups 声明包含安全组的对象 ID 而不是实际名称,因此您将使用组 ID 而不是组名。更多详情请参考sample

Startup.cs

// The following lines code instruct the asp.net core middleware to use the data in the "groups" claim in the Authorize attribute and User.IsInrole()
            // See https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles?view=aspnetcore-2.2 for more info.
            services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
            {
                // Use the groups claim for populating roles
                options.TokenValidationParameters.RoleClaimType = "groups";
            });

然后使用它

[Authorize(Roles = “Group-object-id")] // In controllers
// or
User.IsInRole("Group-object-id"); // In methods

【讨论】:

  • 真的很有帮助,我会研究一下。
【解决方案2】:

我假设您想在 Azure AD 上使用 ASP.NET Core 对 AD 进行身份验证。

如果您使用的是 ASP.NET Core 2.1 或更高版本,最简单的方法是针对 Azure AD 使用 OpenID 的 OAuth2.0/OIDC 流。 Azure AD 还支持 SAML 2.0,而不仅仅是 OAuth2.0/OIDC。

Microsoft 推荐在 Azure AD 上使用 OAuth2.0,因为它比在 Azure AD 上实施 SAML 2.0 更容易学习和实施。

Microsoft 提供了一个使用 ASP.NET Core 的示例应用程序来演示 Azure AD 的身份验证,方法是使用特定的库来帮助访问 Azure AD 身份验证,它称为 Microsoft Identity Platform(以前称为 MSAL 2.0)。

软件开发人员的 Azure AD 身份概述可在以下位置获得: official MS Docs page of Azure AD's Microsoft Identity Platform

对 Azure AD 用户进行身份验证的示例应用程序列表可在以下网址获得 landing page of various Microsoft Identity Platform code samples

注意事项:

  1. 必须先注册您的 Web 应用程序才能向 Azure AD 进行身份验证。
  2. 您的 Web 应用程序不能使用 OAuth2.0 的“资源所有者”授权模型,该模型将用户 ID 和密码直接传递给 Azure AD,因为 Web 应用程序必须显示同意屏幕才能登录到 Azure AD。

【讨论】:

  • 我们可以在 Active Directory 中对特定组的用户进行身份验证吗?如果可以,那么如何?
  • 是的,但是您需要处理额外的逻辑来检查,通过检查记录的用户声明,然后使用 WMI 使用声明查询用户。根据组检查登录的用户,这根本不是身份验证的一部分。
  • 你的意思是说我需要检查登录用户声明并找到登录用户组,如果它属于我创建的那个组就可以登录。类似的东西?
  • 是的,因为 Azure AD 中没有来自任何 Web 应用程序的组合用户 + 组身份验证功能。您只能从任何 Web 应用对 Azure AD 上的用户进行身份验证,并且 Azure AD 仅支持 OAuth2.0/OIDC 和 SAML 从任何 Web 应用对 Azure AD 进行身份验证。
  • 好的,谢谢您的回复。我会调查的。
【解决方案3】:

您可以在 Azure AD 中使用 groups claims,在 azure 门户中配置您的应用程序以通过编辑清单来接收组声明:

{
  ...
  "errorUrl": null,
  "groupMembershipClaims": "SecurityGroup",
  ...
}

从 Azure AD 发出的 ID 令牌将在 groups 声明中包含当前用户的组 ID 列表,然后在 asp.net 核心应用程序(例如 3.0)中,您可以通过以下方式限制访问:

services.AddControllersWithViews(options =>
    {
        var policy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser().RequireClaim("groups", "YourGroupID")
            .Build();
        options.Filters.Add(new AuthorizeFilter(policy));
    });

注意:来自document

如果用户是超过超额限制的组的成员(SAML 令牌为 150 个,JWT 令牌为 200 个),则 Microsoft 标识平台不会在令牌中发出组声明。相反,它在令牌中包含一个超额声明,指示应用程序查询 Graph API 以检索用户的组成员资格。

【讨论】:

  • 太棒了!这真的很有帮助。我会调查的。
最近更新 更多