设置规范
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
不能这样做,因为它是在黑暗中拍摄的。
答案 0 :(得分:3)
1。将组成员资格声明作为令牌的一部分
通过编辑应用程序的清单(可以直接在Azure Portal中完成)并将"groupMembershipClaims"
属性设置为"All"
,可以启用组声明作为应用程序访问令牌的一部分"SecurityGroup"
。
2。群组ID作为声明的一部分返回
如上所述,一旦更新了应用清单后,您就可以获取组ID。这是解码的JWT令牌的快速示例
3。限制可以作为令牌的一部分返回的组的数量
为确保令牌大小不超过HTTP标头大小限制,Azure AD限制了它包含在组声明中的objectId的数量。如果用户属于超过超出限制的组的更多成员(SAML令牌为150,JWT令牌为200),则Azure AD不会在令牌中发出组声明。相反,它在令牌中包含一个超额声明,该声明指示应用程序查询Graph API以检索用户的组成员身份。
4。相关的Microsoft Graph API
注意:使用Microsoft Graph API的功能可能非常强大,因为您可以解决过度使用的情况,并在需要时获得有关组的所有其他信息(例如名称)。在这种特殊情况下,由于目的是验证组成员身份,因此组ID是最佳字段,因为它不会更改,而其他名称(如name)可以更改。
如果您已经知道要检查/验证其成员身份的组,则此功能将很有帮助。
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
这里是另一个related SO Post