这是个好主意吗?通过设置会话变量对 ASP.NET 中的用户进行身份验证



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

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

而在随后的请求中,只需检查Session["Authenticated"]的值是否为1,即可确定当前用户是否经过身份验证。

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

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

我发现这篇文章在这个问题上非常有用:http://www.abstraction.net/ViewArticle.aspx?articleID=74

用户的身份验证令牌与他的会议?

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

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

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

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

最新更新