2016-07-26 23 views
3

我有多個由Microsoft在雲中託管的CRM Online實例。
它們都使用相同的Azure Active Directory進行安全保護,而ADure本身也由ADFS進行管理。
我的應用程序在Azure AD中註冊,因此具有客戶端ID /密鑰等和CRM權限。如何使用ADAL/OAuth通過CRM Online進行身份驗證並通過令牌請求數據?

我想通過Web API連接到CRM的特定實例以請求數據。
我可以通過使用CrmServiceClient使用包含用戶名/密碼的連接字符串來實現此功能。
這似乎是通常記錄的例子,但我不想這樣做。下面的MSDN文章使它看起來像我可以通過一個令牌,而不是做:https://msdn.microsoft.com/en-us/library/gg327838.aspx

我可以成功地得到這樣一個令牌(我模糊了對安全的一些細節):

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); 

通常我」 d此令牌傳遞到一個HTTPRequest,作爲認證頭,但選項3在這個博客上暗示有可能使用由SDK而不是提供的OrganizationWebProxyClient類: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" 
}; 

最後,我需要添加一個SERV冰參照微軟提供的服務組織:

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

這會在我的app.config綁定:

<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> 

然後,我可以分配給這個組織服務:

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

最後我可以撥打網絡服務:

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

但是在調用的組織服務,我得到一個錯誤:

An error occurred when verifying security for the message

我帶領相信這個錯誤其實燕子任何真正的錯誤是(感謝微軟),所以我不知道什麼是真的錯了。
大量的文件在線說,它的客戶端和服務器時間不同步,但我不認爲是這樣。我無法證明微軟的服務器在什麼時間,但我的時鐘絕對準確,並且在英國的正確時區。

有誰知道我在做什麼錯?
或者是否有不同的方式來驗證沒有用戶名/密碼?
或者我只是吠叫錯了樹,我應該使用用戶名/密碼畢竟?

+0

1.您是否在您的組織中添加了應用程序用戶? 2.爲什麼你需要在config中配置所有這些自定義綁定? – georged

+0

這個問題差不多一年半了,很久以前我就不再看這個問題了。抱歉。 – Equalsk

+0

嗯,這可以解釋它:)對不起,有人問我這個問題,我甚至沒有看到日期...... S2S在1.5年前沒有工作,僅在幾個月前它才被CRM支持。所以現在是100%的工作。 – georged

回答

1

似乎CRM Online不支持任何形式的匿名或被動身份驗證,並且必須始終提供有效的用戶名和密碼。

我已經採取了簡單地創建一個用戶僅用於API訪問和使用這些憑據來與CRM進行身份驗證。雖然這不是我想要的,但它工作得很好。

我很想有人證明我錯了,但現在看起來好像不是這樣。

相關問題