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

Posted

技术标签:

【中文标题】如何以编程方式在 Azure AD 中创建应用程序【英文标题】:How to programatically create applications in Azure AD 【发布时间】:2016-06-03 07:26:48 【问题描述】:

我目前正在 Azure Active Directory 上手动创建我的应用程序,只要有对新环境的请求。我正在探索通过 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

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

【问题讨论】:

【参考方案1】:

您可以使用 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 以获取角色和 ObjectId 的列表。

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

$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

【讨论】:

我首先通过Connect-MsolService 登录连接。 Get-MsolRole 列出了一堆角色及其名称。然后我想检查我的角色。所以我解雇了Get-MsolUserRole -UserPrincipalName test@mydomain.com。这返回空。当我开始创建 New-MsolServicePrinicpal 时,我总是收到错误 - 访问被拒绝。您无权访问此 cmdlet。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

当想要访问 Azure AD 的 Graph API 时,您需要将 https://graph.windows.net 作为 resource 正文参数传递;这(恕我直言)没有很好的记录,但这就是你需要做的 作为client_idclient_secret,您需要在您的Azure AD 中传递客户端ID 和预定义应用程序的密钥,然后您已授予每个用户级别的权限;这些需要足以添加应用程序 请看这里:https://msdn.microsoft.com/Library/Azure/Ad/Graph/howto/azure-ad-graph-api-permission-scopes?f=255&MSPPError=-2147217396 scope参数没用,我觉得;您将获得您在 Azure AD 管理门户中定义的声明(为您的应用程序分配的权限)

这应该会为您提供一个访问令牌,然后您可以随后在 https://graph.windows.net/tenantId/ 端点上使用。

【讨论】:

以上是关于如何以编程方式在 Azure AD 中创建应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用客户端凭据流以编程方式在 Azure AD 中添加应用程序

如何以编程方式在 android 中创建 *** 配置文件并连接到它?

以编程方式寻址在 xaml 中创建的画布

如何以编程方式在 iphone 中创建图表

在 Azure AD 中创建用户之前,是不是可以使用 Azure B2C 自定义策略验证来自社交身份提供商 (iDP) 的电子邮件声明?

如何以编程方式在 WordPress 中创建帖子 [关闭]