azure-active-directory - 如何通过 Azure AD 检查用户是否在 AD 组中?
问题描述
设置规格
- .NET 4.5.1 MVC 项目
- 项目包含 .aspx 文件(旧版)
- 当前用户 Azure AD 通过 Cookie 进行身份验证。
- 使用“隐式授予 - ID 令牌”和“仅限此组织目录中的帐户”配置 Azure 门户(通过应用注册)
- 本地 AD 组被推送到 Azure AD。
Startup.cs 配置
// COOKIES: Tells it to use cookies for authentication.
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
CookieManager = new SystemWebCookieManager()
});
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions()
{
ClientId = ClientID,
Authority = Authority,
PostLogoutRedirectUri = PostLogoutRedirectUri,
Notifications = new OpenIdConnectAuthenticationNotifications()
{
AuthenticationFailed = PrincipalService.OnAzureAuthenticationFailure,
AuthorizationCodeReceived = (AuthorizationCodeReceivedNotification notification) =>
{
var username = notification.AuthenticationTicket.Identity.Name.Split('#').LastOrDefault();
var emailAddress = notification.AuthenticationTicket.Identity.Claims.FirstOrDefault(x => x.Type.Contains("emailaddress"))?.Value;
Logger.Log(Level.Auth, $"Azure login success! Username: '{username}' Email: '{emailAddress}'.");
return Task.FromResult(0);
}
}
});
问题
鉴于此设置,我如何检查当前登录的用户是否在特定的 AD 组中?
我试过的
所有关于执行 Microsoft Graph API 的指南总是提出一个我不知道如何解决的问题(例如GetAccountsAsync
返回空等)。
我在我们的应用注册清单中添加了以下内容:
"optionalClaims": {
"idToken": [
{
"name": "email",
"source": null,
"essential": true,
"additionalProperties": []
},
{
"name": "groups",
"source": null,
"essential": true,
"additionalProperties": []
}
],
"accessToken": [],
"saml2Token": []
}
email
工作正常,但显然groups
不是,因为它是在黑暗中拍摄的。
解决方案
1. 将组成员声明作为 Token 的一部分
通过编辑应用程序的清单(这可以直接在 Azure 门户中完成)并将"groupMembershipClaims"
属性设置为"All"
或"SecurityGroup"
根据需要,您可以启用组声明作为应用程序访问令牌的一部分。
2. 组 ID 作为声明的一部分返回
如上所述更新应用程序清单后,您可以获得组 ID 作为声明的一部分。这是解码的 JWT 令牌的快速示例
3.限制可以作为token一部分返回的组数
为确保令牌大小不超过 HTTP 标头大小限制,Azure AD 限制它包含在组声明中的 objectId 数量。如果用户是超过超额限制(SAML 令牌为 150,JWT 令牌为 200)的组的成员,则 Azure AD 不会在令牌中发出组声明。相反,它在令牌中包含一个超额声明,指示应用程序查询 Graph API 以检索用户的组成员资格。
4. 相关的 Microsoft Graph API
注意:使用 Microsoft Graph API 可能非常强大,因为您可以绕过超额情况,并在需要时获取有关组的所有其他类型的信息(如名称)。在这种特殊情况下,由于意图是验证组成员身份,组 ID 是最好的字段,因为它不会更改,而其他名称(如名称)可以。
如果您已经知道要检查/验证成员资格的组,这将很有帮助。
POST https://graph.microsoft.com/v1.0/users/{id | userPrincipalName}/checkMemberGroups
在请求正文中,您可以提供groupdIds
,即包含要检查成员资格的组的对象 ID 的集合。最多可以指定 20 个组。
{
"groupIds": [
"fee2c45b-915a-4a64b130f4eb9e75525e",
"4fe90ae065a-478b9400e0a0e1cbd540"
]
}
如果您还不知道该组并且想要获取该用户所属的所有组,这将很有帮助。
POST https://graph.microsoft.com/v1.0/users/{id | userPrincipalName}/getMemberGroups
这是另一个相关的 SO 帖子
推荐阅读
- python - 将 CS:GO 输出文件同步到 VPS
- reactjs - React Redux - 可以将每个状态都投入到连接我的组件中吗?
- javascript - 如何在 PHP 中按索引属性循环?
- android - Facebook分享照片不起作用元数据问题
- python - 无法计算两个日期之间的工作日?转换 dtype('
我希望计算两个日期之间的工作日(不包括星期日和星期六),一个在数据框列内,另一个是今天的当前日期,但出现错误:
REF8_df['Days_Dif'] = np.busday_count(REF8_df['Session1_Date'], Todays_Date) File "<__array_f
- sql - 解决存储过程中的单例错误
- arrays - 无法在swift 4中将标题(字符串)和图像从数组显示到CollectionView
- c# - 如何使 Unity2D 中的对象平滑交互?
- json - 对 ':' 元素的 json 数据类型运行查询时出现问题
- angular - 如何解决“检查后表达式已更改”。由于@Input 变量更新而发生时?