要在ASP.NET中对用户进行身份验证,我见过这样的代码
if (loginManager.Authenticate(username, password))
{
Session["Authenticated"] = 1;
}在后续请求中,只需检查Session["Authenticated"]的值是否为1,即可判断当前用户是否通过鉴权。
这非常简单。我的问题是:这与ASP.NET窗体身份验证有什么不同?-使用FormsAuthentication类创建身份验证cookie,并确定用户是否基于User.Identity.IsAuthenticated字段进行身份验证?
发布于 2012-06-23 20:54:52
您应该使用forms身份验证,原因如下:
微软多年来一直在开发
<代码>G211
发布于 2012-06-23 21:46:54
如果会话cookie和会话过期是同步的-可能没有区别。但情况并不总是这样。仅举一个例子-您将会话存储在ASP.NET - InProc的默认设置中。但是由于某些原因,SessionState进程被重启、终止、终止,不管是什么--所有的会话都消失了。然后,用户访问该站点-他有一个有效的Auth cookie,并通过了身份验证。但是无法检索会话,因此将作为新会话重新创建(Session.IsNewSession= true)。因此,用户将根据FormsAuthentication进行身份验证,但不会有会话“authenticated”= 1...
在这个问题上,我发现这篇文章非常有用:http://www.abstraction.net/ViewArticle.aspx?articleID=74
用户的身份验证令牌和他的会话之间是否存在依赖关系?
理想情况下,答案应该是否定的。出于许多原因,您不应该依赖会话数据来处理与安全相关的问题,其中包括分离关注点。一个令牌处理用户访问权限,另一个处理跨请求存储用户数据。然而,在许多情况下,开发人员选择在会话中存储用户的访问权限,最常见的情况是在允许匿名和身份验证访问的站点中,身份验证用户具有比匿名用户更多的功能/页面。表单因此,开发人员不是将访问权限令牌存储在用户的身份验证cookie中,而是选择将用户的访问权限存储在用户的会话中(有时是因为安全问题-但是,这通常是一种错误的担忧,因为可以通过web.config中元素的保护属性对用户的身份验证令牌进行非常强且非常容易的加密)。但这假设会话在身份验证之前不会过期-否则,您将留下一个经过身份验证的用户,而您实际上并不知道其访问权限,因为这些权限存储在会话中,该会话现在已不存在于中。面对这种依赖性,许多开发人员认为将会话超时值设置为比身份验证超时值更高的值,并将窗体身份验证的slidingExpiration设置为true就足够了。其思路是,在此设置中,用户身份验证将首先过期,使ASP.Net自动处理此问题,并将用户重定向到登录页面(在web.config中设置)。如果会话仍然存在,它将被续订,如果不存在,将创建一个新的会话,然后将根据用户的登录设置用户的访问权限。
发布于 2012-06-23 14:10:01
使用会话进行身份验证既不是一种标准,也不是一种好的做法,因为会话是使用通过FormsAuthentication类设置的SessionID来标识的。这个类负责维护用户与服务器的会话绑定,通过使用cookies,或者如果cookies被禁用,则通过重写用户URL来维护SessionID。虽然会话可能会丢失或受损,但SessionID机制通过对每个请求进行加密和检查来保护。还有许多其他原因支持这一论点。因此,简而言之,我建议使用标准方法。
https://stackoverflow.com/questions/11167308
复制相似问题