2017-11-29 4 views
0

Hier bekommen möchte ich Daten aus CRM abrufen und haben es in Azure registriert Client-Credentials zu erhalten und es in folgenden Code verwendet:AcquireTokenAsync Methode - Kann das Token ClientCredentials in

using Microsoft.Crm.Sdk.Messages; 
using Microsoft.IdentityModel.Clients.ActiveDirectory; 
using Microsoft.Xrm.Sdk; 
using Microsoft.Xrm.Sdk.WebServiceClient; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace CRM_WebAPI_Test1 
{ 
    class Program 
    { 
     static void Main(string[] atrgs) 
     { 
      MainAsync(); 
     } 
     static async void MainAsync() 
     { 
      try 
      { 
       string organizationUrl = "https://OrgName<<URL>>.com"; 
       string clientId = "xxxxxxxxx-xxxx-xxxx-b7ca-xxxx"; 
       string clientSecret = "key received from Azure App Registration"; 
       string aadInstance = "https://login.microsoftonline.com/"; 
       string tenantID = "orgname"; 

       ClientCredential clientCredentials = new ClientCredential(clientId, clientSecret); 
       AuthenticationContext authenticationContext = new AuthenticationContext(aadInstance + tenantID); 
       AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(organizationUrl, clientCredentials); 
       var requestedToken = authenticationResult.AccessToken; 

       using (var sdkService = new OrganizationWebProxyClient(GetServiceUrl(organizationUrl), false)) 
       { 
        sdkService.HeaderToken = requestedToken; 

        OrganizationRequest request = new OrganizationRequest() 
        { 
         RequestName = "WhoAmI" 
        }; 

        WhoAmIResponse response = sdkService.Execute(new WhoAmIRequest()) as WhoAmIResponse; 
        Console.WriteLine(response.UserId); 

        Console.WriteLine("Press any key to exit..."); 
        Console.ReadLine(); 
       } 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.ToString()); 

       Console.WriteLine("Press any key to exit..."); 
       Console.ReadLine(); 
      } 
     } 
     static private Uri GetServiceUrl(string organizationUrl) 
     { 
      return new Uri(organizationUrl + @"/xrmservices/2011/organization.svc/web?SdkClientVersion=8.2"); 
     } 
    } 
} 

Aber wenn es kommen line:

authenticationResult authenticationResult = erwarten authenticationContext.AcquireTokenAsync (organizationUrl, ClientCredentials);

Es existiert direkt das Programm und keine Ausgabe geben, nicht einmal die Catch-Ausnahme Teil schlagen. Gibt es etwas, was mir hier fehlt?

Wie kann man den Namen des Mandanten bei der Registrierung der Anwendung in Azure AD kennen?

UPDATE: [in Frage aktualisieren, weil nicht in der Lage, so ganze Fehler in Kommentarbereich aufschreiben bitte mit ihm entblößen.] Nach der Anwendung Code-Änderungen als Vorschlag, es Fehler wirft, wie unten:

Microsoft .IdentityModel.Clients.ActiveDirectory.AdalServiceException: AADSTS50001: Die Anwendung mit dem Namen https://orgname.com war , die nicht im Mandanten mydirectory.onmicrosoft.com gefunden wurde. Dies kann passieren, wenn die Anwendung nicht vom Administrator des Mieters installiert wurde oder von einem Benutzer im Mandanten zugestimmt wurde. Sie könnten Ihre Authentifizierungsanfrage an den falschen Mandanten gesendet haben. Trace-ID: 58b1b994-eac3-4209-b553-4cea6a120500 Korrelations-ID: fb8a3f3a-8B0C-4cea-90fa-88ea6e9a7208 Zeitstempel: 2017.11.29 09: 09: 37Z ---> System.Net.Http.HttpRequestException : Der Antwortstatuscode zeigt keinen Erfolg an: 400 (BadRequest). ---> Microsoft.IdentityModel.Clients.ActiveDirectory.AdalException: { "Fehler": "invalid_resource", "ERROR_DESCRIPTION": "AADSTS50001: Die Anwendung https://orgname.com benannt wurde nicht genannt im Mieter gefunden mydirectory.onmicrosoft.com Dies kann der Fall sein, wenn die Anwendung nicht vom Administrator des Tenants installiert oder von einem Benutzer im Mandanten akzeptiert wurde Sie haben möglicherweise Ihre Authentifizierungsanfrage an den falschen Mandanten gesendet. \ R \ nTrace ID: 58b1b994 -eac3-4209-b553-4cea6a120500 \ r \ nKorrelations-ID: fb8a3f3a-8b0c-4cea-90fa-88ea6e9a7208 \ r \ nZeitstempel: 2017-11-29 09: 09: 37Z "," error_codes ": [50001], "timestamp": "2017-11-29 09: 09: 37Z "," trace_id ":" 58b1b994-eac3-4209-b553-4cea6a120500 "," korrelations_id ":" fb8a3f3a-8b0c-4cea-90fa-88ea6e9a7208 "}: Unbekannter Fehler --- Ende der inneren Ausnahmestapelspur --- bei Microsoft.IdentityModel.Clients.ActiveDirectory.HttpClientWrapper.d__31.MoveNext() --- Ende der Ausnahmestapelüberwachung --- bei Microsoft.IdentityModel.Clients.ActiveDirectory.AdalHttpClient.d__22 1.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.IdentityModel.Clients.ActiveDirectory.AdalHttpClient.<GetResponseAsync>d__21 1.MoveNext() - - Ende der Stack-Trace aus früheren Stelle, wo Ausnahme ausgelöst wurde --- bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Aufgabe Aufgabe) bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Aufgabe Aufgabe) bei Microsoft.IdentityModel.Clients.ActiveDirectory.A cquireTokenHandlerBase.d__71.Movenext() --- Ende der Stack-Trace aus früheren Stelle, wo Ausnahme ausgelöst wurde --- bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Aufgabe Aufgabe) bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Aufgabe Aufgabe) bei Microsoft.IdentityModel.Clients.ActiveDirectory.AcquireTokenHandlerBase.d__68.MoveNext() --- Ende der Stack-Trace aus früheren Stelle, wo Ausnahme ausgelöst wurde --- bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task Task) um System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task Aufgabe) um Micros of.IdentityModel.Clients.ActiveDirectory.AcquireTokenHandlerBase.d__59.MoveNext() --- Ende des Stack-Trace vom vorherigen Speicherort, an dem die Ausnahme ausgelöst wurde --- um System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task Task) um System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Aufgabe Aufgabe) bei System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (Task-Task)
bei Microsoft.IdentityModel.Clients.ActiveDirectory.AcquireTokenHandlerBase.d__57.MoveNext() --- Ende des Stack-Trace vom vorherigen Speicherort, an dem die Ausnahme ausgelöst wurde --- unter System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task Aufgabe) bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Aufgabe Aufgabe) bei Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.d__33.MoveNext() --- Ende des Stack-Trace aus früheren Stelle, wo Ausnahme war geworfen --- bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Aufgabe Aufgabe) bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Aufgabe Aufgabe) bei Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.d__58. MoveNext() --- Ende der Stapelverfolgung von der vorherigen Position, an der die Ausnahme ausgelöst wurde --- unter System .Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Aufgabe Aufgabe) bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Aufgabe Aufgabe) bei System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() bei CRM_WebAPI_Test1.Program.d__1 .MoveNext() in E: \ VS_2015 \ CRM Projects \ CRM_WebAPI_Test1 \ CRM_WebAPI_Test1 \ Program.cs: Linie 31 Error-Code: invalid_resource Statuscode: 400

+0

Ist 'organizationUrl' etwas wie:' https: // contoso.crm.dynamics.com'? – juunas

+0

Nein, es ist der Testaccount, den ich mit meiner Organisation erstellt habe, anstatt "contoso.crm" ist es anders, Rest ist gleich. –

+0

Okay, nun sollte der URI 'https: // deinOrganisationsname.crm.dynamics.com' sein. – juunas

Antwort

1

Erstens, verwenden Sie eine async void-Funktion, die Sie sollte nicht (außer in Ereignishandlern, wo Sie die Methodensignatur nicht beeinflussen können).

So sollte es so etwas sein:

static void Main(string[] atrgs) 
{ 
    MainAsync().GetAwaiter().GetResult(); 
} 
static async Task MainAsync() 
{ 
} 

im Code Im Wesentlichen, wenn es eine await trifft, gibt es an Main und das Programm beendet.

In C# 7.2 können Sie auch die Hauptmethode als async Task deklarieren, so können Sie nur die Methode await.

Sie können den Tenant ID von Azure-Portal abrufen.

  1. öffnen Azure AD Klinge
  2. Zum Eigenschaften
  3. können Sie den Mieter-ID finden

Die andere Option ist jede prüft Domain-Namen zu verwenden (wie mydirectory.onmicrosoft.com).

+0

Code-Vorschlag löste mein 1. Problem, aber danach wirft es den Fehler, wie in der Frage aktualisiert. –

Verwandte Themen