2016-05-13 43 views
11

Ich versuche, auf eine Dynamics CRM Online-REST-API mit Azure AD oAuth 2-Authentifizierung zuzugreifen. Um das zu tun, so folgte ich vor:

- Ich habe eine Web-Anwendung und/oder Web-api in Azure
- konfiguriert, um die Berechtigungen für Dynamics CRM Tragene Berechtigungen „Zugriff CRM Online als Organisation Benutzer“ haben
- Und erstellt einen Schlüssel mit einem Ablaufdatum von 1 Jahr und hielt die Client-ID generiert.

Nachdem die Web-App auf Azure konfiguriert wurde Ich habe eine Konsolenanwendung in .NET/C# erstellt, die ADAL verwendet eine einfache Anfrage zu machen, in diesem Fall eine Liste der Konten abzurufen:

401- Nicht autorisierte Authentifizierung mit REST API Dynamics CRM mit Azure AD

class Program 
{ 
    private static string ApiBaseUrl = "https://xxxxx.api.crm4.dynamics.com/"; 
    private static string ApiUrl = "https://xxxxx.api.crm4.dynamics.com/api/data/v8.1/"; 
    private static string ClientId = "2a5dcdaf-2036-4391-a3e5-9d0852ffe3f2"; 
    private static string AppKey = "symCaAYpYqhiMK2Gh+E1LUlfxbMy5X1sJ0/ugzM+ur0="; 

    static void Main(string[] args) 
    { 
     AuthenticationParameters ap = AuthenticationParameters.CreateFromResourceUrlAsync(new Uri(ApiUrl)).Result; 

     var clientCredential = new ClientCredential(ClientId, AppKey); 

     var authenticationContext = new AuthenticationContext(ap.Authority); 
     var authenticationResult = authenticationContext.AcquireToken(ApiBaseUrl, clientCredential); 

     var httpClient = new HttpClient(); 
     httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authenticationResult.AccessToken); 

     var result = httpClient.GetAsync(Path.Combine(ApiUrl, "accounts")).Result;   
    } 
} 

Ich erhalte ein Access-Token erfolgreich, aber wenn ich versuche, einen httprequest zu CRM zu tun, bekomme ich immer eine 401 - Unauthorized Statuscode. Was vermisse ich?

+0

ich seine falschen Berechtigungen auf dem Token glauben. Was Sie tun, ist die Verwendung von Anmeldeinformationen für die Anwendung, um contain zu erhalten. Die Berechtigungen, die Sie beim Hinzufügen von CRM ausgewählt haben, waren delegierte PErmissions. Beides sind verschiedene Dinge. Was passiert, wenn Sie User Creds eines Benutzers im selben Verzeichnis verwenden, um sich zu authentifizieren und darauf zuzugreifen? –

+0

Ich habe bereits eine native Clientanwendung erstellt, mit der ich erfolgreich in CRM integriert habe, aber ich musste Benutzeranmeldeinformationen bereitstellen, um ein Token von Azure zu erhalten. Mein Ziel ist es, die Verwendung von Benutzeranmeldeinformationen überhaupt zu vermeiden. Zu diesem Zweck versuche ich ein Token durch Schlüsselaustausch (die Methode, die ich in der Post erklärt habe) oder durch ein Zertifikat zu bekommen. – AndreCavaca

+0

Haben Sie das überprüft? https://msdn.microsoft.com/en-us/library/gg327838.aspx –

Antwort

3

1 Jahr und 2 Monate später dieser gleiche Code funktioniert perfekt. Wie bereits erwähnt, hat Dynamics 365 inzwischen die Server-to-Server (S2S) -Authentifizierung unterstützt. Der einzige Schritt, den ich machen musste, war, einen Anwendungsbenutzer zu erstellen. Weitere Informationen darüber, wie diese Authentifizierungs Arbeit Überprüfung dieser Website zu machen: https://msdn.microsoft.com/en-us/library/mt790170.aspx

+0

Kannst du bitte ein paar mehr Details darüber erzählen, wie du es zum Laufen gebracht hast? Ich bin im selben Boot und versuche, client_credentials Grant-Typ zu verwenden, um Zugriff auf d365 Web-API? –

0

Ihre ClientId, AppKey von Azure, so sollten ap.Authorityhttps://login.microsoftonline.com/tenantid in seine var authenticationContext = new AuthenticationContext(ap.Authority);

+0

Ich habe versucht, die URL zu verwenden, die Sie vorgeschlagen, aber ich werde immer noch nicht autorisiert. Die angeforderte Nachricht wurde generiert, wobei das Token durch TOKEN ersetzt wurde: {Methode: GET, RequestUri: 'https://xxxxx.api.crm4.dynamics.com/api/data/v8.1/accounts' , Version: 1.1, Inhalt: , Headers: { Berechtigung: Bearer TOKEN }} – AndreCavaca

+0

Haben Sie versucht, Manifest herunterzuladen und die JSON-Datei zu öffnen und die Zeile: "oauth2AllowImplicitFlow": false, und falsch ändern true und lade die Datei hoch. –

+0

Ja, ich habe das auch versucht .. = ( – AndreCavaca

0

Ich glaube nicht, Sie in der Lage sein werden, herum zu erhalten Benutzer-Credentials Bereitstellung zumindest eine Art „Integration Konto“.

using Microsoft.IdentityModel.Clients.ActiveDirectory; 
using System; 
using System.IO; 
using System.Net; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     private static string API_BASE_URL = "https://<CRM DOMAIN>/"; 
     private static string API_URL = "https://<CRM DOMAIN>/api/data/v8.1/"; 
     private static string CLIENT_ID = "<CLIENT ID>"; 

     static void Main(string[] args) 
     { 
      var userCredential = new UserCredential("<USERNAME>", "<PASSWORD>"); 
      var authContext = new AuthenticationContext("https://login.windows.net/common", false); 
      var result = authContext.AcquireToken(API_BASE_URL, CLIENT_ID, userCredential); 

      var httpClient = HttpWebRequest.CreateHttp(Path.Combine(API_URL, "accounts")); 
      httpClient.Headers.Add(HttpRequestHeader.Authorization, "Bearer:" + result.AccessToken); 
      using (var sr = new StreamReader(httpClient.GetResponse().GetResponseStream())) 
      { 
       Console.WriteLine(sr.ReadToEnd()); 
      } 

      Console.ReadLine(); 
     } 
    } 
} 

Hinweis: Sie können mit dem folgenden eine traditionellere Popup/Redirect OAUTH Fluss vermeide ich eine ältere Version von ADAL bin mit (2.19.208020213), wie es der password Parameter erscheint ist aus dem UserCredential Konstruktor genommen worden .

BEARBEITEN: CRM unterstützt nun Server to Server Authentication, mit denen Sie einen Anwendungsbenutzer erstellen können.

-1

Der CRM 365-Webdienst scheint keinen App-Only-Token-Zugriff zuzulassen.

Beweis # 1: Es gibt keine Anwendungsberechtigungen für die Dynamics CRM Online-API in Azure.

(see screenshot)

Evidence # 2: Per Anweisungen des MSDN für 365 Web-Service zu Microsoft Dynamics verbinden OAuth - „Autorisierung genehmigt wird, wenn ein gültigen OAuth 2.0 (Benutzer) Zugriffstoken, herausgegeben von Microsoft Azure Active Directory, wird in den Headern der Nachrichtenanforderungen bereitgestellt. "

Das bedeutet, dass Sie Anmeldeinformationen für einen Benutzeraccount angeben müssen, der über entsprechenden Zugriff auf CRM verfügt. App-only wird nicht ausgeführt. Weitere Informationen dazu finden Sie unter this CRM Online community thread.

+0

) Eine Erklärung für die Down-Abstimmung?Beweise mich auf jeden Fall falsch. – Tracy

3

Ich rate Ihnen, sich die Server-zu-Server (S2S) -Authentifizierung anzusehen, die zu Dynamics 365 in der neuesten Version hinzugefügt wurde.

Mit S2S benötigen Sie keine bezahlte Dynamics 365-Lizenz. Anstelle von Benutzeranmeldeinformationen wird die Anwendung basierend auf einem Dienstprinzipal authentifiziert, das durch einen Azure AD-Objekt-ID-Wert identifiziert wird, der im Benutzerdatensatz der Dynamics 365-Anwendung gespeichert ist.

Weitere Informationen finden Sie hier: https://msdn.microsoft.com/en-us/library/mt790168.aspx https://msdn.microsoft.com/en-us/library/mt790170.aspx

0

Sie können einen Anwendungsbenutzer Set-up innerhalb CRM müssen sich mit Ihrem Azure-Anwendung anzupassen: https://msdn.microsoft.com/en-us/library/mt790170.aspx

Während Sie Ihre Inhaber bekommen Token-Setup in C#, die Webanforderung an die CRM-Ressource kann aufgrund von Berechtigungen auf CRM-Ebene fehlschlagen.

+0

Ich habe einen Anwendungsbenutzer mit der gleichen App-ID und der entsprechenden Sicherheitsrolle eingerichtet. Ich kann ein Bearer-Token mithilfe der oauth-Client-Berechtigungsnachweis-Berechtigung erstellen, aber wenn ich versuche, es zu verwenden, erhalte ich eine 401-Berechtigung. Völlig nicht sicher, was ich falsch mache. –

2

Vielen Dank für Ihre Antworten. Ich schaffte es schließlich Dynamics CRM OData-API ADAL 3.

Da viele Menschen immer noch Probleme, die dies tun haben, werden zugreifen, finden Sie die folgenden Schritte:

App Registrierung

  1. Melden Sie sich mit Ihrem portal.azure.com Office 365-Administratorbenutzer Ihres Dynamics CRM-Abonnements

  2. Go Active Directory \ App Registrierungen Azure und neue Anwendungs ​​Anmeldungen

  3. hinzufügen Geben Sie "Name" und "Sign-on URL", könnte die URL etwas (https://localhost zum Beispiel)

  4. Wählen Sie die soeben erstellte registrierte Anwendung aus, gehen Sie zu Einstellungen \ Tasten

  5. Geben Sie eine Schlüsselbeschreibung ein, klicken Sie auf Speichern und kopieren Sie den Wert (und behalten Sie ihn, da Sie ihn später benötigen). Kopieren Sie auch die Anwendungs-ID der registrierten App.

  6. Gehen Sie zu "Erforderliche Berechtigungen", klicken Sie auf Hinzufügen, wählen Sie "Dynamics CRM Online" und aktivieren Sie "Zugriff auf CRM Online als Organisationsbenutzer".

Diese Schritte ermöglichen eine Client-Anwendung Dynamics CRM zugreifen, indem Sie die Anwendungs-ID verwenden und das Client-Geheimnis, das Sie in Schritt 5 erstellt Ihre Client-Anwendung ist jetzt in der Lage mit authentifizierten gegen Azure AD seine Erlaubnis greifen Sie auf CRM Online zu. CRM Online kennt diese "Client-Anwendung" oder diesen "Benutzer" jedoch nicht. Die CRM-API antwortet auf eine 401, wenn Sie versuchen, darauf zuzugreifen.

Add CRM-Anwendung Benutzer

lassen CRM wissen über die „Client-Anwendung“ oder „Benutzer“, werden Sie eine Anwendung Benutzer hinzufügen müssen.

  1. Zum CRM \ Security Roles, eine neue Sicherheitsrolle erstellen oder kopieren Sie einfach die "Systemadministrator" Role

  2. Zum CRM \ Einstellungen \ Security \ Benutzer, einen neuen Benutzer erstellen, ändern Sie die Formular an "Anwendungsbenutzer"

  3. Geben Sie die erforderlichen Felder mit der Anwendungs-ID ein, die Sie im vorherigen Schritt hatten. Nach dem Speichern füllt CRM automatisch die Azure AD-Objekt-ID und den URI auf.

  4. Fügen Sie den Benutzer der Sicherheitsrolle hinzu, die im vorherigen Schritt erstellt wurde.

Jetzt sollten Sie in der Lage sein CRM-API für den Zugriff auf Httpclient verwenden und ADAL den folgenden Beispielcode verwenden:

var ap = await AuthenticationParameters.CreateFromResourceUrlAsync(
       new Uri("https://*****.api.crm6.dynamics.com/api/data/v9.0/")); 

String authorityUrl = ap.Authority; 
String resourceUrl = ap.Resource; 

var authContext = new AuthenticationContext(authorityUrl); 
var clientCred = new ClientCredential("Application ID", "Client Secret"); 
var test = await authContext.AcquireTokenAsync(resourceUrl, clientCred); 

Console.WriteLine(test.AccessToken); 

using (var client = new HttpClient()) 
{ 
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", test.AccessToken); 

    var response = await client.GetAsync("https://*****.api.crm6.dynamics.com/api/data/v9.0/contacts"); 
    var contacts = await response.Content.ReadAsStringAsync(); 

    Console.WriteLine(contacts); 
}