Asp.net mvc 无法注销身份MVC 5(有时)
我们的网站有时会决定您无法注销,大多数情况下都能正常工作。下面是这件事的基本细节。我在远程服务器和本地测试中看到了Chrome和IE的这个问题,使用VS进行本地测试时,它甚至认为这是一个问题,需要足够长的时间来尝试使用clear/About强制删除会话,并将所有cookie日期设置为-1天。没有帮助 注意,只要我执行F12并清除域的cookies,问题就会停止,用户将注销。我已经更改了登录。。。正如您看到的,没有参数,没有变化。同样,这种情况有时也很难测试 看起来系统无法从浏览器中删除cookies,但我看不出原因,在不同的浏览器中,这样做更有意义 我知道这一联系,似乎很相似: 建议尝试什么或去哪里看,谢谢Asp.net mvc 无法注销身份MVC 5(有时),asp.net-mvc,cookies,Asp.net Mvc,Cookies,我们的网站有时会决定您无法注销,大多数情况下都能正常工作。下面是这件事的基本细节。我在远程服务器和本地测试中看到了Chrome和IE的这个问题,使用VS进行本地测试时,它甚至认为这是一个问题,需要足够长的时间来尝试使用clear/About强制删除会话,并将所有cookie日期设置为-1天。没有帮助 注意,只要我执行F12并清除域的cookies,问题就会停止,用户将注销。我已经更改了登录。。。正如您看到的,没有参数,没有变化。同样,这种情况有时也很难测试 看起来系统无法从浏览器中删除cooki
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 5和Google Chrome一段时间后无法注销,我刚刚在帖子中找到了解决方案:。这个问题现在已经解决了,但我需要再测试一段时间,因为它是间歇性问题。这篇文章中有人确认他们的问题也得到了解决。所以,试试看 我在使用ASP.NET MVC 5和Google Chrome一段时间后无法注销时也遇到了同样的问题,我刚刚在帖子中找到了解决方案:。这个问题现在已经解决了,但我需要再测试一段时间,因为它是间歇性问题。这篇文章中有人确认他们的问题也得到了解决。所以,试试看 我想我知道这里的问题是什么-虽然我不知道如何解决它,但有时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分钟后,注销。繁荣我没有注销
现在,这里的问题是GenerateUserIdentityAsync方法在注销发生后立即重新创建身份验证cookie。我已经通过日志记录验证了这一点_authenticationManager.SignOutDefaultAuthenticationTypes.ApplicationOkie;在我的注销操作中,cookie被重新生成。Doh
如何修复-显而易见的是增加validateInterval,但这会影响安全性-如果有人登录到两台计算机,并更改其密码,我希望两个帐户都能很快注销-这就是它的作用
所以,这可能就是原因。很抱歉,我不能提供一个很好的解决方案:我想我知道这里的问题是什么-虽然我不知道如何解决它,但有时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分钟后,注销。繁荣我没有注销
现在,这里的问题是GenerateUserIdentityAsync方法在注销发生后立即重新创建身份验证cookie。我已经通过日志记录验证了这一点_authenticationManager.SignOutDefaultAuthenticationTypes.ApplicationOkie;在我的注销操作中,cookie被重新生成。Doh
如何修复-显而易见的是增加validateInterval,但这会影响安全性-如果有人登录到两台计算机,并更改其密码,我希望两个帐户都能很快注销-这就是它的作用
所以,这可能就是原因。很抱歉,我无法提供一个很好的解决方案:请注意,如果您的意思是将ExternalCookie添加到注销中,那么上面的示例中就包含了该代码。话虽如此,但当我在注销时遇到了可能适用的问题时,我将其更改为。基本上,在我的测试机上,我无法使用SignOut注销,因此我将其更改为SignOutDefaultAuthenticationTypes.ExternalCookie,但它没有帮助,我最终不得不清除co
okies正在使用浏览器。现在它可以工作了,但有时也会出现问题。解决方案是将DefaultAuthenticationTypes.ApplicationOkie作为参数传递给SignOut方法,而不是DefaultAuthenticationTypes.ExternalCookie。请使用此选项重试。注意,如果您的意思是将ExternalCookie添加到注销,则上面的示例中包含该代码。话虽如此,但当我在注销时遇到了可能适用的问题时,我将其更改为。基本上,在我的测试机器上,我无法使用SignOut注销,因此我将其更改为SignOutDefaultAuthenticationTypes.ExternalCookie,但没有任何帮助,我最终不得不使用浏览器清除Cookie。现在它可以工作了,但有时也会出现问题。解决方案是将DefaultAuthenticationTypes.ApplicationOkie作为参数传递给SignOut方法,而不是DefaultAuthenticationTypes.ExternalCookie。请使用此选项重试。在时间到期后,GenerateUserIdentityAsync将再次运行,这是正确的。但是,这在提供任何页面之前运行,因此注销代码在此之后运行。为我更改AuthenticationManager.SignOut;至AuthenticationManager.SignOutDefaultAuthenticationTypes.ApplicationOkie;似乎已经完成了一个技巧,你是对的,在时间到期后,GenerateUserIdentityAsync将再次运行。但是,这在提供任何页面之前运行,因此注销代码在此之后运行。为我更改AuthenticationManager.SignOut;至AuthenticationManager.SignOutDefaultAuthenticationTypes.ApplicationOkie;似乎是他干的