我有多個由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
我帶領相信這個錯誤其實燕子任何真正的錯誤是(感謝微軟),所以我不知道什麼是真的錯了。
大量的文件在線說,它的客戶端和服務器時間不同步,但我不認爲是這樣。我無法證明微軟的服務器在什麼時間,但我的時鐘絕對準確,並且在英國的正確時區。
有誰知道我在做什麼錯?
或者是否有不同的方式來驗證沒有用戶名/密碼?
或者我只是吠叫錯了樹,我應該使用用戶名/密碼畢竟?
1.您是否在您的組織中添加了應用程序用戶? 2.爲什麼你需要在config中配置所有這些自定義綁定? – georged
這個問題差不多一年半了,很久以前我就不再看這個問題了。抱歉。 – Equalsk
嗯,這可以解釋它:)對不起,有人問我這個問題,我甚至沒有看到日期...... S2S在1.5年前沒有工作,僅在幾個月前它才被CRM支持。所以現在是100%的工作。 – georged