1

我使用 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">
.
. 
.
4

3 回答 3

1

在您的 global.asax 页面中添加以下代码,并从您的 logout() 函数中删除前 3 行。

protected void Application_BeginRequest()
{
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
    Response.Cache.SetNoStore();
}
于 2014-03-15T07:08:26.303 回答
0

将以下属性添加到ActionResult在控制器中返回安全页面的任何方法都应该有效:

public class MyControllerForAuthorizedStuff
{
    [OutputCache(NoStore = true, Duration = 0, Location = OutputCacheLocation.None)]
    public ActionResult Index()
    {
        return View();
    }
} 
于 2014-04-08T15:04:18.003 回答
0

我只将 SetExpires 与 DateTime.Now 一起使用,这将使您的本地服务器时间与 cookie 相匹配。使用 DateTime.UtcNow.Addminutes(-1) 可能是真正的罪魁祸首。

另外,如果您使用的是表单身份验证,我看不到您致电

FormsAuthentication.SignOut();
于 2013-01-20T14:05:47.697 回答