如何以编程方式将应用程序添加到 Azure AD?

How to add application to Azure AD programmatically?

我想在 Azure AD 中自动创建我的应用程序并取回 Azure AD 生成的客户端 ID。

是否有 PowerShell commandlet 可以执行此操作?除了管理控制台之外,还有其他方法吗,比如 API?

你能举个例子吗?

谢谢!

您可以通过多种方式在 AAD 中以编程方式创建应用程序。我将简要介绍执行此操作的两种不同方式:PowerShell CMDLET 和图形 API。总的来说,我强烈建议为此使用图表 API。

PowerShell:

周围有一些不同的模块 运行 能够创建 AAD Applications/Service 主体。如果您需要在您的租户中创建一个新的应用程序对象,您可以使用 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/en-us/library/azure/jj151815.aspx

https://msdn.microsoft.com/en-us/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

我们有示例展示了如何注册和创建应用程序以定位 Graph API,并使用 Graph Client Library 来帮助您正确调用 API:

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

希望对您有所帮助!

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

首先您需要获取身份验证令牌。为此,您可以使用这个方便的功能。

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/

然后您可以向 Azure Active Directory Graph API 提交 POST 请求以创建您的应用程序。但是需要一些设置。

# 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

希望对大家有所帮助!

我写了一些 powershell scripts 它将

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

我知道这超出了您的要求,但是如果您像我一样有兴趣从应用程序中取回 秘密(又名密钥) (您在门户中添加的那个,您必须复制它才能再次看到它),然后 second 脚本将允许您在调用 Graph [= 时将其作为有效负载的一部分显式发送31=]。该脚本会将其保存到一个文件中供您稍后参考。

其他脚本并不是您真正要问的,但如果您需要设置 SQL 服务器以与用于 TDE 或列级的 Azure Key Vault 一起工作,您可能仍然会发现它们很有用加密。

Microsoft 发布了几个额外的 PowerShell cmdlet 来注册应用程序和设置凭据:

New-AzureRmADApplication
New-AzureRmADServicePrincipal
New-AzureRmRoleAssignment 
Add-AzureADApplicationCredential 

请查看他们的文档: https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-authenticate-service-principal