2017-07-18 2 views
1

zu erhalten Der folgende Code funktioniert, wo die Authentifizierung funktioniert. Aber wenn ich versuche, das Dienstprinzip als Authentifizierung zu verwenden, schlägt die Authentifizierung fehl.nicht in der Lage, klassische Webrolle mit Service-Prinzip in Azure

Arbeits Script:

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; 

funktioniert nicht:

AuthenticationFailed: Die JWT Token enthält kein Publikum erwartet 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; 

Antwort

1

Ich glaube nicht, es möglich ist, ein Service Principal mit klassischen Azure Ressourcen zuzugreifen.

Klassische Azure-Ressourcen werden über Service Management API verwaltet, die keine Ahnung von Service Principal haben. Es unterstützt nur Token, wenn das Token für einen Administrator oder Co-Administrator abgerufen wird.

Sie müssen den Benutzernamen/das Kennwort eines tatsächlichen Benutzers verwenden, um mit der Service Management API zu arbeiten.

0

Gemäß Ihrem Code habe ich es auf meiner Seite getestet und könnte auf dasselbe Problem stoßen, das Sie angegeben haben. Und Gaurav Mantri hat die vernünftige Antwort gegeben. AFAIK, für klassische Azure Services (ASM), können Sie sich auf Authenticate using a management certificate beziehen und eine management API certificate hochladen.

Hier mein Code-Schnipsel ist, könnten Sie sich darauf beziehen:

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

Ergebnis:

enter image description here