【发布时间】:2019-11-27 18:08:25
【问题描述】:
我们正在开发一个使用基于 .Net Core 2.2 Web API 构建的后端的应用程序。我们的大多数控制器只需要[Authorize] 属性而没有指定策略。但是,某些终结点将要求用户位于特定的 Azure AD 安全组中。对于这些情况,我在 Startup.cs 文件中实现了这样的策略:
var name = "PolicyNameIndicatingGroup";
var id = Guid.NewGuid; // Actually, this is set to the object ID of the group in AD.
services.AddAuthorization(
options =>
{
options.AddPolicy(
name,
policyBuilder => policyBuilder.RequireClaim(
"groups",
id.ToString()));
});
然后,对于需要此类授权的控制器,我有:
[Authorize("PolicyNameIndicatingGroup")]
public async Task<ResponseBase<string>> GroupProtectedControllerMethod() {}
问题是我们的用户都在大量的组中。这会导致 Graph API 根本不返回任何组声明,而是将简单的 hasGroups 布尔声明设置为 true。因此,noone有any组,因此无法通过授权。可以阅读关于here 的这个无组问题。
这种基于字符串的策略注册,尽管它可能乏善可陈,但似乎是 .Net Core 人们所推荐的,但如果用户声明中没有填充组,它就会失败。我并没有真正看到如何解决这个问题。 是否有一些特殊的方法可以为我的 API 设置 AppRegistration,以便它确实获取用户声明中填充的所有组?
更新:
在解决方案中,我确实有一个调用 Graph 来获取用户组的服务。但是,在为时已晚之前,我无法弄清楚如何调用它。换句话说,当用户点击控制器上的 AuthorizeAttribute 来检查策略时,用户的组还没有被填充,所以受保护的方法总是用 403 阻止它们。
我的尝试包括为我的所有 Web API 控制器制作一个自定义基本控制器。在基本控制器的构造函数中,我正在调用一个方法来检查 User.Identity(ClaimsIdentity 类型)以查看它是否已创建并经过身份验证,如果是,我正在使用 ClaimsIdentity.AddClaim(Claim claim) 方法来填充从我的 Graph 调用中检索到的用户组。但是,当进入基本控制器的构造函数时,User.Identity 尚未设置,因此不会填充组,如前所述。不知何故,我需要在构建控制器之前填充用户组。
【问题讨论】:
标签: azure asp.net-core azure-active-directory asp.net-core-webapi asp.net-core-2.2