2

为了在 ASP.NET 中对用户进行身份验证,我见过这样的代码

if (loginManager.Authenticate(username, password))
{
    Session["Authenticated"] = 1;
}

而在后续的请求中,只需检查 的值是否Session["Authenticated"]为 1 即可判断当前用户是否通过了认证。

这很简单。我的问题是:这与 ASP.NET 表单身份验证有何不同?- 使用 FormsAuthentication 类创建身份验证 cookie 并根据User.Identity.IsAuthenticated字段确定用户是否经过身份验证?

4

3 回答 3

1

如果会话 cookie 和会话过期是同步的 - 可能没有区别。但情况并非总是如此。仅举一个例子 - 您将 Session 存储在 ASP.NET 的默认值中 - InProc。但是由于某种原因,SessionState 进程被重新启动、杀死、死亡,无论如何——所有会话都消失了。然后一个用户来到该站点——他有一个有效的 Auth cookie 并通过了身份验证。但是无法检索会话,因此重新创建为 new(Session.IsNewSession = true)。所以用户将根据 FormsAuthentication 进行身份验证,但不会有 Session["Authenticated"] = 1...

我发现这篇文章对此事非常有用:http ://www.abstraction.net/ViewArticle.aspx?articleID=74

用户的身份验证令牌和他的会话之间是否存在依赖关系?

理想情况下,答案应该是否定的。出于多种原因,您不应该依赖会话数据来解决与安全相关的问题,其中包括关注点分离。一个令牌处理用户访问权限,另一个令牌跨请求存储用户数据。但是,在许多情况下,开发人员选择将用户的访问权限存储在会话中,最常见的是在允许匿名和经过身份验证的访问的站点中,经过身份验证的用户比匿名用户拥有更多可用的功能/页面。因此,开发人员没有将访问权限令牌存储在用户的身份验证 cookie 中,而是选择将用户的访问权限存储在用户的会话中(有时是因为被认为是安全问题——然而,这通常是一个错误的担忧,因为用户的身份验证令牌可以通过 web.config 中 forms 元素的 protection 属性非常容易地加密)。但这假设会话在身份验证之前不会过期 - 否则您将留下一个经过身份验证的用户,您实际上不知道其访问权限,因为这些用户存储在现在已经消失的会话中. 当面对这种依赖时,许多开发人员认为将会话超时设置为比身份验证超时更高的值就足够了,并将slidingExpiration设置为true以进行表单身份验证。想法是,在此设置中,用户身份验证将首先过期,导致 ASP.Net 自动处理此问题并将用户重定向到登录页面(如 web.config 中设置的那样)。如果会话仍然存在,它将被更新,如果没有,将创建一个新会话,然后根据用户的登录设置用户的访问权限。

于 2012-06-23T13:46:54.320 回答
0

使用会话进行身份验证既不是标准也不是好的做法,因为会话是使用SessionID通过 FormsAuthentication 类设置的 a 来标识的。此类负责维护用户与服务器的会话绑定,方法是使用 cookie,或者如果 cookie 被禁用,则用户 URL 重写以维护SessionID。虽然会话可能会丢失或受损,但该SessionID机制受到加密和检查每个请求的保护。支持这一论点还有许多其他理由。所以简而言之,我建议使用标准方式。

于 2012-06-23T06:10:00.793 回答
0

由于以下几个原因,您应该使用表单身份验证:

  1. 表单身份验证由 Microsoft 开发多年。它测试了它的安全性。您的方法从未经过测试,因此您和我都无法确定它是否安全,但表单身份验证受到所有人的信任。
  2. 人们为会话提前到期而苦苦挣扎。
  3. 由于有许多同时访问您的网站的用户,使用会话会导致内存问题。
  4. 使用表单身份验证更简洁、更优雅。
  5. 为什么不使用许多开发人员使用的方法,如果明天有人加入您的团队并帮助您的项目,他可能会弄错您的逻辑并可能危及安全性。
于 2012-06-23T12:54:52.270 回答