在没有RedirectToAction()的SignOut()之后清除Request.IsAuthenticated值

时间:2009-06-02 10:01:45

标签: asp.net-mvc authentication logout

我正在编写帐户管理控制器,必须单独处理删除自己用户的帐户:

[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视图时仍显示刚刚注销的用户名,因为在FormsAuth.SignOut()之后仍然设置了Request.IsAuthenticated和Page.User.Identity值。

添加新动作ShowDeleteSelfMessage可以解决问题,但我不喜欢这个解决方案:

    ...
    {
        FormsAuth.SignOut();

        return RedirectToAction("ShowDeleteSelfMessage");
    }
    ...

public ActionResult ShowDeleteSelfMessage()
{
    return View("DeleteSelf");
}

还有其他想法吗?谢谢!

3 个答案:

答案 0 :(得分:1)

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

LogOnUserControl.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") %> ]
<% } %>

答案 1 :(得分:0)

Delete操作中,而不是return View("DeleteSelf"),请尝试此return Redirect("DeleteSelf")

答案 2 :(得分:0)

我检查了标准AccountController.cs文件的源代码,发现了两个方法

public ActionResult ChangePasswordSuccess()
{
    return View("ChangePasswordSuccess");
}

public ActionResult RestorePasswordSuccess()
{
    return View("RestorePasswordSuccess");
}

仅显示相应的视图。所以我的

public ActionResult ShowDeleteSelfMessage()
{
    return View("DeleteSelf");
}

方法在这样的公司看起来不错。虽然我应该更改名称以保持一致性。