我也不相信 - 我会向任何对加入我感兴趣的人展示!
这是交易。两台计算机,与添加服务引用的行为不同。
电脑1 - 我叫他BigMac
电脑2 - 我叫他Littlemac
我在BigMac上写了一个Web服务。还有一个Windows客户端应用程序来调用它。一切都很棒。将它部署到客户端的计算机上,一切都很棒。我们决定保护服务器,以便消费者必须将Windows用户名/密码传递给服务,我们将使用Https。 8个小时后,在这里和其他地方进行了大量搜索,我得到了它。服务器配置。看起来像这样:
<services>
<service name="SecureWcfTestsApplication.Service1">
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration ="Binding2"
contract="SecureWcfTestsApplication.IService1" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="Binding2">
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
</bindings>
将其部署在远程服务器上。转到任何Web浏览器,输入服务URL,输入用户名和密码,然后获取服务描述。一切都好。
但是 - 客户端代码可以在不提供任何凭据的情况下调用它。
客户端代码就是这样:
remote.Service1Client service1 = new remote.Service1Client(); service1.GetData(20);
就是这样。它从Visual Studio内部运行,并作为exe运行。如果我将exe复制到另一台机器上,它就不会运行。
好的 - 在BigMac(同一台计算机)上启动一个新项目 - 这里只有Windows应用程序没有服务实现。我添加远程服务引用,但它再次没有要求用户名和密码。我可以在没有任何凭据的情况下拨打该服务。
去LittleMac。打开Web浏览器并导航到该服务 - 我需要一个用户名/密码。打开Visual Studio,添加服务引用 - 我需要一个用户名/密码。客户端代码需要设置用户名/密码。
我重新启动了BigMac - 从头开始 - 新项目 - 添加Web引用 - 无需密码并运行。
跆拳道?任何人吗?
最佳
雷
答案 0 :(得分:0)
假设:您没有Windows域。
好的,让我们想一想“Windows”认证意味着什么。来自here:
Windows身份验证
该服务通常在Windows域服务器可用时使用Kerberos,或在工作组配置中部署时使用NTLM。调用者为服务提供其Windows凭据(例如票证或令牌),并且该服务对Windows进行身份验证。
现在,假设您的网络中没有域,这意味着它实际上是针对运行Visual Studio和BigMac上的client.exe的本地帐户执行身份验证。由于您的本地帐户已经过身份验证(您已登录),因此客户端只需将令牌转发给Web服务即可进行身份验证。
另一方面,LittleMac在另一台机器上进行本地身份验证,这意味着它必须为运行Web服务的计算机上的本地帐户提供用户名和密码。
我不知道这是不是你的情况,我的描述可能不是100%真实在后台发生的事情,但无论如何WCF没有保留密码,所以不要担心: )
HTH