如何防止客户端使用 WCF 修改数据协定的内容?



我正在构建一个应用程序,该应用程序要求用户在启动时登录。

身份验证过程如下:

  • 用户输入用户名/密码
  • 客户端向Web服务发送用户名+密码
  • Web服务使用数据库中的散列密码对用户进行身份验证
  • Web服务向客户端返回一个令牌,该令牌包含以下三个值之一:

    1) 用户名无效。

    2) 密码无效。

    3) 用户已通过身份验证。

  • 客户端使用该令牌来确定下一个操作过程。

  • 令牌与客户端进行的每个后续调用一起传递给服务。如果用户未通过身份验证,服务将拒绝该调用。

令牌封装在DTO中,DTO是一个DataContract。令牌本身是一个DataMember。DataMembers要求属性具有一个setter和一个getter。这意味着客户端现在可以为令牌设置一个值,这是不好的。从技术上讲,客户端现在可以将自己标记为已通过身份验证。

如何防止客户端修改令牌的值?有什么模式可以帮助我吗?

服务器必须"知道"令牌并对其进行验证。

您无法限制客户端更改令牌。想想看,我给你发了一个DTO,基本上是一捆信息。稍后,你把包裹寄回我。我怎么能阻止你更改包裹里的东西呢?我唯一能做的就是检查捆绑包是否有效,你没有改变任何我不希望你改变的东西,等等

如果您的令牌是一个简单的authenticated标志,那么这有点灾难。想象一下,一个网站接受了一个完全信任我的logged in参数。你告诉网络服务器你已经登录,它相信你?www.visa.com/account.html?account=123456&loggedIn=true似乎不太安全。

在平台无关的世界里,您可以使用加密来创建可以验证的安全令牌。您已经有了一个令牌,所以也许可以向验证用户的令牌中添加一些加密内容。客户端不知道数据是什么,也无法轻松解密。他们需要在每次请求时将令牌返回给服务器。服务器可以对令牌进行解密,从而确认用户已通过身份验证。

当然,代币需要过期,并且需要安全且不可猜测。在Windows世界中,使用Windows身份验证或一种内置的.NET身份验证模式可能更简单。

最新更新