Библиотека MSAL с помощью powershell для кэша токенов azure devops проблема

#powershell #authentication #caching #azure-devops #msal

Вопрос:

Я использую библиотеку MSAL для извлечения токена для разработчиков azure. Я пишу сценарий powershell.

Проблема в том, что он просит выбрать/перезапустить, если я закрою текущую сессию powersell7 и снова откроюсь. он не использует автоматически токен get автоматически. он отлично работает в том же сеансе, он правильно принимает токен молча, проблема возникает, если я закрою и снова открою окно powershell. как я могу кэшировать и в следующем сеансе?

 
[string[]] $Scopes = "$adoResourceId/.default";
[Microsoft.Identity.Client.IPublicClientApplication] $app = [Microsoft.Identity.Client.PublicClientApplicationBuilder]::Create($ClientId).Build();

[ContextHelper]::Account = $app.GetAccountsAsync().GetAwaiter().GetResult() | Select-Object -First 1
$tokenSource = New-Object System.Threading.CancellationTokenSource
$taskAuthenticationResult = $null
try {
    $AquireTokenParameters = $app.AcquireTokenSilent($Scopes, [ContextHelper]::Account)
    $taskAuthenticationResult = $AquireTokenParameters.ExecuteAsync($tokenSource.Token)
    if ($taskAuthenticationResult.exception.message -like "*errors occurred*") {
        $AquireTokenParameters = $app.AcquireTokenInteractive($Scopes)
        $taskAuthenticationResult = $AquireTokenParameters.ExecuteAsync($tokenSource.Token)
    }
}
catch {
    $AquireTokenParameters = $app.AcquireTokenInteractive($Scopes)
    $taskAuthenticationResult = $AquireTokenParameters.ExecuteAsync($tokenSource.Token)
}
if ($taskAuthenticationResult.Result) {
    $result = $taskAuthenticationResult.Resu<
}
 

Спасибо

Ответ №1:

Боюсь, что вы не сможете, учетные данные не будут кэшироваться локально, требуется интерактивный вход при открытии нового сеанса PowerShell.

На самом деле, нет необходимости использовать такой сложный способ получения маркера для Azure DevOps, для этого можно просто использовать Azure PowerShell, пожалуйста, выполните следующие действия.

  1. Следуйте этому документу, чтобы установить Az модуль powershell.
  2. Используйте Connect-AzAccount для входа в свою учетную запись пользователя.
  3. Используйте Get-AzAccessToken для получения маркера для Azure DevOps 499b84ac-1321-427f-aa17-267ca6975798 идентификатор ресурса Azure DevOps.

    Get-AzAccessToken -ResourceUrl "499b84ac-1321-427f-aa17-267ca6975798"

    введите описание изображения здесь

  4. После входа в Azure PowerShell он сохранит пользовательский контекст в виде AzureRmContext.json файла в ~/.azure локальном пути. Поэтому, если вы закроете сеанс powershell и откроете новый с помощью powershell 7, вам не нужно будет снова входить в систему. Вы могли бы использовать Get-AzContext для быстрой проверки, а затем снова получить жетон, он отлично работает на моей стороне.

    введите описание изображения здесь

Комментарии:

1. Спасибо за ответ Джой. Get-AzContext будет работать только в том случае, если пользователь подключен к рекламе. что делать, если пользователь не подключен к рекламе?

2. @ArvindSingh Да, вы правы, так как powershell по сути использует /organizations конечную точку в URL-адресе запроса. Если учетная запись пользователя не находится в AAD, вы можете пригласить ее в AAD, следуйте этому документу .

3. @ArvindSingh После принятия приглашения и перед получением токена убедитесь, что вы вошли в систему с правильным арендатором Connect-AzAccount -Tenant <AAD tenant-id> или используете Set-AzContext -Tenant <AAD tenant-id> его после входа. Вошедший в систему AAD должен быть тем, для которого была создана резервная копия организации Azure devops, в противном случае токен не будет работать.

4. Привет @Joy еще раз спасибо за ваш ценный комментарий. Я делаю то же самое, используя ADAL, и он отлично работает с PS5, даже после закрытия PS ISE и повторного открытия, он не запрашивает повторный выбор/повторный вход, он автоматически использует последний использованный идентификатор входа. код: « $PromptBehavior = [Microsoft. Идентификационная модель. Клиенты. ActiveDirectory. PromptBehavior]::Авто;$Параметры платформы = Новый объект Microsoft. Идентификационная модель. Клиенты. ActiveDirectory. Параметры платформы-список аргументов $PromptBehavior; $результат = $ctx. AcquireTokenAsync($adoResourceId, $ClientID, [Uri]::новый($replyUri),$Параметры платформы). Результат; «

5. Я не могу приглашать и добавлять, если учетная запись пользователя не находится в AAD. не удается использовать Connect-AzAccount и azcontext