如何以编程方式在Azure AD中创建应用程序

时间:2016-02-22 00:32:29

标签: azure-active-directory adal azure-sdk-.net azure-api-apps azure-ad-graph-api

我正在请求新环境时手动在Azure Active目录上创建应用程序。我正在探索通过REST API从代码创建这些应用程序的方法。通过使用'client_credentials',我成功地在现有应用程序上创建了用户和组。

ClientCredential clientCred = new ClientCredential(clientID, clientSecret);
AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(resAzureGraphAPI, clientCred);

以类似的方式,我尝试使用从上面生成的'access_token'来创建一个新的应用程序     adClient.Applications.AddApplicationAsync(newApplication).Wait()

但这会引发错误 - “没有足够的权限来完成操作。”

我查看了其他线程和Azure AD msdn页面,结果发现client_credentials流程不支持创建/更新应用程序。

Adding Applications programmatically in Azure AD using Client Credentials Flow

上面的帖子也提到了解决方法,就是使用'grant_type = password'流程。我按照建议尝试了但是我一直收到以下错误,这对我来说没有意义。

"error": "invalid_grant",
    "error_description": "AADSTS50034: To sign into this application the account must be added to the 1283y812-2u3u-u293u91-u293u1 directory.\r\nTrace ID: 66da9cf9-603f-4f4e-817a-cd4774619631\r\nCorrelation ID: 7990c26f-b8ef-4054-9c0b-a346aa7b5035\r\nTimestamp: 2016-02-21 23:36:52Z",
    "error_codes": [
        50034
    ],

这是我正在击中的有效载荷和端点。传递的用户是我要创建应用程序的AD的所有者

endpoint:https://login.windows.net/mytenantID/oauth2/token

post data
resource    00000002-0000-0000-c000-000000000000
client_id   id
client_secret   secret
grant_type  password
username    principal@mydomain.com
password    password
scope       openid

对于我可能出错的任何想法或建议将不胜感激。

3 个答案:

答案 0 :(得分:0)

您可以使用PowerShell创建应用:

$servicePrincipalName =”Your Client App Name”
$sp = New-MsolServicePrincipal -ServicePrincipalNames $servicePrincipalName -DisplayName $servicePrincipalName -AppPrincipalId “Your Client ID"
New-MsolServicePrincipalCredential -ObjectId $sp.ObjectId -Type Password -Value “Your client secret”
Add-MsolRoleMember -RoleObjectId “62e90394-69f5-4237-9190-012177145e10" -RoleMemberType ServicePrincipal -RoleMemberObjectId $sp.ObjectId

62e90394-69f5-4237-9190-012177145e10表示的角色是Admin角色,可以根据需要调整任何其他角色的ObjectId。运行Get-MsolRole以获取角色列表和ObjectIds。

然后,您可以从应用程序运行此代码或手动运行它。您还需要在上面之前运行连接代码,类似于:

$loginAsUserName = "Your Tenancy Admin Account"
$loginAsPassword = "Your Tenancy Admin Account Password"

$secpasswd = ConvertTo-SecureString $loginAsPassword -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential ($loginAsUserName, $secpasswd)

Connect-MsolService -Credential $creds

答案 1 :(得分:0)

我能够在我的租户中创建应用程序。我用于创建应用程序的AD租户已针对不同的域进行了验证。基本上我最终插入来自该域的用户并使用resource_type =密码流能够生成访问令牌。接下来,触发以下代码行就可以了解

 ActiveDirectoryClient adClient = new ActiveDirectoryClient(
                serviceRoot,
                AccessToken);
adClient.Applications.AddApplicationAsync(newApplication).Wait();

答案 2 :(得分:0)

在您的POST OAuth令牌端点中检查以下似乎有些偏差的内容:

  • 当您想要访问Azure AD的Graph API时,您需要将https://graph.windows.net作为resource正文参数传递;这是(imho)没有很好的记录,但这就是你需要做的事情
  • 作为client_idclient_secret,您需要在Azure AD中传递客户端ID和预定义应用程序的密钥,而后者又已授予每个用户级别的权限;这些必须足以添加应用程序
  • 我认为没有使用scope参数;您将获得在Azure AD管理门户中定义的声明(为应用程序分配的权限)

这会为您呈现一个访问令牌,然后您可以在https://graph.windows.net/tenantId/端点上使用它。