1

在使用 Azure 注册我开发的 API 后,我有一个关于 SCP 声明的问题。我遵循了各种教程和示例应用程序。一切都正确验证,我可以主要使用本教程从受信任的子系统调用 API 方法: https ://github.com/AzureADSamples/WebApp-WebAPI-OAuth2-AppIdentity-DotNet

我遇到的问题是当我尝试验证 SCP 声明时:

Claim scopeClaim = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/scope");

scopeClaim 值始终为空。我确实看到了 ClaimsPrincipal.Current 对象中的声明,但没有看到 Scope。我的理解是,如果我下载清单并在包含应用程序权限的情况下上传它,它将在 API 中可用,以验证调用应用程序是否具有正确的范围。以下是我的应用程序清单(仅限 appPermissions):

"appPermissions": [
    {
      "claimValue": "access.fullaccess",
      "description": "Allow the application full access to the service on behalf of the signed-in user",
      "directAccessGrantTypes": [],
      "displayName": "Have full access to the service",
      "impersonationAccessGrantTypes": [
        {
          "impersonated": "User",
          "impersonator": "Application"
        }
      ],
      "isDisabled": false,
      "origin": "Application",
      "permissionId": "52966341-1bb5-4e9f-b4f6-46aad4d03b33",
      "resourceScopeType": "Personal",
      "userConsentDescription": "Allow the application full access to the service on your behalf",
      "userConsentDisplayName": "Have full access to the service"
    }
  ]

更新

因此,在进一步尝试并为 API 创建多个 appPermissions 并允许客户端 Web 应用程序选择多个“作用域”时,JWT 返回的 JWT 不包含任何作用域声明。有什么我遗漏或做得不对的吗?

4

1 回答 1

3

您在 JWT 令牌中返回的声明取决于您使用的 OAuth 流程以及您定义的权限。

使用 Azure AD 实现 OAuth 时,您将始终需要(至少)两个向 Azure AD 注册的应用程序:一个 API 提供者和一个或多个 API 使用者。根据您正在实施的流程,您还需要用户使用它。

让我们首先选择最简单的案例:客户端凭据流。在 CC 流程中,您不涉及任何用户,唯一重要的权限是应用程序权限。现在,这有点棘手,这些并没有反映在 JWT 令牌中作为scp声明,而是作为roles包含消费者应用程序的appRoles(参见文档)。appPermissions这些“应用程序角色”需要在提供 API 的应用程序的清单中定义,就像 , 一样。

仅当您使用还包含用户的流时,例如授权代码授予或资源所有者密码授予,scp如果您已使用 AD 接口定义了相应的权限,您将在令牌中看到声明。

于 2016-01-19T08:17:20.847 回答