Cette question est très similaire à this one où créer un script PowerShell pour s'authentifier en tant qu'application client natif. Cependant, dans cette situation, il existe des différences subtiles et importantes car vous souhaitez vous authentifier en tant que client confidentiel. Plus précisément, nous devons créer un Client Credential
afin que nous puissions nous authentifier sans un utilisateur en tant que Daemon Application.
Vous devez d'abord télécharger et enregistrer les dlls .NET pour ADAL. Le lien de téléchargement peut être trouvé sur Nuget.
Remarque: Nous utilisons spécifiquement ADAL v2 ici.
Vous pouvez extraire le contenu du .nupkg avec un extracteur de fichiers comme 7z, WinZip, etc ...
extraire le contenu de \lib\net45\
et les copier dans votre répertoire de travail. J'ai mis les fichiers dans leur propre dossier "ADAL", pour le garder séparé.
alors vous devriez être en mesure de créer un nouveau script PowerShell qui suit:
# Load ADAL
Add-Type -Path ".\ADAL\Microsoft.IdentityModel.Clients.ActiveDirectory.dll"
# Output Token and Response from AAD Graph API
$accessToken = ".\Token.txt"
$output = ".\Output.json"
# Application and Tenant Configuration
$clientId = "<AppIDGUID>"
$tenantId = "<TenantID>"
$resourceId = "https://graph.windows.net"
$login = "https://login.microsoftonline.com"
# Create Client Credential Using App Key
$secret = "<AppKey>"
# Create Client Credential Using Certificate
#$certFile = "<PFXFilePath>"
#$certFilePassword = "<CertPassword>"
#$secret = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate -ArgumentList $certFile,$certFilePassword
# Get an Access Token with ADAL
$clientCredential = New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential($clientId,$secret)
$authContext = New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext("{0}/{1}" -f $login,$tenantId)
$authenticationResult = $authContext.AcquireToken($resourceId, $clientcredential)
($token = $authenticationResult.AccessToken) | Out-File $accessToken
# Call the AAD Graph API
$headers = @{
"Authorization" = ("Bearer {0}" -f $token);
"Content-Type" = "application/json";
}
Invoke-RestMethod -Method Get -Uri ("{0}/{1}/users?api-version=1.6" -f $resourceId,$tenantId) -Headers $headers -OutFile $output
Note: Vous devez mettre à jour l'ID App, ID locataire, et votre application Les informations secrètes dans ce script. Si vous utilisez un certificat pour vous authentifier, commentez simplement le code qui utilise la clé d'application et annulez le commentaire sur le code qui utilise le certificat. J'ai également préconfiguré l'appel de l'API AAD Graph pour renvoyer les utilisateurs dans mon locataire, mais vous pouvez changer cet appel REST pour ce que vous voulez.
Après avoir exécuté avec succès le script, vous devriez obtenir 2 nouveaux fichiers dans votre répertoire de travail: Un fichier texte qui contient votre jeton d'accès encodée JSON, qui peuvent être base64 décodés sur des sites comme this, et un fichier JSON avec le réponse de l'API AAD Graph. Faites-moi savoir si cela aide!
Ne serait-il pas plus simple d'utiliser simplement Invoke-RestMethod sur le point de terminaison de jeton avec l'ID client, le secret et la ressource? Pas besoin d'ADAL si vous utilisez les informations d'identification du client. – juunas
Ouais, cela signifie vraiment plus pour le scénario de certificat, mais il est si facile d'envelopper dans la clé de l'application, j'ai décidé de l'inclure aussi bien. –
@juunas En outre, l'utilisation de 'client_secret' mène généralement à des secrets qui traînent en clair dans les scripts, qui ont tendance à être (sur) partagés et sont globalement mal gérés.L'utilisation de certificats implique la nécessité de créer une assertion signée (ce que ADAL fait merveilleusement facilement), mais élimine les secrets dans les scripts eux-mêmes. –