Yar*_*evi 5 wcf-binding wcf-authentication wcf-security silverlight-4.0
我有一个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中是否有内置的方法来管理我在第二个解决方案中提到的令牌系统?
欢迎其他可以达到范围的解决方案.
我不确定您所询问的安全级别,但我对将用户名和密码存储在 XAP 文件中(无论是否混淆)没有信心。
我可以描述我在生产中实施的解决方案。
基本上,我使用标准表单身份验证来保护应用程序,但我不像通常使用 ASP.NET 那样使用重定向,而是使用 ASP.NET 表单身份验证附带的身份验证 Web 服务。这样我的登录就可以通过 Silverlight 控件进行。我的应用程序有一个用户存储,我可以根据该用户存储对身份验证服务进行身份验证。
为了连接到身份验证服务,我在 Global.asax 中执行以下操作:
protected void Application_Start(object sender, EventArgs e)
{
AuthenticationService.Authenticating += new EventHandler<AuthenticatingEventArgs>(AuthenticationService_Authenticating);
}
void AuthenticationService_Authenticating(object sender, AuthenticatingEventArgs e)
{
try
{
bool authenticated = //Call your user store here.
e.Authenticated = authenticated;
}
catch (Exception ex)
{
e.Authenticated = false;
}
e.AuthenticationIsComplete = true;
}
Run Code Online (Sandbox Code Playgroud)
<authorization>您可以像通常使用带有 的元素的表单一样保护网站的各个部分<deny users="?">。浏览器将为您处理所有 cookie。如果您想保护服务,在 Service/ 文件夹下,您将拒绝未经身份验证的用户使用它。
这篇MSDN 帖子更详细地讨论了该解决方案。