如何通过编程将应用程序添加到Azure AD?

30
我想自动化在Azure AD中创建我的应用程序,并获取由Azure AD生成的客户端ID。
有PowerShell命令来完成此操作吗?除了管理控制台之外,是否还有其他方式,例如API?
您能给我指示一个示例吗?
谢谢!

请查看 ARM 模块中的 New-AzureADApplication cmdlet。 - BenV
同样相关的链接:http://feedback.azure.com/forums/169401-azure-active-directory/suggestions/5629587-add-application-s-serviceprincipal-using-powershel - BenV
4个回答

45

在 AAD 中,您可以通过多种方式以编程方式创建应用程序。我将简要介绍两种不同的方法:PowerShell CMDLET 和 Graph API。一般来说,我强烈建议使用 Graph API。

PowerShell:

有几个不同的模块可用于创建 AAD 应用程序/服务主体。如果您需要在租户中创建新的应用程序对象,可以使用 Azure PowerShell 进行以下调用:

https://msdn.microsoft.com/en-us/library/mt603747.aspx

PS C:\> New-AzureRmADApplication -DisplayName "NewApplication" -HomePage "http://www.Contoso.com" -IdentifierUris "http://NewApplication"

如果您需要在租户中为您的应用程序创建服务主体,您可以使用Azure AD PowerShell:

https://msdn.microsoft.com/zh-cn/library/azure/jj151815.aspx

https://msdn.microsoft.com/zh-cn/library/azure/dn194119.aspx

New-MsolServicePrincipal -ServicePrincipalNames @("MyApp/Contoso.com") -DisplayName "My Application"

图形 API: (推荐)

您也可以通过向我们的图形 API 发送 POST 请求来创建应用程序: https://msdn.microsoft.com/Library/Azure/Ad/Graph/api/entity-and-complex-type-reference#ApplicationEntity

我们有示例展示了如何注册和创建一个应用程序来针对图形 API,并使用图形客户端库来帮助您进行正确的 API 调用:

https://github.com/AzureADSamples/WebApp-GraphAPI-DotNet

希望这可以帮助您!


2
谢谢你的回答。如果我有足够的声望,我会点赞的。 - Eric
如果这是正确答案,则作为提问者,您可以将其标记为答案。这有助于后来的其他人查看此问题。 - Rich Ross
调用GraphAPI创建新应用程序,我需要在Azure AD中注册客户端应用程序吗?我需要通过管理门户在Azure AD中创建该客户端应用程序吗?还是有其他方法来解决这个“引导”问题? - Eric
2
嗨Eric,您需要注册客户端ID才能与Graph API通信。 正常的做法是通过Azure管理门户网站完成。 如果您认为自己陷入了“鸡生蛋”情况中,我相信您应该能够使用PowerShell创建服务主体,然后授予该服务主体创建应用程序的权限,但如果符合条件,使用管理门户网站是更清洁的解决方案。 - Shawn Tabrizi
5
嗨,肖恩,"鸡和蛋"的场景对于希望让客户在他们的AAD中轻松创建应用程序描述符的ISV来说是一个问题。目前无法使用PowerShell的New-AzureRmAdApplication来定义应用程序应该访问哪些其他API(管理门户中的"其他应用程序权限"部分)。如果Powershell cmdlets可以下载和上传应用程序的清单,以修改应用程序的所有设置,那将是很棒的。 - RasmusW
显示剩余3条评论

5

我有点晚了,但我最近也遇到了这个挑战。以下是我解决方案中相关的摘录...

首先需要获取认证令牌。你可以使用这个方便的函数来实现。

function GetAuthToken
{
       param
       (
              [Parameter(Mandatory=$true)]
              $TenantName
       )

       $adal = "${env:ProgramFiles(x86)}\Microsoft SDKs\Azure\PowerShell\ServiceManagement\Azure\Services\Microsoft.IdentityModel.Clients.ActiveDirectory.dll"

       $adalforms = "${env:ProgramFiles(x86)}\Microsoft SDKs\Azure\PowerShell\ServiceManagement\Azure\Services\Microsoft.IdentityModel.Clients.ActiveDirectory.WindowsForms.dll"

       [System.Reflection.Assembly]::LoadFrom($adal) | Out-Null

       [System.Reflection.Assembly]::LoadFrom($adalforms) | Out-Null

       $clientId = "1950a258-227b-4e31-a9cf-717495945fc2" 

       $redirectUri = "urn:ietf:wg:oauth:2.0:oob"

       $resourceAppIdURI = "https://graph.windows.net"

       $authority = "https://login.windows.net/$TenantName"

       $authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority

       $authResult = $authContext.AcquireToken($resourceAppIdURI, $clientId,$redirectUri, "Auto")

       return $authResult
}

(引自Paulo Marques的博客https://blogs.technet.microsoft.com/paulomarques/2016/03/21/working-with-azure-active-directory-graph-api-from-powershell/
然后,您可以提交一个POST请求到Azure Active Directory Graph API来创建您的应用程序。但是需要进行一些设置。
# The name of this AAD instance
$global:tenant = "mycompany.onmicorosft.com"
$global:aadSecretGuid = New-Guid
$global:aadDisplayName = "azure-ad-displayname"
$global:aadIdentifierUris = @("https://contoso.com")
$guidBytes = [System.Text.Encoding]::UTF8.GetBytes($global:aadSecretGuid)

$global:aadSecret = @{
    'type'='Symmetric';
    'usage'='Verify';
    'endDate'=[DateTime]::UtcNow.AddDays(365).ToString('u').Replace(' ', 'T');
    'keyId'=$global:aadSecretGuid;
    'startDate'=[DateTime]::UtcNow.AddDays(-1).ToString('u').Replace(' ', 'T');  
    'value'=[System.Convert]::ToBase64String($guidBytes);
}

# ADAL JSON token - necessary for making requests to Graph API
$global:token = GetAuthToken -TenantName $global:tenant
# REST API header with auth token
$global:authHeader = @{
    'Content-Type'='application/json';
    'Authorization'=$global:token.CreateAuthorizationHeader()
}

现在您可以访问图形 API。
$resource = "applications"
$payload = @{
    'displayName'=$global:aadDisplayName;
    'homepage'='https://www.contoso.com';
    'identifierUris'= $global:aadIdentifierUris;
    'keyCredentials'=@($global:aadSecret)
}
$payload = ConvertTo-Json -InputObject $payload
$uri = "https://graph.windows.net/$($global:tenant)/$($resource)?api-version=1.6"
$result = (Invoke-RestMethod -Uri $uri -Headers $global:authHeader -Body $payload -Method POST -Verbose).value

一旦响应返回,您可以提取所需的配置值。

# Extract configuration values
$keyObject = foreach($i in $result.keyCredentials) { $i }

# Tenant ID
$global:aadTenantId = Get-AzureRmSubscription | Select-Object -ExpandProperty TenantId
# Application object ID
$global:aadApplicationObjectId = $result | Select-Object -ExpandProperty objectId
# App ID / Client ID
$global:aadClientId = $result | Select-Object -ExpandProperty appId
# Application Secret/Key
$global:aadAppSecret = $keyObject | Select-Object -ExpandProperty keyId

我希望这能帮助到有需要的人!


很棒的答案,马特;-) - Thomas

2

0

我编写了一些 PowerShell 脚本,它们可以

  • 创建 AAD 应用程序(主要感谢 Matt 的回答)
  • 在 Azure 中创建密钥保管库
  • 在密钥保管库中创建密钥
  • 为 AAD 应用程序分配密钥保管库的权限

我知道这比你要求的更多,但如果像我一样,你有兴趣从应用程序中获取秘钥(也称为密钥)(与你在门户中添加的相同,你必须在再次查看之前复制它),那么second脚本将允许你将其作为负载的一部分显式发送到Graph API的调用中。该脚本将保存该文件供您以后参考。

其他脚本并不是你所询问的内容,但如果您需要设置SQL Server与Azure Key Vault配合使用TDE或列级加密,您可能仍然会发现它们有用。


现在找到了更好的方法。我在这里写了一篇博客:https://sabin.io/blog/adding-an-azure-active-directory-application-and-key-using-powershell/ - bjh1977

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接