从 C# 调用 Windows 身份验证的 WCF 服务

Posted

技术标签:

【中文标题】从 C# 调用 Windows 身份验证的 WCF 服务【英文标题】:Calling windows authenticated WCF service from c# 【发布时间】:2017-11-17 09:59:12 【问题描述】:

我们有一个经过 Windows 身份验证的 WCF 服务。绑定配置如下。

<basicHttpBinding>
    <binding textEncoding="utf-8" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647">
        <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" />            
        </security>
    </binding>
</basicHttpBinding>

我正在尝试从测试应用程序调用服务,

try

    BasicHttpBinding binding = new BasicHttpBinding();
    binding.ReceiveTimeout = new TimeSpan(10, 10, 00);
    binding.SendTimeout = new TimeSpan(10, 10, 00);
    binding.MaxReceivedMessageSize = Int32.MaxValue;
    binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
    binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
    EndpointAddress endpoint = new EndpointAddress("ServiceUrl");

    ChannelFactory<ICRMConnectorService> channelFactory = new ChannelFactory<ICRMConnectorService>(binding, endpoint);
    channelFactory.Credentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
    var service = channelFactory.CreateChannel();

    service.TestMethod();

catch (Exception ex)

    throw ex;

调用返回错误,因为, 远程服务器返回错误:(401) Unauthorized.

有人可以帮忙吗?

【问题讨论】:

您没有提到该服务现在是否在本地,但也许这个问题可以提供帮助:***.com/questions/11408318/… 不,服务不是本地的。它托管在同一域下的不同服务器上。 别介意,您是否有权测试服务或使用服务?还可以启用错误日志记录和 WCF 跟踪以检查是否通过 SOAP 传递了有效凭据。 身份验证是在明文(通过端口 389)还是在安全的 LDAP(端口 636)下完成的?我认为您需要对 636 进行身份验证。 问题当然不在于发布的客户端代码,因为它对我来说逐字逐句。尝试使用具有对服务器/服务的已知访问权限的特定用户名/密码凭据。 【参考方案1】:

您可以从 ServiceReference(您已在应用程序中添加)创建一个 client 对象,用于调用方法,并在其中提供 Windows 凭据以访问 Web 服务。

为了实际实现试试这个:WCF Service, Windows Authentication

【讨论】:

【参考方案2】:

确保 wcf 服务中的端点配置如下 <endpoint address="" binding="wsHttpBinding" contract="IService"> <identity> <dns value="localhost"/> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>

确保您调用的方法正在使用模拟,即 [OperationBehavior(Impersonation = ImpersonationOption.Required)] public void TestMethod()

【讨论】:

【参考方案3】:

我刚刚检查了自己,根据您的设置,服务器无法识别呼叫者。我想说您宁愿切换到另一个能够使用安全通道的绑定,例如 BasicHttpsBinding。然而,后者需要在服务器 (netsh http add sslcert ...) 上设置 SSL 证书,并且可能需要在客户端 (ServicePointManager.ServerCertificateValidationCallback) 中进行一些验证。 还有一个post 也有同样的问题,但它涉及到 IIS。

【讨论】:

以上是关于从 C# 调用 Windows 身份验证的 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章

使用 Windows 身份验证从 Windows 应用商店应用调用 WCF 服务

WCF 客户端缓存 Windows 身份验证

WCF 客户端证书验证 + Windows 身份验证

.net 核心中调用 wcf 的身份验证方案

从 Windows 服务调用时出现 WCF 安全异常

Windows Phone 8.0 上的 HTTPS WCF 服务:无法进行身份验证