Dynamics CRM - 呼叫者未通过身份验证即可进行服务

时间:2013-09-06 17:55:35

标签: wcf dynamics-crm-2011

我在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网站上的身份验证的屏幕截图。

enter image description here

根据正确的答案,我只想提供一些片段来帮助其他人。

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

谢谢!

2 个答案:

答案 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”。