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

What is the difference between API permissions and expose API in Azure AD?

您好,我正在研究 Azure AD。我有一个 webapi 项目,并随它一起配置了 swagger。我在azure ad中抵制过两个app。一种用于 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" }
                    }
                });

现在在 azure Ad 中我有 API 权限并公开 API。

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

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

您想根据用户所属的组授予他们访问权限(访问您的网站 API)。对吗?

所以,你需要调用Microsoft graph 来查看用户在哪个组中。

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

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

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

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

"groupMembershipClaims": "SecurityGroup"

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

{
  "groups": ["1ce9c55a-9826-4e32-871c-a8488144bb32"]
}

然后你就可以根据用户的组id来实现你的授权逻辑了。


更新:

你可以add an appRole into your Azure AD app (your web api app) and assign users and groups to roles.

那么群里的用户就会有如下声明:

{
  "roles": ["{the role you customized}"]
}

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