【问题标题】:HTTP status 401: Unauthorized when calling from ExtendedPSIHTTP 状态 401:从 ExtendedPSI 调用时未经授权
【发布时间】:2010-10-06 16:09:30
【问题描述】:

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

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

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

如果我使用以下 sn-p 对 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 客户端调用该服务。

提前谢谢...

问候, 格子呢

【问题讨论】:

  • 文档中描述的 DefaultCredentials 不适用于 HTTP 或 FTP。顺便说一句,正在使用的身份验证方案是什么,您的 Windows 登录详细信息是否与所需的匹配?
  • 您好 Jon,感谢您抽出宝贵的时间,它的 windows 身份验证和细节在整个网络中是一致的。我将这些细节硬编码到扩展 PSI 中,如果我对它们进行硬编码,它就可以正常工作。我需要传递网络登录详细信息,例如。每个用户只能使用 PSI Web 服务查询/更新他们自己的时间表数据。希望这是有道理的。对不起,如果不是,但这对我来说是全新的:) TB

标签: c# web-services sap-pi project-server-2007


【解决方案1】:

您应该像这样更改应用程序的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

【讨论】:

    猜你喜欢
    • 2020-08-12
    • 1970-01-01
    • 2013-01-01
    • 2011-04-18
    • 1970-01-01
    • 2012-06-30
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多