Limpar Request.IsAuthenticated valor após SignOut () sem RedirectToAction ()
-
06-09-2019 - |
Pergunta
Eu estou escrevendo um controlador de gestão de contas e tem que apagar processo de conta própria do usuário separadamente:
[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");
}
Mas a visão parcial LogOnUserControl.ascx ainda mostra apenas desconectado nome de usuário durante a exibição de vista DeleteSelf porque os valores Request.IsAuthenticated e Page.User.Identity ainda estão definido após FormsAuth.SignOut ().
Adicionar um novo ShowDeleteSelfMessage ação poderia resolver o problema, mas eu não gosto dessa solução:
...
{
FormsAuth.SignOut();
return RedirectToAction("ShowDeleteSelfMessage");
}
...
public ActionResult ShowDeleteSelfMessage()
{
return View("DeleteSelf");
}
Quaisquer outras ideias? Obrigado!
Solução
Mude o seu LogOnUserControl.ascx para lidar com 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") %> ]
<% } %>
Outras dicas
Na ação Delete
, em vez de return View("DeleteSelf")
, tente este return Redirect("DeleteSelf")
Eu examinei o código fonte do arquivo AccountController.cs padrão e encontrou dois métodos
public ActionResult ChangePasswordSuccess()
{
return View("ChangePasswordSuccess");
}
e
public ActionResult RestorePasswordSuccess()
{
return View("RestorePasswordSuccess");
}
que só mostram vistas correspondentes. Assim, a minha
public ActionResult ShowDeleteSelfMessage()
{
return View("DeleteSelf");
}
método vai ficar bem em tal companhia. Embora eu deveria mudar o nome para a consistência.