1

我正在构建一个需要用户在启动时登录的应用程序。

认证过程如下:

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

    1) 用户名​​无效。

    2) 密码无效。

    3) 用户被认证。

  • 客户端使用令牌来确定下一步行动。

  • 令牌会在客户端进行的每个后续调用中传递给服务。如果用户未通过身份验证,服务将拒绝呼叫。

令牌被封装在一个 DTO 中,它是一个 DataContract。令牌本身是一个 DataMember。DataMembers 要求该属性有一个 setter 和一个 getter。这意味着客户端现在可以为令牌设置一个值,这很糟糕。客户现在可以在技术上将自己标记为经过身份验证。

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

4

1 回答 1

1

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

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

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

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

当然,令牌需要过期,并且需要安全且不可猜测。在 Windows 世界中,使用 Windows 身份验证或滚动的 .NET 身份验证模式之一可能更简单。

于 2012-08-19T23:16:00.280 回答