我目前正在尝试开发一个ExtendedPSI Web服务,该服务又调用了许多现有的PSI Web服务。麻烦的是当我尝试使用我创建的ExtendedPSI访问现有的PSI服务时,我收到错误( System.Net.WebException:请求失败,HTTP状态为401:未授权。)。 / p>
如果我使用以下代码段在ExtendedPSI中对凭证进行硬编码,我可以使服务正常工作:
resWS.Credentials = new NetworkCredential("userName", "userPass", "domain");
但不是我用的时候:
resWS.Credentials = CredentialCache.DefaultCredentials;
(我已尝试过CredentialCache.DefaultNetworkCredentials,但通过HTTP或FTP读取此功能无效)
我已经阅读了很多帖子,其中包含启用Windows身份验证和删除匿名访问等建议,无论是在客户端web.config还是在虚拟调用webapp上,但我使用SoapUI调用ExtendedPSI服务作为最终解决方案将由ESB平台(即SAP PI)调用。
但是使用SoapUI我已经设法通过在SoapUI界面中提供我的登录详细信息来依次调用每个现有的PSI服务(在我的ExtendedPSI服务中调用的Web服务),所以只要我能通过,我就知道现有的服务是有效的在凭证上,但它们是空的 使用 CredentialCache.DefaultCredentials 。
希望这对某人有意义(这是我对Web服务的第一次尝试,所以如果它有点模糊,我会道歉)。我真的不想在我的服务中硬编码登录详细信息,所以我希望有人之前遇到过这个问题并且有一个我可以使用的解决方案......
我需要的信息是否与HttpContext一起保存?我可以通过的加密令牌(刚到达这里:)?或者我是否需要通用用户才能访问这些现有的PSI Web服务?
仅供参考:我遵循了文章http://msdn.microsoft.com/en-us/library/bb428837.aspx(我已经进一步扩展到调用现有的PSI),但它假设某种MS.NET客户端调用该服务。
提前致谢...
此致 TartanBono
答案 0 :(得分:0)
您应该像这样更改应用程序的web.config
。只需覆盖绑定节点中的安全节点:
<binding name="WssInteropSoap">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" proxyCredentialType="Ntlm"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
现在您可以在没有特殊帐户(从Windows直通)或使用此代码进行身份验证的情况下,您可以指定一个帐户:
//credential impersonation (just if you changed your binding settings)
projectSvc.ClientCredentials.Windows.ClientCredential = new NetworkCredential("username", "password", "domain");
projectSvc.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
我希望它会有所帮助:)
我还写了一篇博客文章,用于建立与PSI的连接:Read Project Server 2010 CustomFields over PSI