Сбой FormsAuthentication.SignOut при установке кода состояния ответа - PullRequest
2 голосов
/ 05 октября 2011

В действии контроллера ASP.NET MVC3 я хочу выйти из системы и вернуть код состояния 401. Код прост:

public ActionResult Index()
{
 FormsAuthentication.SignOut();
 HttpContext.Response.StatusCode = 401; 
 return null;
}

Пользователь не вышел из системы, когда я установил код состояния. Зачем? Если я удаляю строку кода состояния, пользователь выходит из системы, но я не хочу возвращать статус 200.

Что здесь происходит? Как я могу достичь желаемого поведения?

Вот как я решил проблему:

if (Request.IsAjaxRequest())
{
  FormsAuthentication.SignOut();
  Response.StatusCode = 401;
  Response.Flush();
  return null;
}
else
{
  FormsAuthentication.SignOut();
  return new HttpUnauthorizedResult();
}

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Когда вы установили код состояния 401 (Неавторизованный), браузер не продолжил сохранять файлы cookie, которые вы ранее установили с помощью вызова SignOut ().

Чтобы полностью подписать SignOut, вы должны понимать, что вам нужно оставить браузеру время, чтобы записать файлы cookie (фактически удалить файлы cookie с помощью SignOut).

Возможно, идея состоит в том, чтобы сделать перенаправление на новую страницу, и на этой новой странице вернуть код состояния 401. На самом деле вы можете использовать среднюю страницу, которая выполняет SignOut и, возможно, другие действия SignOut, а затем перенаправить на Последняя страница с сообщениями.

Вы также можете попытаться вызвать Response.Flush(); перед StatusCode, чтобы заставить браузер записывать файлы cookie SignOut ().

1 голос
/ 05 октября 2011
public ActionResult Index()
{
   FormsAuthentication.SignOut(); 
   return new HttpUnauthorizedResult();
}
...