0

我目前正在尝试开发一个 ExtendedPSI Web 服务,该服务反过来调用许多现有的 PSI Web 服务。问题是我收到错误

System.Net.WebException:请求失败,HTTP 状态为 401:未经授权。

当我尝试使用我创建的 ExtendedPSI 访问现有的 PSI 服务时。

如果我使用以下代码段对我的 ExtendedPSI 中的凭据进行硬编码,我可以让服务正常工作:

resWS.Credentials = new NetworkCredential("userName", "userPass", "domain");

但不是当我使用:

resWS.Credentials = CredentialCache.DefaultCredentials;

(我已经尝试过 CredentialCache.DefaultNetworkCredentials 但通过 HTTP 或 FTP 读到这不起作用)

我已经阅读了许多帖子,其中包括在客户端 web.config 或调用 webapp 的虚拟中启用 Windows 身份验证和删除匿名访问等建议,但是我使用 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

4

1 回答 1

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

于 2012-04-27T09:15:22.053 回答