【问题标题】:Can't logoff identity MVC 5 (sometimes)无法注销身份 MVC 5(有时)
【发布时间】:2015-05-31 03:47:00
【问题描述】:

我们的网站有时会决定您无法退出,但大多数情况下它都能正常工作。以下是这件事的基本内容。我已经在远程服务器上的 Chrome 和 IE 以及使用 VS 的本地测试中看到了这个问题。它甚至决定在本地测试中成为一个足够长的问题,以尝试通过清除/放弃强制删除会话并将所有 cookie 日期设置为 -1 天。没有帮助。

请注意,一旦我执行 F12 并清除域的 cookie,问题就会停止并且用户已注销。如您所见,我已经更改了 SignOut(...) 并且没有参数,没有更改。同样,这种情况有时会发生,很难测试。

系统似乎无法从浏览器中删除 cookie,但我看不出原因,并且使用不同的浏览器更没有意义。

我知道这个链接,看起来很相似:Cannot logoff of identity MVC 5 application

建议尝试什么或在哪里寻找,谢谢。

Login
var user = await UserManager.FindAsync(model.Email, model.Password);
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = true }, await user.GenerateUserIdentityAsync(UserManager));

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
   AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
   return RedirectToAction("Index", "Home");
}

编辑: 查看 Chrome F12-Cookies。如果我只是删除 .AspNet.ApplicationCookie 并尝试导航,我就会被登录。按注销选项仍然不起作用。我看到 cookie 将在 14 天后过期,并且日期没有改变。真的似乎默认系统没有尝试使 cookie 过期或者也不允许。有这个的源代码吗?

【问题讨论】:

    标签: asp.net-mvc cookies


    【解决方案1】:

    我想我知道问题出在哪里 - 虽然我不确定如何解决它,但有时 asp.net 身份的文档混乱;(

    我有完全相同的症状。关键问题是,您是否使用 SecurityStampValidator 来验证和重新创建(如果需要)您的 cookie?

    我愿意,而且我的验证非常频繁(来自我的 Startup.auth):

    Provider = new CookieAuthenticationProvider
    {
        // Enables the application to validate the security stamp when the user logs in.
        // This is a security feature which is used when you change a password or add an external login to your account.  
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, User, int>(
            validateInterval: TimeSpan.FromMinutes(1), 
            regenerateIdentityCallback: (manager, user) =>
            {
                return user.GenerateUserIdentityAsync(manager);
            },
            getUserIdCallback: id => (int.Parse(id.GetUserId()))
            ),
    },
    

    假设您有类似的代码 - 您如何重新创建。很简单——登录,在你的应用程序上点击一个页面,然后等待定义的 validateInterval 失效——所以对我来说,等待 1 分钟。 1分钟后,注销。 轰隆隆。我没有注销。

    现在,这里的问题是 GenerateUserIdentiyAsync 方法在注销发生后立即重新创建您的身份验证 cookie。我已经通过日志验证了这一点 - 我的 LogOff 操作中的 _authenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie); 正在发生,然后 cookie 被重新生成。呵呵。

    如何解决 - 显而易见的事情是增加 validateInterval,但这会影响安全 - 如果有人登录到 2 台计算机并更改了他们的密码,我希望两个帐户都能很快注销 - 这就是这样做的。

    所以,这(可能)是原因。对不起,我不能提供一个很好的解决方案:(

    【讨论】:

    • 你是对的,在时间到期后,GenerateUserIdentityAsync 将再次运行。但是,这在提供任何页面之前运行,因此注销代码在此之后运行。对我来说,将 AuthenticationManager.SignOut(); 更改为 AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie); 似乎已经成功了
    【解决方案2】:

    在使用 ASP.NET MVC 5 和 Google Chrome 一段时间后,我遇到了同样的问题,我刚刚在帖子中找到了解决方案:ASP.Net MVC 5 w/identity 2.2.0 Log off not working。现在问题已经解决了,但我需要再测试一段时间,因为它是间歇性问题。这篇文章中有人确认他们的问题也已解决。所以,试一试吧!

    【讨论】:

    • 请注意,如果您的意思是将 ExternalCookie 添加到 SignOut,我上面的示例中包含该代码。话虽如此,当我遇到可能适用的退出问题时,我将其更改为。基本上在我的测试机器上,我无法使用 SignOut() 退出,所以我将其更改为 SignOut(DefaultAuthenticationTypes.ExternalCookie) 并没有帮助,我最终不得不使用浏览器清除 cookie。现在它可以工作了,但有时它又是一个问题。
    • 解决方案是将 DefaultAuthenticationTypes.ApplicationCookie 作为参数传递给 SignOut 方法,而不是 DefaultAuthenticationTypes.ExternalCookie。请使用此选项重试。
    猜你喜欢
    • 2014-08-01
    • 2014-03-03
    • 2014-08-20
    • 2017-09-02
    • 2020-12-03
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    相关资源
    最近更新 更多