我正在使用以下代码尝试以编程方式在Azure Active Directory中注册应用程序:
var application = azure.ActiveDirectoryApplications.Define(applicationName)
.WithSignOnUrl(url)
.WithIdentifierUrl(url)
.WithAvailableToOtherTenants(false)
.DefinePasswordCredential(id)
.WithPasswordValue(secret)
.Attach()
.Create();
其中azure
是Microsoft.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创建其他资源就可以了。
答案 0 :(得分:1)
范围Directory.AccessAsUser.All
和Directory.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
声明。