我有一个使用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}},ApplicationSignInManager
是SignInManager<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
ApplicationSignInManager
为await base.SignInAsync(user, isPersistent, rememberBrowser);
,因此应创建一个持久性Cookie。
答案 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; };
}
}