我在Web服务器A上有一个MVC4 Web应用程序,它使用Web服务器B上的OrganizationServiceProxy来使用Dynamics CRM Web服务.MVC4应用程序是在启用ASP .NET模拟和Windows身份验证的情况下设置的。当我打电话给WhoAmI时,我收到一个错误:
'来电者未经过服务认证。'
现在,如果我将MVC4应用程序移动到Web服务器B(与CRM相同),并使用与Web服务器A相同的身份验证,则会毫无例外地调用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;
}
谢谢!
答案 0 :(得分:3)
除非您明确说明(并且没有任何代码来查看您如何创建OrganizationServiceProxy),否则OrganizationServiceProxies将使用当前的AD帐户(服务帐户,而不是用户的特定帐户)连接到CRM。我猜你在服务器A上运行的应用程序池不是CRM用户,而服务器B上的应用程序池是。如果是这样,请将服务器A的用户更改为与服务器B相同的用户,或者将服务器A的用户设置为CRM中的用户。
您正在使用默认网络凭据连接到CRM。这意味着无论您使用何种IIS身份验证,您都将作为应用程序池用户帐户连接到CRM。只要App Pool用户是CRM用户,这就有效,但可能不是您想要的。
您可以使用此方法手动设置网络凭据:
creds.Windows.ClientCredential = new System.Net.NetworkCredential("UserId", "Password", "DomainName");
然后获取ASP.Net用户的域名并使用模拟连接到CRM,以确保正确应用该个人的所有安全性。
答案 1 :(得分:0)
蠢事 - 小心你没有逃脱你的用户名!
creds.Windows.ClientCredential = new NetworkCredential("domain\user", "PASSWORD");
请注意\ u是转义序列 - 您需要输入“domain \ user”。