【问题标题】:CredentialCache.DefaultNetworkCredentials empty when using TransportWithMessageCredential使用 TransportWithMessageCredential 时 CredentialCache.DefaultNetworkCredentials 为空
【发布时间】:2012-05-31 10:53:23
【问题描述】:

我目前正在尝试在我的 wcf 项目中使用 TransportWithMessageCredentials 和 https。我设置了客户端和服务器安全模式="TransportWithMessageCredential" 和clientCredentialType="Windows"。

当我从 CredentialCache.DefaultNetworkCredentials 中获取凭据时,用户名、密码和域都是空的。

为什么这些会是空的?如果它们始终为空,我将在哪里获取要传递的凭据?

如何在不提示登录的情况下将登录的用户凭据传递给服务?

客户端绑定

<basicHttpBinding>
    <binding name="ClientHttpEndpoint" closeTimeout="00:01:00"
    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:02:00"
    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
    maxBufferSize="4194304" maxBufferPoolSize="524288" maxReceivedMessageSize="4194304"
    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
    useDefaultWebProxy="true">
        <security mode="TransportWithMessageCredential">
            <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
        </security>
    </binding>
</basicHttpBinding>

服务器绑定

<basicHttpBinding>
    <binding name="WindowsTransportCredentialBinding" maxBufferSize="524288"maxReceivedMessageSize="524288">
        <readerQuotas maxDepth="128" maxStringContentLength="1048576" />
        <security mode="TransportWithMessageCredential">
            <transport clientCredentialType="Windows" />
        </security>
    </binding>
</basicHttpBinding>

...

<service name="Test.DiagnosticService">
    <endpoint binding="basicHttpBinding" bindingConfiguration="WindowsTransportCredentialBinding" name="ClientDiagnosticEndpoint" contract="Test.IDiagnostic" />
</service>

设置用户名和密码的代码

ChannelFactory<IDiagnostic> test = new ChannelFactory<IDiagnostic>(DIAGNOSTIC_ENDPOINT_NAME);
test.Credentials.UserName.UserName = "TestUser";
test.Credentials.UserName.Password = "User";
return test.CreateChannel();

【问题讨论】:

  • 您是在问如何将当前登录到 Windows 的用户传递给服务?
  • 是的。我想将当前登录的用户凭据(windows)传递给服务。 (我编辑了原帖)
  • 服务是否托管在 IIS 中?或自托管
  • 首先,我认为您的绑定不匹配。服务器缺少 标记。然后,您的客户端绑定要求您在消息头中提供用户/密码。如果没有用户实际输入,您将无法访问 Windows 密码,这将是一个主要的安全漏洞。如果要发送当前的 Windows 凭据,可以尝试传输安全模式和 Windows 的 clientCredentialType 或 中的 Ntlm。然后,您的服务器应该获取用户令牌,而不是用于获取用户名。

标签: wcf wcf-binding wcf-security


【解决方案1】:

DefaultCredentials 返回的 ICredentials 实例不能用于查看当前安全上下文的用户名、密码或域。

http://msdn.microsoft.com/en-us/library/system.net.credentialcache.defaultcredentials%28v=vs.90%29.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 2019-05-20
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多