我使用ASP.Net MVC 4创建了登录/注销功能。我使用自己创建的表单来针对Active Directory对用户进行身份验证。它的功能很好。
安全方面仍有一个大问题。用户单击注销链接后,他/她成功注销并重新定向到登录表单。控制器中的代码如下所示。
public ActionResult Logout()
{
// Tried to include below 3 lines in _Layout.cshtml as well. But not identifying.
Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
Response.Cache.SetNoStore();
Session.Abandon();
return RedirectToAction("Login");
}
但是,点击浏览器后退按钮后,用户可以返回其他页面并浏览页面。
我通过几种解决方案,不同的方法,但没有成功。似乎MVC方法与ASP.NET表单有很大不同。感谢你的帮助。
(我希望使用C#/ MVC方式解决这个问题。在注销时不使用JavaScript来禁用/关闭浏览器。)
更新:代码片段
[HttpPost]
public ActionResult Login(LoginModel authUser)
{
// Call Helper to get LDAP info. Will return username with groups or null
UserModel userProfile = LdapLoginHelper.AuthenticateUser(authUser);
if (userProfile != null)
{
Session["UserName"] = userProfile.UserName;
Session["LdapGroups"] = userProfile.LdapGroups;
if (userProfile.LdapGroups.Contains("Administrators"))
{
// To be implemented
}
else
{
// To be implemented
}
// Successful login. Redirect to main page
return RedirectToAction("Home", "Home");
}
else
{
// Invalid Login. Redirect to Login page
return RedirectToAction("Login");
}
}
public ActionResult Logout()
{
// Not worked
Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
Response.Cache.SetNoStore();
Session.Abandon();
/// Tried this too. Not worked.
/// Session.Clear();
/// FormsAuthentication.SignOut();
//// Tried this also. Not worked.
//// WebSecurity.Logout();
return RedirectToAction("Login");
}
除了这个常见的_Layout.cshtml页面标题如下所示。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="-1">
<meta http-equiv="CACHE-CONTROL" content="NO-CACHE">
.
.
.
答案 0 :(得分:1)
在global.asax页面中添加以下代码,并从logout()函数中删除前3行。
protected void Application_BeginRequest()
{
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
Response.Cache.SetNoStore();
}
答案 1 :(得分:0)
我只使用了DateTime.Now的SetExpires,它将本地服务器时间与cookie匹配。使用DateTime.UtcNow.Addminutes(-1)可能是真正的罪魁祸首。
此外,如果您使用的是表单身份验证,我看不到您对
的调用FormsAuthentication.SignOut();
答案 2 :(得分:0)
将以下属性添加到控制器中返回安全页面的任何ActionResult
方法应该有效:
public class MyControllerForAuthorizedStuff
{
[OutputCache(NoStore = true, Duration = 0, Location = OutputCacheLocation.None)]
public ActionResult Index()
{
return View();
}
}