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

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

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

+53
29 окт. '10 в 10:18
источник поделиться
6 ответов

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 там, где это необходимо, в одном запросе страницы.

+86
10 апр. '13 в 14:21
источник

Связанные вопросы


Похожие вопросы

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

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

+10
26 мая '11 в 19:12
источник

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

FormsAuthentication.SignOut();
Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddYears(-1);
+6
29 окт. '10 в 11:51
источник

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

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

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

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

+2
06 дек. '16 в 9:30
источник

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

if (!this.IsPostBack)
{
    if (HttpContext.Current.User.Identity.IsAuthenticated)
    {
        FormsAuthentication.SignOut();
        Response.Redirect(Request.RawUrl);
    }
}
+1
16 мая '11 в 8:51
источник

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());
    }
0
26 мая '11 в 19:06
источник

Посмотрите другие вопросы по меткам или Задайте вопрос