【发布时间】:2015-12-10 20:39:10
【问题描述】:
我正在尝试在用户登录时创建一个持久性 cookie(不使用内置身份验证)。
我能想到的唯一方法是创建一个过期日期设置为DateTime.Now.AddYears(1)的cookie
因为我想允许用户注销,所以我在登录表单后面的每个页面的布局上都有一个注销按钮。
此注销按钮如下所示:
<li>@Html.ActionLink("Log Out", "Logout", "Home")</li>
让我感到困惑的是,这段代码并没有从浏览器中删除 cookie。它会将我带回登录表单,但我仍然可以轻松导航回受保护的页面,并且它仍会根据我之前的登录记录记住我的身份。
这是我的代码:
[AllowAnonymous]
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Login(User model)
{
try
{
DoLogin(model.EmailAddress, model.Password);
return Json(new
{
Message = "Success",
IsOK = bool.TrueString
});
}
catch (Exception ex)
{
SendError("/", ex);
return ReportError(ex, "USER LOGIN");
}
}
private void DoLogin(string EmailAddress, string Password)
{
var user = db.Users.Include("UserRole").FirstOrDefault(x => x.EmailAddress == EmailAddress);
if (Hashing.ValidatePassword(Password, user.Password))
generateCookie(user);
}
private void generateCookie(Models.User u)
{
HttpCookie userCookie = new HttpCookie("Ortund");
userCookie.Values["userid"] = Convert.ToString(u.Id);
userCookie.Values["fname"] = u.FirstName;
userCookie.Values["lname"] = u.LastName;
userCookie.Values["role"] = u.UserRole.RoleName;
userCookie.Expires = DateTime.Now.AddYears(1);
Response.Cookies.Add(userCookie);
}
那为什么不清除我的 cookie?
编辑
所以现在我已经根据问题答案中的建议修改了我的代码(见下文)。
我在控制器上添加了一个注销操作,它会这样做:
public ActionResult Logout()
{
Session.Clear();
HttpCookie userCookie = new HttpCookie("Ortund");
userCookie.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(userCookie);
return View("Index");
}
虽然我的登录似乎仍然可以正常工作,但 Request Cookie 并未使用新的登录详细信息进行更新。这是我登录后的样子:
Request.Cookies["Ortund"] {System.Web.HttpCookie} System.Web.HttpCookie
Domain null string
Expires {0001-01-01 12:00:00 AM} System.DateTime
HasKeys true bool
HttpOnly false bool
Name "Ortund" string
Path "/" string
Secure false bool
Shareable false bool
【问题讨论】:
-
1.您需要将过期的cookie写入响应,而不是读取并将其设置回请求。 2. FormsAuthentication.SignOut() 可能会或可能不会删除 cookie,这取决于您如何在 web.config 中配置表单身份验证。查看您的代码,您可能没有正确配置。
-
@Igor 实际上我根本没有设置表单身份验证,所以我想我可以把它拿出来吧
-
顺便说一句,使用
action作为查询字符串变量可能会有点混乱,因为术语操作在 MVC 中具有特定含义。为什么不创建一个实际的Logout操作来执行 cookie 失效,然后重定向到Index操作?
标签: asp.net asp.net-mvc cookies