5

我有一个构建如下的 N 层应用程序:
在 IIS7 的服务器端,有一个 ASP.Net 应用程序,它公开 WCF 服务上的方法。这些方法使用 EF4 与数据库通信。用 Silverlight 4.0 编写的客户端正在调用 WCF 服务上的方法。

WCF 服务公开了这个方法:

[OperationContract]
void DeleteItem(int i_ItemId);

我是安全 WCF 服务的新手,但我认为接下来的这些观察是正确的(如果我错了,请纠正我):

1)如果我保留此方法/服务,任何知道我的服务位于http://www.mysite.com/myservice.svc的人都可以打开 VisualStudio,打开“添加服务引用”并开始拨打电话删除项目()。

2) 如果我尝试通过删除 MEX 端点来解决上述问题,仍然可以使用一些手动编码来调用服务。

因此,为了解决这两个问题,我开始学习 WCF 中的一些内置安全功能。快速浏览后,我想我可以使用以下绑定配置,以便调用服务需要用户名和密码:

  <wsHttpBinding>
    <binding name="RequestUserName" >
      <security mode="Message">
        <message clientCredentialType="UserName"/>
      </security>
    </binding>

尝试采用这种解决方案时,我首先想到的是:当用户登录客户端时,客户端使用用户名和密码作为 WCF 调用的凭据。在服务器端,这些凭据会根据数据库进行验证。

现在的问题是,用户当然知道这些凭据(用户名和密码),因此他可以使用它们以我已经提到的方式调用 DeleteItem()。

从这里我想出了两个解决方案:

1) 我将在客户端使用硬编码密钥,而不是使用用户名和密码作为凭据。对 XAP 中的 Dll 进行加扰可能会阻止某人获得此密钥。

2)当用户登录客户端时,服务器会发送某种临时令牌(GUID 或其他东西),客户端可以在此通信会话期间使用它来验证它的调用(假设,直到用户关闭客户端) .

我的问题是:

第一个解决方案提供的安全级别是多少?您需要付出多大的努力才能破解它?

如果第一个解决方案很难破解,WCF 中是否有内置方法来管理我在第二个解决方案中提到的令牌系统?

欢迎其他可以适应范围的解决方案。

4

1 回答 1

1

我不确定您要询问的安全级别,但我不会有信心将用户名和密码存储在 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;
}

您将像通常使用带有<authorization>元素的表单一样保护网站的各个部分<deny users="?">。浏览器将为您处理所有 cookie。如果您想保护服务,在 Service/ 文件夹下,您将拒绝未经身份验证的用户访问它。

MSDN 帖子更详细地讨论了该解决方案。

于 2011-08-05T19:05:14.957 回答