valeur claire Request.IsAuthenticated après SignOut () sans RedirectToAction ()
-
06-09-2019 - |
Question
Je suis en train d'écrire un contrôleur de gestion de compte et doivent traiter la suppression du compte propre utilisateur séparément:
[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");
}
Mais LogOnUserControl.ascx vue partielle montre encore juste déconnecté nom d'utilisateur tout en affichant vue DeleteSelf parce que les valeurs Request.IsAuthenticated et Page.User.Identity sont encore fixés après FormsAuth.SignOut ().
Ajout d'un nouveau ShowDeleteSelfMessage d'action pourrait résoudre le problème, mais je n'aime pas cette solution:
...
{
FormsAuth.SignOut();
return RedirectToAction("ShowDeleteSelfMessage");
}
...
public ActionResult ShowDeleteSelfMessage()
{
return View("DeleteSelf");
}
D'autres idées? Merci!
La solution
Changez votre LogOnUserControl.ascx pour traiter 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") %> ]
<% } %>
Autres conseils
En action Delete
, au lieu de return View("DeleteSelf")
, essayez cette return Redirect("DeleteSelf")
J'ai examiné le code source de fichier standard AccountController.cs et trouvé deux méthodes
public ActionResult ChangePasswordSuccess()
{
return View("ChangePasswordSuccess");
}
et
public ActionResult RestorePasswordSuccess()
{
return View("RestorePasswordSuccess");
}
qui ne montrent que des vues correspondant. Donc, mon
public ActionResult ShowDeleteSelfMessage()
{
return View("DeleteSelf");
}
méthode aura l'air bien dans une telle entreprise. Bien que je devrais changer le nom de la cohérence.