Asp.net MVC身份验证没有创建auth cookie

时间:2009-09-22 20:26:18

标签: asp.net-mvc forms-authentication

我正在使用方法“FormsAuthentication.SetAuthCookie”对我的应用程序中的用户进行身份验证,但是当我关闭浏览器并重新打开它时,它仍然经过身份验证,但会话已经结束,然后我的应用程序崩溃,因为它在会话上有必要的数据来生成菜单。

我想要做的是:创建身份验证票证而不创建auth cookie,每当用户在新的浏览器会话中打开页面时,它将再次请求登录。

我怎样才能做到这一点。

3 个答案:

答案 0 :(得分:4)

会话和身份验证不同。如果您希望在浏览器关闭时cookie消失,请使用

FormsAuthentication.SetAuthCookie("username", false);

答案 1 :(得分:2)

是否有其他浏览器窗口打开?有时如果打开其他浏览器窗口,cookie将会持续存在。

答案 2 :(得分:0)

浏览器关闭时,Cookie或会话中没有任何属性可以使它们过期。它们只受到期时间的控制(任何指定cookie标准的人都应该想到的东西。)

将false传递给SetAuthMethod不会告诉浏览器在浏览器关闭时删除cookie。事实上,如果浏览器启用了一个选项,可以返回打开的选项卡,它将使用所有的cookie重新打开这些选项卡。如果这些身份验证cookie尚未过期,您将发现自己已登录。

您可以做的是指定用户检查“记住我”与未检查时的不同到期时间:

// create this private method.
private void SetAuthCookie(string emailAddress, bool keepMeLoggedIn)
{
    int timeout = keepMeLoggedIn ? 525600 : 20; // Timeout in minutes, 525600 = 365 days.
    var ticket = new FormsAuthenticationTicket(emailAddress, keepMeLoggedIn, timeout);
    string encrypted = FormsAuthentication.Encrypt(ticket);
    var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted);
    cookie.Expires = System.DateTime.Now.AddMinutes(timeout);
    cookie.HttpOnly = true; // cookie not available in JavaScript.
    HttpContext.Response.Cookies.Add(cookie);
}

// use it instead of FormsAuthentication.SetAuthCookie(model.username, model.RememberMe);
SetAuthCookie(model.username, model.RememberMe);