2015-03-03 81 views
1

我們有一個問題,我們的Web應用程序通過Microsoft.Xrm.Sdk OrigantizationServicePro未能通過CRM進行身份驗證。這個問題似乎是環境特定的,即調用在我們的DEV Web服務器上工作,但在應用程序升級到我們的系統測試環境時失敗。失敗的代碼如下:CRM OrganizationServiceProxy身份驗證問題

using (var serviceProxy = this.serviceFactory.Impersonate(userProvider.PrincipalUserName).ServiceProxy) 
       { 
        var countResult = serviceProxy.RetrieveMultiple(new FetchExpression(query)); 
        int? count = 0; 

        var entity = countResult.Entities.FirstOrDefault(); 
        if (entity != null) 
        { 
         count = (int?)((AliasedValue)entity["activity_count"]).Value; 
        } 

        return count.Value; 
       } 

出現在我們的日誌是錯誤:

System.ServiceModel.Security.SecurityNegotiationException:來電者不是由服務認證。 ---> System.ServiceModel.FaultException:由於身份驗證失敗,無法滿足安全令牌請求。 在System.ServiceModel.Security.SecurityUtils.ThrowIfNegotiationFault(消息消息的EndpointAddress目標) 在System.ServiceModel.Security.SspiNegotiationTokenProvider.GetNextOutgoingMessageBody(消息incomingMessage,SspiNegotiationTokenProviderState sspiState) ---內部異常堆棧跟蹤結束---

我有雙重檢查IIS站點和CRM設置的apppool身份。這裏有什麼明顯的我們可能錯過了?

+0

通過仔細檢查IIS和CRM設置的appPool身份來定義您的意思。 – Daryl 2015-03-03 20:33:27

+0

檢查用於Web服務器上應用程序池標識的服務帳戶是否可以與CRM服務器通話(該服務帳戶在CRM服務器上具有系統管理員角色)。還有其他基於CRM LINQ的調用(使用ServiceContext)由我們的Web應用程序生成,沒有問題。我們唯一的身份驗證問題是Web應用程序通過OrganizationServiceProxy和RetrieveMultiple方法查詢CRM的某些調用。 – 2015-03-03 21:24:28

+0

您的系統是否是測試環境IFD? – Daryl 2015-03-04 13:46:47

回答

0

我發現與CRM Online的連接花費的時間最長,因此我創建了一個實例以使用明確的憑據傳遞OrganizationServiceProxy,我可以輕鬆地在環境之間切換。

IServiceManagement<IOrganizationService> management = ServiceConfigurationFactory.CreateManagement<IOrganizationService>(new Uri(CrmUrl)); 

    ClientCredentials credentials = new ClientCredentials(); 
    credentials.UserName.UserName = CrmUserName; 
    credentials.UserName.Password = CrmPassword; 

    AuthenticationCredentials authCredentials = management.Authenticate(new AuthenticationCredentials { ClientCredentials = credentials }); 
    SecurityTokenResponse securityTokenResponse = authCredentials.SecurityTokenResponse; 

    OrganizationServiceProxy orgProxy = new OrganizationServiceProxy(management, securityTokenResponse); 
    orgProxy.EnableProxyTypes(); 
    _xrmService = new XrmServiceContext(orgProxy)