Очистить значение Request.IsAuthenticated после SignOut() без RedirectToAction().

StackOverflow https://stackoverflow.com/questions/938764

Вопрос

Я пишу контроллер управления учетными записями и должен обрабатывать удаление собственной учетной записи пользователя отдельно:

[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");
}

метод будет хорошо смотреться в такой компании.Хотя я должен изменить имя для последовательности.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top