4

我们正在使用 ASP.NET MVC 在中间构建一个 3 层 Web 应用程序。我们使用直接 MVC 和 WebAPI 的组合来实现响应。使用基于令牌的服务来保护后端数据。

我们的目的是为每个登录系统的用户请求一个新令牌。虽然所有令牌都将使用相同的用户/密码组合生成,但我们认为如果我们可以将令牌与用户名和会话相关联,它至少会提供一些可追溯性。

为了简单和灵活,我们将生成的令牌存储到会话状态中。我们需要会话状态,即使是 WebAPI 调用,我们也可以访问该令牌以进行 WebAPI 调用。在访问我们的 REST 资源之前,我们需要进行身份验证。

我已经阅读了很多关于 SO 的帖子,这听起来像是一种糟糕的方法。有哪些选择?这个解决方案的真正限制是什么?

提前感谢您的输入

4

2 回答 2

2

会话相对容易被破坏。会话 cookie 没有加密(尽管您可以指定它是一个安全的 cookie,这会有所帮助),也没有验证它是否有效。这使得窃取和/或攻击相对容易。

此外,由于许多其他原因,会话并不理想,例如每当 asp.net 工作进程被回收时,会话就会丢失。这将迫使用户重新登录。因此会话可能会在任何时候随机丢失,因为您无法控制工作进程何时回收(它可以在多种原因下这样做)。

我真的不知道您的令牌系统的详细信息,因此很难提出替代方案,但您可以查看 FormsAuthentication 生成身份验证 cookie 的方式作为基础。您还可以使用 FormsAuthentication 并将您的令牌存储在票证的用户数据中。

于 2013-02-23T06:52:34.510 回答
2

您必须考虑系统是否会由于身份验证和会话的分离而受到损害,因为 ASP.Net 将会话标识符存储为身份验证 cookie 的单独 cookie。

举这个过于简单的例子:

你想强制用户在第一次登录时更改他的密码,没有例外,所以在你Session["MustCheck"] = true在登录时设置的代码中。

用户很聪明,并意识到这是由会话控制的。他们如何绕过它?

他们删除会话 cookie,从而删除当前会话并仍处于登录状态。

现在没有“必须检查”,因此用户可以完全避免它

如果您想做一些涵盖所有基础的事情,cookie 是您的最佳选择。

您可以使用类似于加密cookie 值的方法,在其中使用经过验证的方法加密值(不要使用您自己的方法!)。

已验证的用户 ID 或与用户相关的不可变 (ID) 作为密钥。

您也可以使用其中一种

于 2013-02-25T14:18:20.260 回答