使用 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 随机注销的主要内容,如果未能解决你的问题,请参考以下文章