错误消息:无法满足安全令牌请求,因为身份验证失败

时间:2011-05-12 16:21:11

标签: c# wcf asp.net-mvc-3 wshttpbinding channelfactory

我正在尝试访问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();
    }

}

有什么想法吗?非常感谢!!!

2 个答案:

答案 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服务器,绕过了负载平衡。

我希望能节省几个小时的费用。