API управления Azure не может пройти проверку подлинности с использованием ADAL - PullRequest
0 голосов
/ 05 сентября 2018

Я ищу способ запретить нашим облачным службам в среде разработки оплачиваться в нерабочее время.

Ресурсы, которые я обнаружил, указывают на то, что для облачной службы счет прекращается при удалении развертывания.

Мы хотим загрузить конфигурацию развернутого облачного сервиса и файл пакета в местоположение большого двоичного объекта и удалить развертывание, чтобы остановить выставление счетов. Когда мы хотим использовать их снова, мы хотим развернуть их из местоположения BLOB-объекта. Мы хотим использовать скрипт Powershell для остановки (загрузки и удаления) и для запуска (повторного развертывания резервной копии).

Я нашел несколько статей, объясняющих, как загрузить файл конфигурации с помощью ADAL и API отдыха управления Azure.

Аутентификация, кажется, проблема. Когда я выполняю свой скрипт: я получаю сообщение об ошибке: Invoke-RestMethod: запрещенная ошибка. Серверу не удалось аутентифицировать запрос. Убедитесь, что сертификат действителен и связан с этой подпиской. В строке: 78 символов: 25 + ... SourceKey = Invoke-RestMethod -Metod POST -Headers $ requestheader -U ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~ + CategoryInfo: InvalidOperation: (System.Net.HttpWebRequest: HttpWebRequest) [Invoke-RestMethod], WebException + FullyQualifiedErrorId: WebCmdletWebResponseException, Microsoft.PowerShell.Commands.InvokeRestMethodCommand

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

####### RESOURCES #######
# 1. https://www.magnetismsolutions.com/blog/jaredjohnson/2014/11/10/download-microsoft-azure-cloud-service-package-files
# 2. https://docs.microsoft.com/en-us/previous-versions/azure/reference/jj154121(v%3dazure.100)
# 3. https://www.powershellgallery.com/packages/Microsoft.ADAL.PowerShell/1.12
# 4. https://blogs.technet.microsoft.com/keithmayer/2014/12/30/leveraging-the-azure-service-management-rest-api-with-azure-active-directory-and-powershell-list-azure-administrators/
# 5. https://www.powershellmagazine.com/2014/12/24/using-azure-resource-management-rest-api-in-powershell/
# 6. https://shawntabrizi.com/aad/azure-ad-authentication-with-powershell-and-adal/
# https://www.codeisahighway.com/how-to-easily-and-silently-obtain-accesstoken-bearer-from-an-existing-azure-powershell-session/
#####
# Error: The server failed to authenticate the request. Verify that the certificate is valid and is associated with this subscription.
#####
# https://github.com/Azure/azure-xplat-cli/issues/2040
# https://blogs.msdn.microsoft.com/goutham/2015/06/16/azure-powershell-forbiddenerror-the-server-failed-to-authenticate-the-request-verify-the-certificate-is-valid-and-is-associated-with-this-subscription/
# https://ulvbjornsson.com/2017/07/03/microsoft-azure-azure-powershell-forbiddenerror-the-server-failed-to-authenticate-the-request/
#########################


$Azure = Get-AzureRmEnvironment 'AzureCloud'
$Env = Login-AzureRmAccount -Environment $Azure -Verbose 
$Global:SubscriptionName = "SubscriptionName"

Set-AzureRmContext -Subscription $Global:SubscriptionName

Function RESTAPI-Auth 
{
    $Subscription = Get-AzureRmSubscription -SubscriptionName $Global:SubscriptionName

    # Load ADAL Azure AD Authentication Library Assemblies
    $adal = "C:\Git\Spike\Microsoft.ADAL.PowerShell\2.28\Microsoft.IdentityModel.Clients.ActiveDirectory.dll" 
    $adalforms = "C:\Git\Spike\Microsoft.ADAL.PowerShell\2.28\Microsoft.IdentityModel.Clients.ActiveDirectory.WindowsForms.dll" 
    [System.Reflection.Assembly]::LoadFrom($adal)
    [System.Reflection.Assembly]::LoadFrom($adalforms)

    $adTenant = $Subscription.TenantId
    $global:SubscriptionID = $Subscription.SubscriptionId

    # Set well-known client ID for Azure PowerShell
    $clientId = "1950a258-227b-4e31-a9cf-717495945fc2"

    # Set redirect URI for Azure PowerShell
    $redirectUri = "urn:ietf:wg:oauth:2.0:oob"

    # Set Resource URI to Azure Service Management API
    $resourceAppIdURI = "https://management.core.windows.net/"

    # Authenticate and Acquire Token

    # Set Authority to Azure AD Tenant
    $authority = "https://login.windows.net/$adTenant"

    # Create Authentication Context tied to Azure AD Tenant
    $authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority

    # Acquire token
    $global:authResult = $authContext.AcquireToken($resourceAppIdURI, $clientId, $redirectUri, "Auto")
}

#https://docs.microsoft.com/en-us/previous-versions/azure/reference/jj154121(v%3dazure.100)
Function GetAuditingServicePackage() 
{ 
    $Subscription = Get-AzureRmSubscription -SubscriptionName $Global:SubscriptionName

    # Create Authorization Header
    $authHeader = $global:authResult.CreateAuthorizationHeader()

    # Set HTTP request headers to include Authorization header
    $requestHeader = @{
        "x-ms-version" = "2012-03-01"; 
        "ContentLength"= "0";
        "Authorization" = $authHeader
    }

    $CloudServiceName = "CloudServiceName"
    $DeploymentId = "DeploymentIdCopiedFromTheAzurePortal" 
    $TempBlobStorageContainerUri = "TheBlobLocationUri"

    $Uri = "Https://management.core.windows.net/$Subscription.SubscriptionId/services/hostedservices/$CloudServiceName/deployments/$DeploymentId/package?containerUri=$TempBlobStorageContainerUri"
    $Global:SourceKey = Invoke-RestMethod -Method POST -Headers $requestheader -Uri $Uri 
}



RESTAPI-Auth
$global:authResult

##########################################################################################
#######################      Rest API against Azure Classic     ##########################
##########################################################################################
GetAuditingServicePackage

В окне вывода я вижу, что токен доступа на предъявителя получен. Я проверил с помощью Fiddler, что этот токен был добавлен в заголовок при отправке запроса в API управления.

Может кто-нибудь объяснить, почему я получил эту ошибку и предоставить решение, как ее исправить?

Спасибо, Марк

1 Ответ

0 голосов
/ 05 сентября 2018

Попробуйте очистить свой профиль Azure

Clear-AzureProfile

Немного больше деталей доступно здесь

...