-1

J'essaie d'effectuer des tests très rapides sur Azure Active Directory et je souhaite utiliser une application Daemon pour accéder à l'API Graph sans avoir besoin d'un utilisateur présent pour s'authentifier. Je veux vérifier que mon enregistrement d'application peut s'authentifier avec succès à AAD, que le secret de mon client est valide, et faire des appels à l'API AAD Graph.Comment puis-je m'authentifier auprès d'AAD et appeler l'API Graph en tant qu'application démon avec PowerShell?

J'ai déjà enregistré une "application Web/API" dans mon répertoire, et je l'ai configuré pour avoir les permissions appropriées pour appeler l'API AAD Graph dans le contexte App Only. J'ai également généré une clé d'application/un certificat pour mon application afin que je puisse m'authentifier en tant que client confidentiel.

Je veux jeter un oeil à mon Token AAD, et la sortie de l'API graphique après mon appel. Comment puis-je utiliser PowerShell pour y parvenir rapidement?

Répondre

1

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!

+0

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

+0

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. –

+1

@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. –