我正在尝试访问WCF服务(MS CRM 2011)并收到上述错误。如果我使用Cassini或IIS Express从VS2010调试器运行我的示例程序,它可以很好地工作。没有身份验证错误。
但是,如果我将网站发布到我的本地IIS 7.5(运行Windows 7 64位),我会在抓取CRM UserId(WhoAmIResponse)的行上收到错误。
我打开Fiddler来比较在调试器下运行和在IIS下运行之间的请求。在IIS下运行的站点上,请求永远不会发生,因此在达到目标之前必须失败。
发布到IIS的网站的web.config设置为...
<authentication mode="Windows">
</authentication>
<identity impersonate="true"/>
该网站在预安装的ASP.NET v4.0应用程序池,集成管道模式,ApplicationPoolIdentity帐户下运行。
这是我的代码......
public class DemoController : Controller
{
public ActionResult Index()
{
ClientCredentials credentials = new ClientCredentials();
credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
var _serviceProxy = new OrganizationServiceProxy(new Uri("http://svr-rex2011-dev/TimeEntry/XRMServices/2011/Organization.svc"),
null,
credentials,
null);
// This statement is required to enable early-bound type support.
_serviceProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
IOrganizationService service = (IOrganizationService)_serviceProxy;
// Display information about the logged on user.
Guid userid = ((WhoAmIResponse)service.Execute(new WhoAmIRequest())).UserId;
SystemUser systemUser = (SystemUser)service.Retrieve("systemuser", userid,
new ColumnSet(new string[] { "firstname", "lastname" }));
// Retrieve the version of Microsoft Dynamics CRM.
RetrieveVersionRequest versionRequest = new RetrieveVersionRequest();
RetrieveVersionResponse versionResponse =
(RetrieveVersionResponse)service.Execute(versionRequest);
ViewBag.FirstName = systemUser.FirstName;
ViewBag.LastName = systemUser.LastName;
ViewBag.Version = versionResponse.Version;
return View();
}
}
有什么想法吗?非常感谢!!!
答案 0 :(得分:1)
您所描述的情况似乎是:当您的应用在IIS上运行时尝试访问CRM服务时,您将收到身份验证错误。当您从Visual Studio或IIS Express运行应用程序时,您没有身份验证错误。
如果是这样,我很确定您的问题是由于用于为您的应用程序运行IIS AppPool的身份。您需要change the AppPool identity到具有CRM服务网络访问权限的人。通常它应该是具有正确权限的域帐户,但有一些方法可以使用具有相同密码的本地计算机帐户执行此操作(如果域可用,则绝对不建议这样做。)
答案 1 :(得分:0)
我遇到了同样的问题,在我看来,事实证明这是由于CRM负载均衡这一事实。结果是Authentication delegation through Kerberos does not work in load-balanced architectures。
我们通过HOST条目将我们的应用程序直接指向其中一个CRM服务器,绕过了负载平衡。
我希望能节省几个小时的费用。