2

我一直在尝试让会员在 ASP.NET MVC 中工作。有些页面需要身份验证。其他可以有客人和授权成员的人。很像 StackOverflow。他们可以匿名或作为注册用户做事。

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

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

我在哪里捕获“记住我”cookie,如何处理用户再次登录?本质上,我是否存储用户名和密码,然后在 Application_BeginRequest 或其他内容中查找 cookie?

4

1 回答 1

4

如果我没看错,您似乎希望 ASP.NET 检测持久性身份验证 cookie 并重新建立该用户的最后一个会话状态。它不是那样工作的:身份验证 cookie 和 asp.net 会话是两个独立的东西,所以确实会有用户返回站点并通过持久 AuthCookie 通过身份验证的实例,但具有全新的(空)会话数据。

假设 AuthCookie 设置正确,您可以检测到用户已通过身份验证,User.Identity.IsAuthenticated不受 IIS 回收或会话过期的影响。用户名暴露在User.Identity.Name.

如果您需要在用户返回站点时重新初始化某些Session数据,则必须手动执行此操作。如果这确实是您要问的,那么在不了解您的应用程序的情况下很难回答,但请考虑 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";
}
于 2009-10-21T17:40:07.080 回答