2016-07-26 18 views
3

Ich habe mehrere Instanzen von CRM Online, die von Microsoft in der Cloud gehostet werden.
Sie sind alle mit demselben Azure Active Directory gesichert, das selbst von ADFS verwaltet wird.
Meine Anwendung ist in Azure AD registriert und hat daher eine Client-ID/einen Schlüssel usw. und Berechtigungen für CRM.Wie können Sie sich mit ADAL/OAuth bei CRM Online authentifizieren und Daten über ein Token anfordern?

Ich möchte eine Verbindung zu einer bestimmten CRM-Instanz über die Web-API herstellen, um Daten anzufordern.
Ich kann dies funktioniert mit CrmServiceClient mit einer Verbindungszeichenfolge mit einem Benutzernamen/Passwort.
Dies scheint das allgemein dokumentierte Beispiel zu sein, aber ich möchte das nicht tun. Der folgende MSDN-Artikel macht es so aussehen, wie ich es über ein Token stattdessen tun können: https://msdn.microsoft.com/en-us/library/gg327838.aspx

ich erfolgreich ein Zeichen wie diese bekommen kann (ich habe einige Details für die Sicherheit verdeckt):

var tenantName = @"myorg.onmicrosoft.com"; 
var authString = string.Format(@"https://login.microsoftonline.com/{0}", tenantName); 

var authContext = new AuthenticationContext(authString, false); 

// I am in the UK so use crm4 
var resource = @"https://myorg.crm4.dynamics.com"; 
var clientId = @"899ac540-2134-1234-abcd-2d6440046630"; 
var key = @"nStbgtfe0oybU1P5+/FQ4wFn1oLTEDr5M7Kjrghf5yh="; 
var clientCred = new ClientCredential(clientId, key); 

var authResult = await authContext.AcquireTokenAsync(resource, clientCred); 

Normalerweise I‘ d dieses Token an einen als Authentifizierungskopfhttprequest übergeben, aber die Option 3 in diesem Blog schon sagt, es ist möglich, die OrganizationWebProxyClient Klasse durch das SDK zu verwenden, anstatt: http://crmtipoftheday.com/2015/06/24/you-have-oauth-token-now-what/

var orgService = new OrganizationWebProxyClient(
    new Uri("https://myorg.api.crm4.dynamics.com/XRMServices/2011/Organization.svc"), false) 
{ 
    HeaderToken = authResult.AccessToken, 
    SdkClientVersion = "8" 
}; 

Schließlich brauche ich einen serv hinzufügen Eis Bezug auf die Organisation Service von Microsoft zur Verfügung gestellt:

https://myorg.api.crm4.dynamics.com/XRMServices/2011/Organization.svc?singleWSDL&sdkversion=8 

Dieses eine Bindung in meine app.config schafft:

<system.serviceModel> 
    <bindings> 
    <customBinding> 
     <binding name="CustomBinding_IOrganizationService"> 
     <textMessageEncoding /> 
     <httpsTransport /> 
     </binding> 
    </customBinding> 
    </bindings> 
    <client> 
    <endpoint address="https://myorg.api.crm4.dynamics.com/XRMServices/2011/Organization.svc" 
    binding="customBinding" bindingConfiguration="CustomBinding_IOrganizationService" 
    contract="CRMOrgService.IOrganizationService" name="CustomBinding_IOrganizationService" /> 
    </client> 
</system.serviceModel> 

Und dann kann ich weisen Sie diese an die Organisation Service:

var binding = new CustomBinding("CustomBinding_IOrganizationService"); 
orgService.Endpoint.Binding = binding; 

Schließlich kann ich den Web-Service anrufen:

var contacts = orgService.RetrieveMultiple(new QueryExpression 
{ 
    EntityName = "contact", 
    ColumnSet = new ColumnSet("firstname", "lastname") 
}) 
.Entities 
.Select(item => item.ToEntity<Contact>()); 

jedoch die Organisation Service beim Aufruf bekomme ich einen Fehler:

An error occurred when verifying security for the message

Ich führe dieser Fehler zu glauben, tatsächlich schluckt, was der wirkliche Fehler (dank Microsoft) war so weiß ich nicht, was wirklich los ist.
Viele Online-Dokumentation sagt, es ist Client-und Server-Zeit nicht synchron, aber ich glaube nicht, dass es das ist. Ich kann nicht beweisen, zu welcher Zeit die Server von Microsoft eingeschaltet sind, aber meine Uhr ist absolut genau und in der richtigen Zeitzone für Großbritannien.

Weiß jemand, was ich falsch mache?
Oder gibt es eine andere Möglichkeit, sich ohne Benutzername/Passwort zu authentifizieren?
Oder belle ich einfach den falschen Baum an und sollte ich doch einen Benutzernamen/ein Passwort verwenden?

+0

1. Haben Sie den Anwendungsbenutzer in Ihrer Organisation hinzugefügt? 2. Warum brauchen Sie alle diese benutzerdefinierte Bindung in der Konfig? – georged

+0

Diese Frage ist fast anderthalb Jahre alt, ich habe aufgehört, das vor einer langen Zeit zu betrachten. Es tut uns leid. – Equalsk

+0

Ah, das würde es erklären :) Tut mir leid, jemand hat mich danach gefragt und ich habe auch nicht auf die Daten geschaut ... S2S hat vor 1.5 Jahren nicht funktioniert, es wurde erst seit ein paar Monaten von CRM unterstützt. So arbeitet es jetzt zu 100%. – georged

Antwort

1

Es scheint, dass CRM Online keine anonyme oder passive Authentifizierung unterstützt und immer mit einem gültigen Benutzernamen und Kennwort versehen sein muss.

Ich habe einfach einen Benutzer nur für den API-Zugriff erstellen und diese Anmeldeinformationen verwenden, um mit CRM zu authentifizieren. Obwohl dies nicht das ist, was ich wollte, funktioniert es gut.

Ich würde gerne jemanden, der mir falsch zu beweisen, aber es scheint nicht, dass dies im Moment möglich ist.