MVC 5认证用户正在注销,没有"记得我" (ExpireTimeSpan / MachineKey / Session Timeout)

时间:2016-10-03 16:46:00

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

前言:我已经读过这个(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能够存活并且应用程序可以回收吗?我现在已经放了一个明确的机器密钥,看看它是怎么回事。关于问题的原因以及如何解决它仍然有点难过......

1 个答案:

答案 0 :(得分:3)

所以出于某种原因(仍然不确定是什么)我的摆弄似乎有效。

我最终必须生成一个显式的机器密钥,而不是使用

validationKey="AutoGenerate,IsolateApps" 
decryptionKey="AutoGenerate,IsolateApps"

我还要求我的托管公司扩展IIS应用程序池的空闲回收时间(不确定这个名称是否正确,但托管支持人员称之为该名称)。

这似乎解决了它,并且测试过夜我没有注销。还是有点难过。根据托管公司,应用程序池仍在回收,尽管时间间隔较长。

我现在认为显式机器密钥可能与它有关吗?但我已经使用过&#34; AutoGenerate,IsolateApps&#34;之前它已经工作正常。

我希望这有助于其他人。没有时间做完全测试并删除机器密钥以查看它是否仍然有效。一旦我可以设置一些明确的测试,我会报告回来。