【问题标题】:How to display the username credentials used in a SOAP WCF call?如何显示 SOAP WCF 调用中使用的用户名凭据?
【发布时间】:2012-12-24 05:39:07
【问题描述】:

下面的 SOAP 调用使用我的凭据可以正常工作,但是当其他人使用我的调用 WCF 服务的 .EXE 时,我得到 401 拒绝。我试图找出正在传递的凭据是什么。

我可以查看 IIS 日志,但我正在尝试以编程方式进行,谢谢:

   public static Guid GetServerID(string serverName, string soapUrl)
    {
        Guid result;
        try
        {
            Guid vServerId = new ControllerWS.Controller
            {
                Url = soapUrl,
                Timeout = Config.SoapCallTimeOut,
                Credentials = CredentialCache.DefaultCredentials
            }.GetServerId(serverName);
            result = vServerId;

            //Console.WriteLine("CredentialCache.DefaultCredentials: " + CredentialCache.DefaultCredentials.ToString());
            //ICredentials Credentials = CredentialCache.DefaultCredentials.GetCredential()
        }

【问题讨论】:

标签: wcf web-services soap


【解决方案1】:

这实际上取决于您使用的身份验证类型。当 Windows 凭据具有模拟功能时,您可以获得如下用户名:

string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name

如果您使用的是普通用户名和密码,那么这些值可以存储在请求标头中并如下所示:

MessageHeaders headers = OperationContext.Current.IncomingMessageHeaders;
string userId = headers.GetHeader<Guid>("MyKey", "MyNamespce");

【讨论】:

  • 谢谢,它调用 NT AUTHORITY\SYSTEM :( 我希望它会采用 IIS 应用程序池的身份。谢谢!
【解决方案2】:

您可以在服务器端使用IDispatchMessageInspector 来拦截包括标头在内的完整消息。从那里您可以检查正在传入的凭据。

Here's a blog post 概述了如何记录来自消息检查器的完整消息,包括连接它所需的配置步骤。

【讨论】:

  • 谢谢,它调用 NT AUTHORITY\SYSTEM :( 我希望它会采用 IIS 应用程序池的身份。谢谢!
  • 我收回了。在 SYSTEM 下运行的另一个进程正在调用我的 .EXE,它通过 SOAP 调用调用 Web 服务。
猜你喜欢
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多