Очистить значение Request.IsAuthenticated после SignOut() без RedirectToAction().
-
06-09-2019 - |
Вопрос
Я пишу контроллер управления учетными записями и должен обрабатывать удаление собственной учетной записи пользователя отдельно:
[Authorize]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Delete(string userName, string confirmButton)
{
MembershipService.DeleteUser(userName);
if (User.Identity.Name.Equals(userName,
StringComparison.InvariantCultureIgnoreCase))
{
FormsAuth.SignOut();
return View("DeleteSelf");
}
else
return RedirectToAction("Index");
}
Но частичное представление LogOnUserControl.ascx по-прежнему показывает только что вышедшее из системы имя пользователя при отображении представления DeleteSelf, поскольку значения Request.IsAuthenticated и Page.User.Identity по-прежнему устанавливаются после FormsAuth.SignOut().
Добавление нового действия ShowDeleteSelfMessage могло бы решить проблему, но мне не нравится это решение:
...
{
FormsAuth.SignOut();
return RedirectToAction("ShowDeleteSelfMessage");
}
...
public ActionResult ShowDeleteSelfMessage()
{
return View("DeleteSelf");
}
Есть еще идеи?Спасибо!
Решение
Измените файл LogOnUserControl.ascx для работы с ViewData["UserDeleted"]:
[Authorize]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Delete(string userName, string confirmButton)
{
MembershipService.DeleteUser(userName);
if (User.Identity.Name.Equals(userName,
StringComparison.InvariantCultureIgnoreCase))
{
FormsAuth.SignOut();
// ***
ViewData["UserDeleted"] = true;
// ***
return View("DeleteSelf");
}
else
return RedirectToAction("Index");
}
ЛогОнУсерКонтроль.ascx:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<% if (Request.IsAuthenticated && !(ViewData["UserDeleted"] ?? false)) { %>
Welcome <b><%= Html.Encode(Page.User.Identity.Name) %></b>!
[ <%= Html.ActionLink("Log Off", "LogOff", "Account") %> ]
<% } else { %>
[ <%= Html.ActionLink("Log On", "LogOn", "Account") %> ]
<% } %>
Другие советы
В Delete
действие, вместо return View("DeleteSelf")
, попробуй это return Redirect("DeleteSelf")
Я изучил исходный код стандартного файла AccountController.cs и нашел два метода.
public ActionResult ChangePasswordSuccess()
{
return View("ChangePasswordSuccess");
}
и
public ActionResult RestorePasswordSuccess()
{
return View("RestorePasswordSuccess");
}
которые показывают только соответствующие представления.Так что мой
public ActionResult ShowDeleteSelfMessage()
{
return View("DeleteSelf");
}
метод будет хорошо смотреться в такой компании.Хотя я должен изменить имя для последовательности.