Подтвердить что ты не робот

Page.User.Identity.IsAuthenticated все еще верно после FormsAuthentication.SignOut()

У меня есть страница, когда вы нажимаете "выйти из системы", она перенаправляется на страницу login.aspx, которая имеет метод Page_Load, который вызывает FormsAuthentication.SignOut().

На главной странице отображается ссылка "выйти из системы" в правом верхнем углу экрана, и она отображает ее при условии, что Page.User.Identity.IsAuthenticated - true. Однако, пройдя через код, этот метод вывешивания автоматически не устанавливает IsAuthenticated в false, что весьма раздражает, любые идеи?

4b9b3361

Ответ 1

Page.User.Identity.IsAuthenticated получает свое значение от Page.User (очевидно), которое, к сожалению, доступно только для чтения и не обновляется при вызове FormsAuthentication.SignOut().

К счастью, Page.User извлекает значение из Context.User, которое можно изменить:

// HttpContext.Current.User.Identity.IsAuthenticated == true;

FormsAuthentication.SignOut();
HttpContext.Current.User =
    new GenericPrincipal(new GenericIdentity(string.Empty), null);

// now HttpContext.Current.User.Identity.IsAuthenticated == false
// and Page.User.Identity.IsAuthenticated == false

Это полезно, когда вы выходите из текущего пользователя и хотите ответить на фактическую страницу без необходимости перенаправления. Вы можете проверить IsAuthenticated там, где это необходимо, в одном запросе страницы.

Ответ 2

Лицо проверяется только один раз за запрос. После того как ASP.NET определит, прошли ли они проверку подлинности или нет, это не изменится для остальной части этого запроса.

Например, когда кто-то входит в систему. Когда вы устанавливаете файлы cookie auth, указывающие, что они вошли в систему, если вы проверяете, проверены ли они на этом же запросе, он вернет false, но на следующем запросите, он вернет true. То же самое происходит, когда вы регистрируете кого-то. Они все еще аутентифицируются на протяжении всего этого запроса, но на следующем они больше не будут аутентифицироваться. Поэтому, если пользователь нажимает ссылку для выхода из системы, вы должны вывести их из системы, а затем переадресовать на страницу входа.

Ответ 3

Я помню, что у меня была аналогичная проблема, и я решил, что решил ее, истек файл cookie проверки подлинности форм во время выхода:

FormsAuthentication.SignOut();
Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddYears(-1);

Ответ 4

Почему вы выполняете код выхода в login.aspx?

Поместите этот код, например. logout.aspx:

FormsAuthentication.SignOut()
Session.Abandon()
FormsAuthentication.RedirectToLoginPage()
HttpContext.Current.ApplicationInstance.CompleteRequest()
return

IsAuthenticated будет false в login.aspx. Код входа и выхода из системы теперь разделен: Одиночная ответственность.

Ответ 5

В вашем методе login.aspx Page_Load:

if (!this.IsPostBack)
{
    if (HttpContext.Current.User.Identity.IsAuthenticated)
    {
        FormsAuthentication.SignOut();
        Response.Redirect(Request.RawUrl);
    }
}

Ответ 6

В одном из моих приложений, когда я вхожу в систему с учетными данными, переходя к различным формам в приложении, я скопировал один из URL моей навигационной формы, а затем вышел из приложения. во вкладке поиска я вставил URL, по которому браузер переходит к определенной форме в моем приложении без входа в систему. при проверке проверки подлинности формы, когда page.User.Identity.IsAuthenticated становится истинным даже при выходе из системы. Причины этого - очистка сессии при выходе из системы, которую я добавил

Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddYears(-1);

с этим я не получаю эту проблему снова и флаг page.User.Identity.IsAuthenticated становится ложным, когда мы переходим к различным формам в приложении без входа в систему.

Ответ 7

Update

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

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


Это работает для меня

public virtual ActionResult LogOff()
    {
        FormsAuthentication.SignOut();
        foreach (var cookie in Response.Cookies.AllKeys)
        {
            Response.Cookies.Remove(cookie);
        }
        return RedirectToAction(MVC.Home.Index());
    }