我有一个网站(WebApp),我在那里对我的WebAPI层进行Ajax调用,该层接受JWT Bearer Token身份验证。我已将Adal.js集成到我的前端脚本层中,配置值看起来像这样。
var config = {
instance: "https://login.microsoftonline.com/",
tenant: "tenant.com",
clientId: "CLIENT_ID OF THE PORTAL APP", // Web-Portal app
redirectUri: "http://localhost:8241/",
popUp: true,
cacheLocation: "localStorage" };
WebApiConfig如下所示:
var webApiConfig = {
resourceId: "CLIENT_ID OF API APP", // Web-API app
resourceBaseAddress: "http://localhost:9020/"
};
一切正常,我能够通过隐式oauth流通过访问令牌进行身份验证/授权并调用我的webapi。
现在我希望能够为登录用户检索用户的安全组成员资格值,以便在WebAPI层,我可以确保用户属于特定的安全组授权逻辑的一部分。所以我在Azure AD中的应用程序清单xml中设置了GroupMembershipClaims:“SecurityGroup”(我首先为WebApi应用程序清单执行此操作,但随后也在WebApp应用程序清单中执行此操作。)
但是,看起来像GroupMembershipClaims只包含在idtoken和不的accessToken中。鉴于它是发送到WebAPI的accessToken,我无法在该层进行此检查。我想我可以在WebApp层进行检查,但鉴于此WebApi层将从许多其他前端应用程序(不属于我,我主要是“API提供程序”)调用,这不是一个安全的解决方案。
那么我该如何解决这个问题呢?我想一种方法是使用WebApi图层上的“代表”流来调用Graph API来查找它?我担心这将需要比用户范围更多的权限。
谢谢!
答案 0 :(得分:1)
这是一个很好的问题。
我的第一个想法是“你可以从Graph API中获取它们”,但我看到你已经想到了这一点:)
如果你想这样做,你可以像你说的那样代表On使用,并在MS Graph API上使用这个操作:https://developer.microsoft.com/en-us/graph/docs/api-reference/beta/api/user_getmembergroups。 您需要这些委派权限: User.Read和Group.Read.All 。 因此,除了基本的User.Read之外,您还需要获得读取所有组的权限。
还有其他几种选择。
您可以在API中定义角色。 我写了一篇关于如何做到这一点的文章:Defining permission scopes and roles offered by an app in Azure AD。 因此,如果您在API的清单中定义了这样的角色:
{
"appRoles": [
{
"allowedMemberTypes": [
"User"
],
"displayName": "Administrator",
"id": "179c1dc0-4801-46f3-bc0d-35f059da1415",
"isEnabled": true,
"description": "Administrators can access advanced features.",
"value": "admin"
}
]
}
您需要为每个角色设置一个唯一的GUID,您可以使用在线生成器或PowerShell [System.Guid]::NewGuid()
。
然后可以将这些角色分配给用户,如果您至少拥有Azure AD Basic,则可以将它们分配给组。 角色包含在访问令牌中,因此您可以在API中轻松检查这些角色。
我的另一个想法是让API和前端在Azure AD中使用相同的注册应用程序。 这样您就可以将Id令牌传递给API而不是访问令牌,并且您将获得这些组。 但既然你可能还有其他前端,我怀疑这对你有用。