如何使用流畅的API创建Azure AD应用程序?

时间:2017-07-29 18:23:36

标签: c# azure azure-active-directory azure-ad-graph-api

我正在使用以下代码尝试以编程方式在Azure Active Directory中注册应用程序:

        var application = azure.ActiveDirectoryApplications.Define(applicationName)
            .WithSignOnUrl(url)
            .WithIdentifierUrl(url)
            .WithAvailableToOtherTenants(false)
            .DefinePasswordCredential(id)
              .WithPasswordValue(secret)
              .Attach()
            .Create();

其中azureMicrosoft.Azure.Management.Fluent.Azure的实例。

当我运行上面的操作来创建Azure Active Directory应用程序时,会抛出Microsoft.Azure.Management.Fluent.Azure异常并显示消息Operation returned an invalid status code 'Forbidden'。创建其他Azure资源(如资源组和应用程序服务)可以正常工作。

查看异常详细信息,我可以看到对以下端点的请求:

https://graph.windows.net/{myTenantId}/applications?api-version=1.6

以下是回复正文:

{"odata.error":{"code":"Authorization_RequestDenied","message":{"lang":"en","value":"Insufficient privileges to complete the operation."}}}

由于正文显示“完成操作的权限不足”,因此它似乎是一个简单的权限问题,但我已为Microsoft.Azure.ActiveDirectory API授予以下权限(在作为全局管理员登录时)正在运行代码的应用程序:

  • 以登录用户身份访问目录
  • 读取和写入目录数据

这些特权还不够吗?我错过了什么?正如我所说,使用流畅的API创建其他资源就可以了。

1 个答案:

答案 0 :(得分:1)

范围Directory.AccessAsUser.AllDirectory.ReadWrite.All User.Read是在Azure Active Directory中创建应用程序的足够权限。由于您没有提供构建azure实例的方法,因此我将提供一个有效的代码示例:

static void Main(string[] args)
{
    var url = "http://adfei.onmicrosoft.com/appFluent";
    var id = "abc";
    var secret = "secret";
    var applicationName = "appFluent";
    var credFile = new AzureCredentials(new UserLoginInformation
    {
        ClientId = "{appId of native application}",
        UserName = "{userName}",
        Password = "{password}"
    },
        "adfei.onmicrosoft.com", AzureEnvironment.AzureGlobalCloud);
    IAzure azure = Azure.Authenticate(credFile).WithDefaultSubscription();
    var application = azure.ActiveDirectoryApplications.Define(applicationName)
    .WithSignOnUrl(url)
    .WithIdentifierUrl(url)
    .WithAvailableToOtherTenants(false)
    .DefinePasswordCredential(id)
      .WithPasswordValue(secret)
      .Attach()
    .Create();

    Console.Read();
}

请确保范围包含在访问令牌中,以确保您拥有此操作的权限。您可以通过Fiddler捕获请求以检查令牌并解码来自this site的令牌,以检查访问令牌中的scp声明。