Azure AD 中的 API 权限和公开 API 之间有什么区别?

Nir*_*jan 5 authorization azure swagger azure-active-directory

您好,我正在开发 Azure AD。我有一个 webapi 项目和与之一起配置的 swagger。我已经抵制了天蓝色广告中的两个应用程序。一种用于 swagger,一种用于 webapi 应用程序。现在我想实现基于组的授权。所以现在我想从 microsoft graph api 调用组。从这里开始我就很困惑了。要访问组,我需要授予在我的 azure Ad swagger 应用程序或 webapi 应用程序中读取图形的权限?招摇认证

下面是我的代码。

c.AddSecurityDefinition("oauth2", new OAuth2Scheme
                {
                    Type = "oauth2",
                    Flow = "implicit",
                    AuthorizationUrl = swaggerUIOptions.AuthorizationUrl,
                    TokenUrl = swaggerUIOptions.TokenUrl,
                    Scopes = new Dictionary<string, string>
                    {
                      { "read_user_groups", "https://graph.microsoft.com/Group.Read.All" }
                    }
                });
Run Code Online (Sandbox Code Playgroud)

现在,在天蓝色的广告中,我拥有 API 权限和公开 API。

在我的应用程序注册内的 swagger 应用程序中,我具有 API 权限,并且添加了 Microsoft Graph 并选择了 Groups.Read All。然后我有 Expose API,我们可以添加范围。这两件事让我很困惑。我的 swagger 应用程序必须在我的 Web api 上进行基于组的授权吗?有人可以帮我吗?

All*_* Wu 4

好的。我想我已经明白你的想法了。

您希望根据用户所属的组向用户授予访问权限(对您的 Web API)。那是对的吗?

因此,您需要调用 Microsoft graph 来查看用户属于哪个组。

在这种情况下,您应该从 Web api 应用程序调用 Microsoft graph。(不是招摇的应用程序)

但是,没有必要搞得这么复杂。

正如我在评论中提到的,您可以直接从 jwt 令牌获取用户所属的组。

您可以按照此处的说明将群组声明包含在您的令牌中。您只需修改 Web api 应用程序的应用程序清单中的“groupMembershipClaims”字段:

"groupMembershipClaims": "SecurityGroup"
Run Code Online (Sandbox Code Playgroud)

然后令牌将包含该用户所属组的 ID,如下所示:

{
  "groups": ["1ce9c55a-9826-4e32-871c-a8488144bb32"]
}
Run Code Online (Sandbox Code Playgroud)

然后您可以根据用户的组 ID 实现授权逻辑。


更新:

您可以将 appRole 添加到 Azure AD 应用程序(您的 Web api 应用程序)中,并将用户和组分配给 Role

然后该组中的用户将有如下声明:

{
  "roles": ["{the role you customized}"]
}
Run Code Online (Sandbox Code Playgroud)

之后,该角色将包含在访问令牌中。您可以根据用户的角色实现授权逻辑。