为ASP.NET MVC实现自动登录

为ASP.NET MVC实现自动登录

问题描述:

我一直在尝试获取ASP.NET MVC中的成员资格。有些页面需要认证。其他人可以有客人和授权的成员。很像*。他们可以匿名或作为注册用户进行操作。为ASP.NET MVC实现自动登录

我们还有一个处理成员的自定义数据库模式(不是默认的ASP.NET Membership方式)。所以我会考虑写我自己的会员/主席代码。到目前为止,它的运行良好,但是我遇到了会话过期和能够实现“记住我”功能的问题。

我使用FormsAuthentication.SetAuthCookie(username,rememberMe)来设置表单cookie,但说用户离开机器20分钟或IIS回收我的会话死亡,并且我得到一个非常不一致的用户状态。

我在哪里可以看到'记住我'Cookie,并且如何处理用户再次登录?基本上我会存储用户名和密码,然后在Application_BeginRequest或其他东西中查找cookie吗?

如果我正确地阅读了您的话,您似乎期待ASP.NET检测到持久性身份验证Cookie并重新建立该用户的上次会话状态。它不会这样工作:身份验证cookie和asp.net会话是两个独立的事情,所以确实会有用户返回该站点并通过持久性AuthCookie传递身份验证的实例,但具有全新(空)会话数据。

假设AuthCookie设置正确,您可以检测到用户使用User.Identity.IsAuthenticated进行了身份验证,但不受IIS回收或会话过期的影响。用户名在User.Identity.Name中公开。

如果您需要在用户返回网站时重新初始化某些会话数据,则必须手动执行此操作。如果这真的是你问的问题,那么在不了解更多关于你的应用的情况下很难回答,但考虑global.asax中的Session_StartSession_End事件。或者你可以只空检查会话对象和重新填充时,它是空的(会话过期了之后),例如:

//get some user info from session or db if session is null 
string preferredName; 
if (User.Identity.IsAuthenticated) 
{ 
    object o = Session["preferredName"]; 
    if (o == null) 
    { 
     preferredName = repository.GetUser(User.Identity.Name).PreferredName; 
     Session["preferredName"] = preferredName; //save to session so this isn't necessary next time 
    } 
    else 
    { 
     preferredName = (string)o; 
    } 
} 
else 
{ 
    preferredName = "anon"; 
} 
+2

只是知道有session_end-的cavets当会话状态是不工作存储在SQL服务器上,例如 – RichardOD 2009-10-21 17:42:57

+0

好点!我将其纳入了全面披露的利益,但我也会避免在session_end中做太多或任何事情。 – 2009-10-21 17:50:44