前言:我已经读过这个(ASP.NET MVC membership - user being logged out frequently - don't know why)和这个(ASP.NET Identity 2 Remember Me - User Is Being Logged Out)和这个(ASP.NET 5 Identity 3 users get signed out after some time)和这个(User gets logged out with 'Remember me')。
我在这里有点噩梦。我在VS 15中设置了一个锅炉板MVC5应用程序。所有内容都已更新到最新版本(特别是identity.core和identity.owin,因为我读到了锅炉板MS的问题)。
我们注意到,在我们的其中一个应用上大约10-15分钟无活动后,用户才被注销。此外,我们的用户报告说"记得我"功能根本没有用。
我无法弄清楚我做错了什么......
Startup.Auth.cs:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
SlidingExpiration = true,
ExpireTimeSpan = System.TimeSpan.FromDays(30.0),
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
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, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
我的配置文件:
<system.web>
<httpCookies httpOnlyCookies="true" requireSSL="true" lockItem="true" />
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" slidingExpiration="true" timeout="60" requireSSL="true" />
</authentication>
<compilation targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2" />
<machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="SHA1" decryption="Auto" />
<httpModules>
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
</httpModules>
</system.web>
AccountController中的身份验证:
[ValidateAntiForgeryToken]
[HttpPost]
[AllowAnonymous]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, change to shouldLockout: true
var result = await SignInManager.PasswordSignInAsync(model.Username, model.Password, isPersistent: true, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
}
我基本上试图给用户一个30个滑动cookie。即只要他们在30天内访问该网站并且没有清除他们的cookie,他们就不必重新进行身份验证。
正如您所看到的,isPersistent在登录时设置为true,因此应始终将用户视为rememberMe = true;
有没有明显的我在这里错过了,或者我完全不了解持久登录和永久登录是如何工作的?
如果我做了些蠢事,请随意哼哼。提前谢谢。
注意:我已经修改了配置文件中表单身份验证条目的超时值,没有从测试中看到的更改。
编辑:我和我的托管公司说过,他们在15分钟不活动后回收了应用程序池。他们现在扩展了。但是,这并没有解决问题。我认为拥有机器密钥会确保cookie能够存活并且应用程序可以回收吗?我现在已经放了一个明确的机器密钥,看看它是怎么回事。关于问题的原因以及如何解决它仍然有点难过......
答案 0 :(得分:3)
所以出于某种原因(仍然不确定是什么)我的摆弄似乎有效。
我最终必须生成一个显式的机器密钥,而不是使用
validationKey="AutoGenerate,IsolateApps"
decryptionKey="AutoGenerate,IsolateApps"
我还要求我的托管公司扩展IIS应用程序池的空闲回收时间(不确定这个名称是否正确,但托管支持人员称之为该名称)。
这似乎解决了它,并且测试过夜我没有注销。还是有点难过。根据托管公司,应用程序池仍在回收,尽管时间间隔较长。
我现在认为显式机器密钥可能与它有关吗?但我已经使用过&#34; AutoGenerate,IsolateApps&#34;之前它已经工作正常。
我希望这有助于其他人。没有时间做完全测试并删除机器密钥以查看它是否仍然有效。一旦我可以设置一些明确的测试,我会报告回来。