我在 Web 服务器 A 上有一个 MVC4 Web 应用程序,它使用 Web 服务器 B 上的 OrganizationServiceProxy 使用 Dynamics CRM Web 服务。MVC4 应用程序设置为启用了 ASP .NET 模拟和 Windows 身份验证。当我打电话给 WhoAmI 时,我收到一个错误:
'调用者未通过服务验证。'
现在,如果我将 MVC4 应用程序移动到具有与 Web 服务器 A 上相同的身份验证的 Web 服务器 B(与 CRM 相同),它会毫无例外地调用 WhoAmI。
这是用于连接到服务器的代码。
string serviceURL = ConfigurationManager.AppSettings["CRMROOTURL"].ToString() + "XRMServices/2011/Organization.svc";
this.CRMService = GetCRMService(serviceURL);
private OrganizationServiceProxy GetCRMService(string serviceURL)
{
ClientCredentials credentials = new ClientCredentials();
credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
OrganizationServiceProxy client
= new OrganizationServiceProxy(new Uri(serviceURL), null, credentials, null);
return client;
}
这是 IIS 网站上的身份验证屏幕截图。
根据正确答案,我只想提供一些片段来帮助其他人。
string loggedUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
ClientCredentials credentials = new ClientCredentials();
credentials.Windows.ClientCredential = new NetworkCredential(username, password, domain);
OrganizationServiceProxy client
= new OrganizationServiceProxy(new Uri(serviceURL), null, credentials, null);
client.ClientCredentials.Windows.ClientCredential = credentials.Windows.ClientCredential;
// -- Retrieve the user.
QueryExpression expression = new QueryExpression
{
EntityName = "systemuser",
ColumnSet = new ColumnSet("systemuserid")
};
expression.Criteria.AddCondition("domainname", ConditionOperator.Equal, loggedUser);
EntityCollection ec = client.RetrieveMultiple(expression);
if (ec.Entities.Count > 0)
{
// -- Impersonate the logged in user.
client.CallerId = ec.Entities[0].Id;
}
谢谢!