Erzeugen des Bearer Tokens für die Authentifizierung gegen Azure über REST mit Benutzername und Passwort – Machbarkeitstest
Es ist nicht so einfach, den Bearer Token für die Authentifizierung gegen Azure mal eben schnell zu erhalten. Gebraucht wird er jedoch für REST Calls gegen die Azure Dienste – und hier gibt es einige Funktionen, die über PowerShell nicht direkt erreichbar sind.
Standardgemäß wird eine Anwendung erstellt, die vor der Authentifizierung im Azure AD registriert werden muss. Es gibt jedoch einen weiteren Weg, den PowerShell benutzt: Der Befehl „Login-AzureRmAccount“ meldet einen Benutzer an Azure direkt an – nur mit Name und Passwort und ohne Registrierung. Leider gibt er jedoch nicht das Token zurück. Der PowerShell Befehl benutzt eine integrierte „well-known“ Client ID, mit der diese Authentifizierung gelingt. Daran angelehnt ermöglicht folgende Vorgehensweise die Ermittlung des Tokens:
1
2
3
4
5
6
7
8
9
10
|
$AccountName = "srvAccount-Desktops@xxxxxxxxxxxxxxxxxxxxxxx.onmicrosoft.com" $Password = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" $PayLoad = "resource=https://management.core.windows.net/&client_id=1950a258-227b-4e31-a9cf-717495945fc2&grant_type=password&username=" + $AccountName + "&scope=openid&password=" + $Password $Response = Invoke-WebRequest -Uri "https://login.microsoftonline.com/Common/oauth2/token" -Method POST -Body $PayLoad $ResponseJSON = $Response |ConvertFrom -Json $ResponseJSON |
Achtung: Diese Methode ist nur fürs Testen. Ändert Microsoft etwas, kann diese Methode nicht mehr funktionieren. Ich bin mir auch nicht sicher, ob es erlaubt/gewollt ist, die Client ID zu verwenden.
Empfehlung: Ich verwende einen Funktions Account im zugehörigen Azure AD. Damit verhindere ich Probleme, die bei der Verwendung meines Accounts marcel.meurer@sepago.de entstehen können. Grund ist, dass mein Account sowohl ein persönlicher als auch ein Business Account ist und die Zuordnung über diesen Weg nicht gelingt.
Ein kurzer Test: Anzeigen aller Subscriptions in dem der Account berechtigt ist:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
$Headers = New-Object "System.Collections.Generic.Dictionary" $Headers .Add( "Authorization" , "Bearer " + $ResponseJSON .access_token) $ResponseSubscriptions = Invoke-WebRequest -Uri "https://management.azure.com/subscriptions?api-version=2015-01-01" -Method GET -Headers $Headers $ResponseSubscriptionsJSON = $ResponseSubscriptions |ConvertFrom -Json $ResponseSubscriptionsJSON .value Output: -------------------------------------------- id : /subscriptions/31x00b3-9b23-451c-a041-xxxxxxxaead subscriptionId : 31xx00b3-9b23-451c-a041-xxxxxxxxxxaead displayName : Microsoft MVP Program state : Enabled subscriptionPolicies : @{locationPlacementId=Public_2014-09-01; quotaId=MSDN_2014-09-01; spendingLimit=On} |