IsPersistent无法正常工作 - Cookie仅对当前会话有效

时间:2014-09-08 19:26:33

标签: c# asp.net-mvc asp.net-mvc-5 asp.net-identity asp.net-identity-2

我有一个使用ASP.NET MVC 5的{​​{1}}应用程序进行用户身份验证 过去一切都运行良好,但现在我发现持久的用户会话不再起作用了。我不知道是什么改变打破了这个,但是当我实现Identity(从ASP.NET Identity 2.1.0转换了应用程序)时它起作用了,这是我现在的逻辑:

SimpleMembership

var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: true); 是基于SignInManager的{​​{1}},ApplicationSignInManagerSignInManager<ApplicationUser, int>

我的设置:

model.RememberMe

除了持久化用户会话外,一切正常。我检查了我的服务器返回的cookie,true总是返回为&#34;对当前会话有效#34;而不是将来的某个日期。因此,当我关闭并重新打开浏览器时,我需要再次登录...

有人知道为什么这不起作用了吗?

P.S。:我在app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login"), Provider = new CookieAuthenticationProvider { OnValidateIdentity = ApplicationCookieIdentityValidator.OnValidateIdentity( validateInterval: TimeSpan.FromMinutes(0), regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) } }); app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5)); app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie); app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 中覆盖.AspNet.ApplicationCookie,因为我在那里做了一些自定义逻辑,但我甚至检查了调试器并进行了以下调用:

SignInAsync

ApplicationSignInManagerawait base.SignInAsync(user, isPersistent, rememberBrowser); ,因此应创建一个持久性Cookie。

3 个答案:

答案 0 :(得分:6)

This is a known bug in Identity并且通过this answer查看它并不是很新的。

当每次请求都重新生成cookie时,&#34; IsPersisted&#34;标志未设置,即使在原始cookie中设置时也是如此。

要解决此问题,您需要实现自己的cookie验证器版本,该验证器将按原样设置标志。

我想我已经为你找到了解决方案,但我没有编译或测试它 - 只是一个方向,你需要去的地方。见gist for full code 这只是从反编译器中获取的SecurityStampValidator代码。我added lines 91-96。基本上我采取了#34; IsPersistent&#34;来自上一个cookie的标志,并在创建时将其添加到新cookie。这不是在非修改版本中完成的。

然后在您的Auth.Config中执行:

Provider = new CookieAuthenticationProvider
            {
                OnValidateIdentity = MySecurityStampValidator.OnValidateIdentity(
                    validateInterval: TimeSpan.FromMinutes(0),
                    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
            }

请注意,当新版本出来时,请检查这是否已修复,以便您可以删除脏修复程序。这个问题是reported to be fixed,但是在v2.1发布后不久。

答案 1 :(得分:1)

"application/x-www-form-urlencoded"AspNet.Identity.Core同时更新为2.2.1应解决此问题。

答案 2 :(得分:0)

为了保持用户在Mvc Indentity中在浏览器上的登录状态关闭。下面的代码是Startup.Auth.cs类中对我有用的代码。

app.UseCookieAuthentication(new CookieAuthenticationOptions
                    { 
                        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                        SlidingExpiration = true,
                        CookieHttpOnly = false,
                        LoginPath = new PathString("/Account/Login"),

                        Provider = new CookieAuthenticationProvider
                        {  
                            OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                            validateInterval: TimeSpan.FromMinutes(30),

                                regenerateIdentity: (manager, user) => 
                                user.GenerateUserIdentityAsync(manager)),

                            OnResponseSignIn = context => {
                                context.Properties.IsPersistent = true; };
                            } 
        }