claro valor Request.IsAuthenticated después SignOut () sin RedirectToAction ()
-
06-09-2019 - |
Pregunta
Estoy escribiendo un controlador de gestión de cuentas y tengo que procesar borrado de la cuenta propia del usuario por separado:
[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");
}
Pero vista parcial LogOnUserControl.ascx sigue mostrando simplemente registra el nombre del usuario al tiempo que muestra la vista DeleteSelf porque los valores Request.IsAuthenticated y Page.User.Identity todavía se fijan después FormsAuth.SignOut ().
La adición de un nuevo ShowDeleteSelfMessage acción podría resolver el problema, pero no me gusta esta solución:
...
{
FormsAuth.SignOut();
return RedirectToAction("ShowDeleteSelfMessage");
}
...
public ActionResult ShowDeleteSelfMessage()
{
return View("DeleteSelf");
}
¿Alguna otra idea? Gracias!
Solución
Cambiar su LogOnUserControl.ascx para hacer frente a 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") %> ]
<% } %>
Otros consejos
En la acción Delete
, en lugar de return View("DeleteSelf")
, probar este return Redirect("DeleteSelf")
He examinado el código fuente del archivo AccountController.cs estándar y encontrado dos métodos
public ActionResult ChangePasswordSuccess()
{
return View("ChangePasswordSuccess");
}
y
public ActionResult RestorePasswordSuccess()
{
return View("RestorePasswordSuccess");
}
que sólo muestran vistas correspondientes. Así que mi
public ActionResult ShowDeleteSelfMessage()
{
return View("DeleteSelf");
}
método se verá bien en dicha compañía. Aunque me sea necesario cambiar el nombre de la coherencia.