如何使用 Azure AD Graph API 创建 API 范围

How to create a API scope using Azure AD Graph API

我正在尝试使用 Azure AD Graph API 为 Azure AD B2C 应用程序创建 API 范围。这是使用门户中的“Expose an API”blade 执行的操作。

我试过像这样将作用域直接添加到应用程序中:

var current = await graphClient.Applications[appId].Request().GetAsync();
var currentList = current.Api.Oauth2PermissionScopes ?? new List<PermissionScope>();
var newScope = new PermissionScope
{
    AdminConsentDescription = scopeDescription,
    AdminConsentDisplayName = scopeDescription,
    IsEnabled = true,
    Type = "Admin",
    Value = scopeName
};
var updated = new Application { 
    Api = new ApiApplication { 
        Oauth2PermissionScopes = currentList.Append(newScope).ToList() 
    } 
};
await graphClient.Applications[appId].Request().UpdateAsync(updated);

但是,当我这样做时,出现异常:

Microsoft.Graph.ServiceException
Code: ValueRequired
Message: Property api.oauth2PermissionScopes.id value is required but is empty or missing.

这是否意味着我需要单独创建作用域然后将其添加到应用程序中?查看 Graph API 文档,如何做到这一点并不明显,我也没有找到任何讨论它的文章。

如何使用 Graph API 创建 API 范围?

如果要使用 Microsoft Graph API 为 Azure AD B2C 应用程序创建 API 范围,我们需要定义 PermissionScope 对象。该对象应提供 id(它是 GUID)。

例如

  1. Register Application

  2. 授予 API 权限

    • 管理、select API 权限.
    • 配置的权限下,select 添加权限
    • Select Microsoft API 选项卡,然后 select Microsoft Graph
    • Select 应用程序权限.
    • Select 权限复选框 Application.ReadWrite.All 授予您的应用程序。
    • Select添加权限。按照指示,等待几分钟再继续下一步。
    • Select 授予管理员同意(您的租户名称)
  3. 创建客户端密码

  4. 代码

 static async Task Main(string[] args)
        {
            string clientId = "0159ec7d-f99f-***";
            string clientSecret = "G_fM3QKa***essTRX23t1_o";
            string tenantDomain = "{your tenat name}.onmicrosoft.com";

            IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
                        .Create(clientId)
                        .WithTenantId(tenantDomain)
                        .WithClientSecret(clientSecret)
                        .Build();

            ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication);

            GraphServiceClient graphClient = new GraphServiceClient(authProvider);
            var id = "fa89ac50-d5fd-47cb-9f3f-833f413a2ed4";
            var app =await graphClient.Applications[id].Request().GetAsync();
            var updated = new Application();
            if (app.IdentifierUris.ToList().Count == 0) {
                updated.IdentifierUris = new string[] { $"https://{tenantDomain}/{app.AppId}" };
            }

            var appscope = app.Api.Oauth2PermissionScopes.ToList();
            var newScope = new PermissionScope
            {
                Id = Guid.NewGuid(),
                AdminConsentDescription = "Allow the application to have read-only access to all Employee data",
                AdminConsentDisplayName = "Read-only access to Employee records",
                IsEnabled = true,
                Type = "Admin",
                Value = "Employees.Read.All"
            };
            appscope.Add(newScope);
            updated.Api = new ApiApplication { Oauth2PermissionScopes =appscope };
            await graphClient.Applications[id].Request().UpdateAsync(updated);


        }

详情请参考here