2009-02-03 126 views
7

我做了一个访问CRM的Web服务的应用程序。问题是,当我将dll部署到Sharepoint服务器时,它返回了未经授权的401错误。显然System.Net.CredentialCache.DefaultCredentials没有工作(我的怀疑)。这是代码。访问CRM/Sharepoint Web服务中的DefaultCredentials

CrmSdk.CrmAuthenticationToken token = new CrmSdk.CrmAuthenticationToken(); 
token.AuthenticationType = AuthenticationType.AD; 
token.OrganizationName = ORGANIZATION_NAME; 

CrmService service = new CrmService(); 
service.Url = "http://crmserver:5555/mscrmservices/2007/crmservice.asmx"; 
service.CrmAuthenticationTokenValue = token; 
service.PreAuthenticate = true; 
service.Credentials = System.Net.CredentialCache.DefaultCredentials; 

反之亦然。

当我做了访问Sharepoint的web服务(编码插件)并将其部署到CRM服务器的应用程序。它无法访问Sharepoint的Web服务。未经授权的错误。代码如下:

Lists listService = new Lists(); 
listService.PreAuthenticate = true; 
listService.Credentials = System.Net.CredentialCache.DefaultCredentials; 
listService.Url = "http://sharepointserver/webname/_vti_bin/Lists.asmx"; 

我的CRM服务器和Sharepoint服务器位于同一个域中。

对于这两个代码,如果我将凭证部分更改为类似这样的东西,然后将其部署到服务器上,它可以运行。

service.Credentials = new NetworkCredential("username", "password", "domain"); 

不过,我不想这样做,因为它会在代码中显示用户的密码。任何人都可以帮我吗?

两台服务器中的IIS都不允许匿名访问,它使用集成Windows身份验证。

谢谢


从我的本地计算机上,我可以访问CRM Web服务或SharePoint Web服务。我想我是被授权的,因为DefaultCredentials发送了我的凭据,其密码保存在“存储的用户名和密码”(控制面板>用户帐户>选项卡高级>管理密码) 这样,我不必须键入:

service.Credentials = new NetworkCredential("username", "password", "domain"); 

和我的本地comp的DefaultCredentials被授权访问Web服务。

我试图在访问CRM Web服务的Sharepoint服务器上实现此功能。和..tadaa ..它不会工作。哈哈哈..

我们可以向服务器中的DefaultCredentials注入凭证吗?

我想做的最后一件事是硬编码useraccount(如上面的代码)

回答

1

可能是你需要运行Kerberos进行身份验证,但不能肯定,这是一个痛苦的设置只是去检查。

+0

嗯..我已经检查过,服务器使用Kerberos身份验证。 任何其他选项或意见? :D 无论如何谢谢:D – cyrene 2009-02-03 07:00:54

1

您是否验证过默认凭据与您明确声明时相同?这可能是默认的credentails是你不希望的另一个帐户。

编辑#1:每言论为DefaultCredentials property on MSDN

DefaultCredentials代表在其中 运行应用程序的当前 安全上下文中 系统凭据。对于 客户端应用程序,这些通常是运行该应用程序的 用户的Windows凭据(用户 名称,密码和域) 。对于 ASP.NET应用程序,默认的 凭证是已登录用户的用户凭证 或被模拟的用户 。

您还需要确保访问CRM页面(调用SharePoint Web服务)的用户可以使用他们的凭据访问Web服务,反之亦然。如果他们可以的话,那么似乎更有可能发生某种模仿。

编辑#2:假设您可以同时访问CRM和SharePoint服务器,那么您可能会在应用程序和系统日志中都达到峰值。其中一个或两个应该可能指示登录失败并指示哪个帐户尝试访问资源(在本例中是Web服务)。

+0

hm ...我没有说明默认凭证的价值。我只是用它,而不是它本身应该找到所需的匹配凭证,然后将其发送到Web服务? 如何验证默认凭证?因为我们无法在其中看到用户名和密码,我们可以吗? 谢谢:) – cyrene 2009-02-04 00:42:25

+0

增加了一个更新,您可以尝试检查日志,他们可能会显示失败的登录名并指向您试图访问服务的帐户。 – 2009-02-06 04:26:46

0

service.Credentials = System.Net.CredentialsCache.DefaultNetworkCredentials;

试试看。

0

能够使用的DefaultCredentials,在Active Directory用户必须同时在SharePoint和CRM进行定义,并有足够的权限做你的代码做什么。

并尝试使用sdk(crm有助手类)而不是服务定义。

1

通过使用DefaultCredentials,意味着ASP.NET工作进程或IIS工作进程将获取运行IIS应用程序池的用户的凭据。

因此,如果您的Dynamics CRM应用程序池在用户帐户Custom-CRM-Domain \ JohnDoe下运行,这意味着它将采用用户帐户Custom-CRM-Domain \ JohnDoe下的权限。

请检查运行CRM \ Sharepoint应用程序IIS Web应用程序的应用程序池的用户帐户。

这些检查应用程序池的步骤:

  1. 打开网站 - >右键 - >选择属性
  2. 通知应用程序池名称在下拉列表中选择主目录选项卡
  3. 现在,转到应用程序池文件夹
  4. 尝试查找已在步骤3→右键单击中列出的应用程序池名称,然后选择属性
  5. 选择“标识”标签,你会发现谁运行应用程序池

希望这有助于用户帐户。

0

为了解决这个问题,您需要首先知道哪个用户正在运行App池,如果您需要使用CredentialCache.DefaultCredentials,那么您必须将用户说svcadmin或类似的东西添加到“辅助站点收集管理员“通过运行SharePoint中央管理应用程序。由此SP允许证书已经通过的用户访问它需要的东西。 enter image description here