2017-01-12 4 views
0

Снова обрушив голову на кирпичную стену. Я пытаюсь заставить веб-приложение ASP.NET Web Forms выйти из системы, но он отказывается это делать. Я использую проверку подлинности с помощью форм. Проблема заключается в том, что браузер (ВСЕ из тех, что я пробовал) поддерживает кеш страниц после входа в систему, но не очищает этот кеш при выходе из системы.asp.net not logging user out

Когда я нажимаю ссылку на выход на главной странице, она успешно переносит меня на страницу входа в систему, но я могу просто набрать URL-адрес страницы или вернуться в браузер, и она снова загружает страницу без необходимости входа в систему .

Я потратил последние пару часов на поиск StackOverflow и в других местах для решения, но до сих пор ничего не сработало.

Мой корень web.config имеет это:

<authentication mode ="Forms"> 
    <forms loginUrl="~/Account/Login" name=".ASPXFORMSAUTH" defaultUrl="~/Default.aspx"></forms> 
</authentication> 
<authorization> 
    <deny users="?"/> 
</authorization> 
<compilation debug="true" targetFramework="4.5"/> 
<httpRuntime targetFramework="4.5"/> 

Это web.config в моей папке учетной записи.

<configuration> 
    <location path="Manage.aspx"> 
    <system.web> 
     <authorization> 
     <allow users="*"/> 
     </authorization> 
    </system.web> 
    </location> 
</configuration> 

Это мой код для выхода из системы. Как вы можете видеть, я внедрил все Я нашел онлайн. Это находится в файле cs моей главной страницы.

public void Logout_Click(object sender, EventArgs e) 
    { 
     ClearSession(); 

     // Clear authentication cookie 
     HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, ""); 
     cookie.HttpOnly = true; 
     cookie.Expires = DateTime.Now.AddYears(-1); 
     Response.Cookies.Add(cookie); 

     // Clear session cookie 
     SessionStateSection sessionStateSection = (SessionStateSection)WebConfigurationManager.GetSection("system.web/sessionState"); 
     HttpCookie cookie2 = new HttpCookie(sessionStateSection.CookieName, ""); 
     cookie2.Expires = DateTime.Now.AddYears(-1); 
     Response.Cookies.Add(cookie2); 

     FormsAuthentication.RedirectToLoginPage(); 
    } 

    protected void ClearSession() 
    { 
     FormsAuthentication.SignOut(); 
     Session.Clear(); 
     Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     Response.ExpiresAbsolute = DateTime.UtcNow.AddDays(-1d); 
     Response.Expires = -1500; 
     Response.CacheControl = "no-Cache"; 
    } 

В моей Page_Init (опять же, главная страница CS-файл), у меня есть это:

 protected void Page_Init(object sender, EventArgs e) 
    { 
     HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate"); 
     HttpContext.Current.Response.AddHeader("Pragma", "no-cache"); 
     HttpContext.Current.Response.AddHeader("Expires", "0"); 

     // The code below helps to protect against XSRF attacks 
     var requestCookie = Request.Cookies[AntiXsrfTokenKey]; 
     Guid requestCookieGuidValue; 
     if (requestCookie != null && Guid.TryParse(requestCookie.Value, out requestCookieGuidValue)) 
     { 
      // Use the Anti-XSRF token from the cookie 
      _antiXsrfTokenValue = requestCookie.Value; 
      Page.ViewStateUserKey = _antiXsrfTokenValue; 
     } 
     else 
     { 
      // Generate a new Anti-XSRF token and save to the cookie 
      _antiXsrfTokenValue = Guid.NewGuid().ToString("N"); 
      Page.ViewStateUserKey = _antiXsrfTokenValue; 

      var responseCookie = new HttpCookie(AntiXsrfTokenKey) 
      { 
       HttpOnly = true, 
       Value = _antiXsrfTokenValue 
      }; 
      if (FormsAuthentication.RequireSSL && Request.IsSecureConnection) 
      { 
       responseCookie.Secure = true; 
      } 
      Response.Cookies.Set(responseCookie); 
     } 

     Page.PreLoad += master_Page_PreLoad; 
    } 

И, наконец, в моем заголовке мастер-страницы, у меня есть эти мета-теги.

<meta http-equiv="cache-control" content="no-cache" /> 
<meta http-equiv="Expires" content="0" /> 
<meta http-equiv="cache-control" content="no-store" /> 
<meta http-equiv="cache-control" content="must-revalidate" /> 
<meta http-equiv="cache-control" content="proxy-revalidate" /> 

ответ

0

Как это обычно бывает, я выясняю проблему после того, как делать больше некоторый поиск и нажав лампочку момент - сразу после того, как с просьбой о помощи.

В случае, если у кого-то возникли проблемы, вот решение, которое сработало для меня.

Хотя он настроен на использование проверки подлинности форм, когда я посмотрел на страницу входа в систему по умолчанию для ASP.NET и загрузки страницы CS, я понял, он использует пространство имен Identity.Owin для входа в систему.

Таким образом, в мой выход из системы, я заменил первый блок кода выше:

public void Logout_Click(object sender, EventArgs e) 
    { 
     ClearSession(); 

     FormsAuthentication.RedirectToLoginPage(); 
    } 

    protected void ClearSession() 
    { 
     Context.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie); 
     Session.Abandon(); 
    }