2017-07-18 5 views
1

Le code ci-dessous fonctionne lorsque l'authentification fonctionne. Mais lorsque j'essaie d'utiliser le principe de service comme authentification, l'authentification échoue.Impossible d'obtenir le rôle Web classique à l'aide du principe de service dans Azure

Script de travail:

var context = new AuthenticationContext(azureAdUrl + azureADTenant); 
var credential = new UserPasswordCredential(azureUsername, azurePassword); 
var authParam = new PlatformParameters(PromptBehavior.RefreshSession, null); 
var tokenInfo = context.AcquireTokenAsync("https://management.core.windows.net/", azureADClientId, credential); 

TokenCloudCredentials tokencreds = new TokenCloudCredentials(subscriptionId, tokenInfo.Result.AccessToken); 

ComputeManagementClient computeClient = new ComputeManagementClient(tokencreds); 
string deploymentName = computeClient.Deployments.GetBySlot(serviceName, DeploymentSlot.Production).Name; 
string label = computeClient.Deployments.GetBySlot(serviceName, DeploymentSlot.Production).Label; 

ne fonctionne pas:

AuthenticationFailed: Le jeton JWT ne contient pas prévu public uri 'https://management.core.windows.net/'.

ClientCredential cc = new ClientCredential(applicationClientID, accessKey); 
var context = new AuthenticationContext("https://login.windows.net/" + AzureTenantId); 
var tokenInfo = context.AcquireTokenAsync("https://management.azure.com/", cc); 

tokenInfo.Wait(); 

if (tokenInfo == null) 
{ 
    throw new InvalidOperationException("Failed to obtain the JWT token"); 
} 

TokenCloudCredentials tokencreds = new TokenCloudCredentials(subscriptionId, tokenInfo.Result.AccessToken); 

ComputeManagementClient computeClient = new ComputeManagementClient(tokencreds); 
string deploymentName = computeClient.Deployments.GetBySlot(serviceName, DeploymentSlot.Production).Name; 

Répondre

1

Je ne pense pas qu'il est possible d'accéder à des ressources Azure classiques en utilisant un Service Principal.

Les ressources Azure classiques sont gérées via Service Management API qui n'a aucune notion de Service Principal. Il prend uniquement en charge les jetons lorsque le jeton est obtenu pour un administrateur ou un co-administrateur.

Vous devez utiliser le nom d'utilisateur/mot de passe d'un utilisateur réel pour utiliser l'API Service Management.

0

D'après votre code, je l'ai testé de mon côté et je pourrais rencontrer le même problème que vous. Et Gaurav Mantri a fourni la réponse raisonnable. AFAIK, pour les services Azure classiques (ASM), vous pouvez vous référer au Authenticate using a management certificate et télécharger un management API certificate.

Voici mon extrait de code, vous pouvez vous y référer:

CertificateCloudCredentials credential = new CertificateCloudCredentials("<subscriptionId>",GetStoreCertificate("<thumbprint>")); 
ComputeManagementClient computeClient = new ComputeManagementClient(credential); 
string deploymentName = computeClient.Deployments.GetBySlot("<serviceName>", DeploymentSlot.Production).Name; 

Résultat:

enter image description here