我编写了一个非常简单的WCF服务来发送和接收消息.我已经通过VS 2008默认Web服务器主机测试了应用程序,一切正常.但是,当我将WCF服务部署到另一台计算机的IIS时,我收到以下错误:
"由于身份验证失败,无法满足安全令牌的请求."
如何设置身份验证类型以在配置文件中使用我的自定义用户名和密码?如果不可能,请告诉我如何设置其Windows凭据,因为我正在使用的2台计算机不共享相同的用户.
我使用Visual Studio 2008创建了一个Web服务代理,它为我创建了app.config中的以下条目:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="MyNameHandlerSoapBinding" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://www.***/***/***"
binding="basicHttpBinding" bindingConfiguration="MyNameHandlerSoapBinding"
contract="***.MyNameHandler" name="MyName">
</endpoint>
</client>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)
webservice有用户名/密码验证,所以我需要在这里添加它.
我在WCF文档的海洋中有点迷失,我想我必须从basicHttpBinding更改为wsHttpBinding或customBinding才能添加身份验证元素,但我真的不明白它.任何人都可以提供任何快速提示或任何有用的链接,说明如何做到这一点?
编辑:
我将安全部分更改为:
<security mode="Transport">
<transport clientCredentialType="Basic" proxyCredentialType="None"
realm="" />
</security>
Run Code Online (Sandbox Code Playgroud)
并在代码中添加:
ws.ClientCredentials.UserName.UserName = "";
ws.ClientCredentials.UserName.Password = "";
Run Code Online (Sandbox Code Playgroud)
现在它似乎可能正在使用凭据,但它给了我错误:
提供的URI方案'http'是无效的URI预期'https'
我甚至都不知道这是不是正确的方法......
我有一个N-Tier应用程序,其构建如下:
在IIS7的服务器端坐着一个ASP.Net应用程序,它公开WCF服务上的方法.这些方法使用EF4与DB通信.用Silverlight 4.0编写的客户端正在调用WCF服务上的方法.
WCF服务公开此方法:
[OperationContract]
void DeleteItem(int i_ItemId);
Run Code Online (Sandbox Code Playgroud)
我不熟悉WCF服务,但我认为接下来的观察结果是正确的(如果我错了,请纠正我):
1)如果我按原样保留此方法/服务,任何知道我的服务位于http://www.mysite.com/myservice.svc的人都可以打开VisualStudio,打开"添加服务参考"并开始拨打电话到DeleteItem().
2)如果我尝试通过删除MEX端点来解决上述问题,仍然可以使用一些手动编码来调用服务.
因此,我试图解决这两个问题,开始学习WCF中的一些内置安全功能.快速浏览后,我想我可以使用以下绑定配置,以便拨打服务时需要用户名和密码:
<wsHttpBinding>
<binding name="RequestUserName" >
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
</binding>
Run Code Online (Sandbox Code Playgroud)
试图采用这种解决方案,我首先想到的是:当用户登录客户端时,客户端使用用户的名称和密码作为WCF调用的凭据.在服务器端,这些凭据将根据数据库进行验证.
现在的问题是,用户已知这些凭证(用户名和密码),因此他可以使用它们以我已经提到的方式调用DeleteItem().
从这里我想出了两个解决方案:
1)使用userName和password作为凭证,我将在客户端使用硬编码密钥.在XAP中加扰Dll可能会阻止某人获取此密钥.
2)当用户登录客户端时,服务器会发送某种临时令牌(GUID或其他内容),客户端可以使用该临时令牌在此通信会话期间对其进行身份验证(比方说,直到用户关闭客户端) .
我的问题是:
第一个解决方案提供的安全级别以及为了破解它而需要努力的程度是多少?
如果第一个解决方案非常容易破解,那么在WCF中是否有内置的方法来管理我在第二个解决方案中提到的令牌系统?
欢迎其他可以达到范围的解决方案.
关于如何做到这一点似乎有太多的资源,但我真的找不到任何可以做我想做的事情.我正在尝试创建一个WCF Web服务,要求用户进行身份验证以便能够执行任何操作(调用方法,请参阅WSDL等).身份验证将是我为连接到LDAP服务器而编写的自定义部分.我想使用表单身份验证,因为我不希望客户端必须在每个请求上重新进行身份验证.我希望该服务只是将一个Forms Auth票证cookie发送到客户端,客户端可以将其发回以备将来的请求(我可以将其用于不支持cookie的客户端环境,例如移动应用程序).但是,在服务端,我需要能够在内存中存储每个用户的数据,以保留用户身份验证组的缓存副本(以避免重复调用LDAP服务器),这可以很容易地使用表单Auth票证.我是WCF和表单身份验证的新手,所以如果你不跳过"简单"的东西,我将不胜感激.谢谢!
我正在使用basicHttpBinding开发WCF服务,这些服务应该可以使用.net 1.1和.net 2.0访问,为此我使用basicHttpBinding.
在旧的ASMX Web服务中,我选择了一个Soap Header(AuthHeader)来对每个请求的用户进行身份验证.
如何使用basicHttpBinding在WCF中进行身份验证?任何样本或教程都会有所帮助.
NRK