使用 MVC4 asp.net 随机注销

Posted

技术标签:

【中文标题】使用 MVC4 asp.net 随机注销【英文标题】:Random logouts with MVC4 asp.net 【发布时间】:2012-09-26 15:16:33 【问题描述】:

这将是我在这里的第一个问题!

我的 mvc4 应用程序和随机发生的注销存在问题。

我使用会话来存储我的公司 ID 和用户 ID。

        private void SetSessionData(string UserName)
    
        Employee data = (from employee in _db.Employees where employee.Email == UserName select employee).First();
        Session.Add("Comp_ID", data.Comp_ID);
        Session.Add("Company", data.Company.Name);
        Session.Add("User_ID", data.ID);
    

我已将会话的超时值设置为 600(10 小时),这甚至设置了 2 个位置以确保:

        [AllowAnonymous]
    public ActionResult Login(LoginModel model, string returnUrl)
    
        if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
        
            //FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); //sørger for at remember me virker!

            SetSessionData(model.UserName);
            Session.Timeout = 600;

            if (model.RememberMe)
            
                Response.Cookies.Add(new HttpCookie("CookieUserName", model.UserName)  Expires = DateTime.Now.AddDays(30), Value = model.UserName );
                Response.Cookies.Add(new HttpCookie("CookieRememberMe", model.RememberMe.ToString())  Expires = DateTime.Now.AddDays(30), Value = model.RememberMe.ToString() );//sætter den nye cookie
            
            else
            
                Response.Cookies.Set(new HttpCookie("CookieUserName")  Expires = DateTime.Now.AddDays(-1) );
                Response.Cookies.Set(new HttpCookie("CookieRememberMe")  Expires = DateTime.Now.AddDays(-1) );
            

            if (string.IsNullOrEmpty(returnUrl))
            
                return RedirectToLocal(returnUrl);
            
            return RedirectToAction("Index", "Home");
        

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "Vi har enten ikke brugernavnet eller koden i kartoteket.");
        return View(model);
    

在 web.config 中:

<system.web>
<machineKey validationKey="MyKeyGoesHere" validation="SHA1" decryption="AES" />
<sessionState timeout="600" />
<compilation debug="true" targetFramework="4.5">
  <assemblies>
    <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </assemblies>
</compilation>
<httpRuntime targetFramework="4.5" />
<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="600" />
</authentication>

我的 cookie 似乎保存了 10 个小时,而我的 session_id cookie 过期时间似乎设置为“浏览器关闭时”。

服务器端我已将应用程序池设置为在凌晨 1 点回收。

即使设置了所有这些,我的用户仍然会在登录后 2 分钟到登录后 1 小时之间从所有内容中随机注销。

为了解决我遇到的一些随机半登录状态问题,我加入了这个:

@if(Session == null || Session["User_ID"] == null || !WebSecurity.Initialized)
                //Makes sure the session data is cleared and user logged out if session dies.
                try
                
                    if(Session != null) Session.Clear();

                    if (WebSecurity.Initialized)WebSecurity.Logout();

                    FormsAuthentication.SignOut();

                    //dette er til at stoppe cache.
                    Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
                    Response.Cache.SetCacheability(HttpCacheability.NoCache);
                    Response.Cache.SetNoStore();

                catch <p>Error Clearing Login Cache</p>    
            

我现在很迷茫,希望那里的大师可能知道我在这里犯了什么初学者的错误!

提前感谢所有回复!

编辑:

我也试过这个:http://www.windowsitpro.com/article/security-development/create-persistent-id-cookies

(原链接来自:ASP.NET MVC FormsAuthentication Cookie timeout cannot be increased)

但这只是让我的应用程序在我每次登录后按任何按钮时都会注销。

该应用程序在带有 IIS8 的 Windows 2012 服务器上运行。

更多补充:

我发现 session_id cookie 在浏览器中关闭时仍然设置为:

cloud.hviidnet.com/image/2X3v2y2e1K1S

奇怪的是它设置为 600 分钟,即使我查看 IIS 服务器:

cloud.hviidnet.com/image/1e3J1g2u3p2M

【问题讨论】:

我之前也遇到过类似的问题;我检查了我的配置文件,我的 machineKey validationKey 元素有一个 decryptionKey 属性,而你的却没有。您可能想要删除整个元素,因为如果您是自托管的,则可能不需要它。看到这个链接blog.scribz.net/2011/03/… @wal - 感谢您的回复。我添加的 machineKey 部分是因为它在 *** 上解决了类似的问题。你说得对,我似乎没有解密密钥。我已经产生了一个新的,看起来像这样:我会后回来,如果它与解密标签的工作原理启用跨度> 【参考方案1】:

解决方案是删除所有“会话”的使用。并使用 WebSecurity.CurrentUserID 从数据库中获取所有数据。

希望这对其他人有帮助!

【讨论】:

还记得在所有控制器上使用 [InitializeSimpleMembership]...烦人的错误。【参考方案2】:

您只有一个网络服务器吗?如果您有多个服务器负载平衡,会话可能会丢失,因为用户在帖子之间被路由到不同的服务器,这可以解释为什么它会随机发生。

【讨论】:

好主意,但它只是一个包含多个站点的服务器。

以上是关于使用 MVC4 asp.net 随机注销的主要内容,如果未能解决你的问题,请参考以下文章

会话 ID 不够随机 - ASP.NET

ASP.NET MVC 4 表单无法注销

ASP.NET MVC 4 默认 _LoginPartial 模板注销不起作用

ASP.NET MVC4 部分视图

ASP.NET MVC4 部分视图

Asp.Net MVC4入门指南: 入门介绍