繁体   English   中英

使用 Azure Active Directory 进行身份验证

[英]Authentication using Azure Active Directory

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

如果要将应用程序配置为接收组声明,则需要在清单文件中将“ 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 不会发出令牌中的组声明。 相反,它在令牌中包含超额声明,指示应用程序查询图形 API 以检索用户的组成员资格。 更多详情,请参考博客

在此处输入图像描述

所以你需要做一些过程:

  1. 检查 claim _claim_names 其中一个值是组。 这表明超龄。

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

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

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

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

启动.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://learn.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

我假设您想使用 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 更容易学习和实施。

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

软件开发人员的 Azure AD 身份概述可在以下位置找到: Azure AD 的 Microsoft 身份平台的官方 MS 文档页面

各种 Microsoft Identity Platform 代码示例的登录页面上提供了对 Azure AD 用户进行身份验证的示例应用程序列表

笔记:

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

您可以在 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));
    });

注意:来自文档

如果用户所属的组数超过超额限制(SAML 令牌为 150 个,JWT 令牌为 200 个),则 Microsoft Identity Platform 不会发出令牌中的组声明。 相反,它在令牌中包含超额声明,指示应用程序查询图形 API 以检索用户的组成员资格。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM