如何检查调用者是WebAPI层中AD安全组的一部分?

时间:2018-04-07 05:23:53

标签: asp.net-web-api oauth-2.0 authorization azure-active-directory adal.js

我有一个网站(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来查找它?我担心这将需要比用户范围更多的权限。

谢谢!

1 个答案:

答案 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而不是访问令牌,并且您将获得这些组。 但既然你可能还有其他前端,我怀疑这对你有用。