簡體   English   中英

VSTS Build和PowerShell和AzureAD身份驗證

[英]VSTS Build and PowerShell and AzureAD Authentication

我有一個VSTS項目,該項目通過服務主體通過Azure資源管理器終結點連接到Azure訂閱。 對於通過模板化,參數驅動的部署配置ARM資源的我的構建而言,這工作得很好。

作為構建的一部分,我還有其他要求設置Azure AD組。 我有一個可以在本地計算機上正常運行的腳本。 當我通過構建部署它並在托管的構建控制器上執行該腳本時,最初無法找到AzureAD模塊。 我通過將腳本包含在git Repo中並通過以下方式訪問它來解決此問題:

$adModulePath = $PSScriptRoot + "\PsModules\AzureAD\2.0.0.131\AzureAD.psd1"
Import-Module $adModulePath 

但是,現在在運行New-AzureADGroup時遇到另一個問題。 該腳本要求在發出命令之前運行Connect-AzureAD 通過對憑證進行硬編碼可以很好地實現此目的,但是我不想這樣做,我希望它在創建的SPN的上下文中運行,該SPN在托管的構建控制器上運行腳本。

因此,問題是,是否可以獲取Azure PowerShell執行SPN的當前上下文並將其傳遞給Connect-AzureAD以避免將憑據存儲為純文本? 我錯過了一個把戲嗎? 還有其他選擇嗎?

我當前的代碼如下,注釋的連接在命令中可以像硬編碼值一樣正常工作。 沒有參數的調用將顯示登錄UI,該UI終止構建,因為它顯然不是交互式的。

## Login to Azure
#$SecurePassword = ConvertTo-SecureString $AdminPassword -AsPlainText -Force
#$AdminCredential = New-Object System.Management.Automation.PSCredential ($AdminUserEmailAddress, $SecurePassword)
#Connect-AzureAD -Credential $AdminCredential

Connect-AzureAD

Write-Output "------------------ Start: Group Creation ------------------"

$TestForAdminGroup = Get-AzureADGroup -SearchString $AdminGroup
$TestForContributorGroup = Get-AzureADGroup -SearchString $ContributorGroup
$TestForReaderGroup = Get-AzureADGroup -SearchString $ReaderGroup

謝謝

這個有可能。 今天就可以為我自己發布的VSTS擴展程序工作了。 我的擴展程序使用Azure Resource Manager endpoint作為輸入。

現在,使用以下代碼在Microsoft Hosted Visual Studio 2017代理池上運行它。 有關更多信息,請參見有關如何在VSTS代理上使用AzureAD PowerShell cmdlet的信息

Write-Verbose "Import AzureAD module because is not on default VSTS agent"
$azureAdModulePath = $PSScriptRoot + "\AzureAD\2.0.1.16\AzureAD.psd1"
Import-Module $azureAdModulePath 

# Workaround to use AzureAD in this task. Get an access token and call Connect-AzureAD
$serviceNameInput = Get-VstsInput -Name ConnectedServiceNameSelector -Require
$serviceName = Get-VstsInput -Name $serviceNameInput -Require
$endPointRM = Get-VstsEndpoint -Name $serviceName -Require

$clientId = $endPointRM.Auth.Parameters.ServicePrincipalId
$clientSecret = $endPointRM.Auth.Parameters.ServicePrincipalKey
$tenantId = $endPointRM.Auth.Parameters.TenantId

$adTokenUrl = "https://login.microsoftonline.com/$tenantId/oauth2/token"
$resource = "https://graph.windows.net/"

$body = @{
    grant_type    = "client_credentials"
    client_id     = $clientId
    client_secret = $clientSecret
    resource      = $resource
}

$response = Invoke-RestMethod -Method 'Post' -Uri $adTokenUrl -ContentType "application/x-www-form-urlencoded" -Body $body
$token = $response.access_token

Write-Verbose "Login to AzureAD with same application as endpoint"
Connect-AzureAD -AadAccessToken $token -AccountId $clientId -TenantId $tenantId

最后,Powershell模塊不能共享相同的上下文,您需要將憑據存儲在VSTS的secret變量中。

為了更進一步,可以通過以下示例3使用服務主體:

https://docs.microsoft.com/zh-cn/powershell/module/azuread/connect-azuread?view=azureadps-2.0

創建自簽名證書並附加它之后,您可以通過傳遞證書的指紋以及其他幾個參數來連接到Azure AD:

Connect-AzureAD -TenantId $ tenantId -ApplicationId $ sp.AppId -CertificateThumbprint $ thumb

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM