español - ASP.net MVC 4 filtro de Autorización global forzando el inicio de sesión en una acción Permitir Anónimo
asp.net mvc versions (3)
En mi .NET MVC 4 estoy agregando un filtro global para asegurar mis controladores. Esto se hace usando:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new System.Web.Mvc.AuthorizeAttribute());
}
Que se invoca desde mi clase Global.cs.
Mi archivo Web.config contiene una configuración estándar:
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
La acción Mi inicio de sesión está decorada con [AllowAnonymous]
para permitir que los usuarios anónimos puedan iniciar sesión.
Hasta ahora todo bien, todo funciona muy bien. Aquí está mi acción de inicio de sesión:
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
Ahora, quería agregar una página de restablecimiento de contraseña que, al igual que la página de inicio de sesión, debería estar disponible para usuarios anónimos. Yo creé la acción (bajo el mismo controlador de la acción Iniciar sesión) y la [AllowAnonymous]
con la decoración [AllowAnonymous]
:
[AllowAnonymous]
public ActionResult ResetPasswordForUser(string message = "")
{
ViewBag.message = message;
return View();
}
Luego creó la vista correspondiente.
He añadido este enlace a mi página de inicio de sesión:
@Html.ActionLink("Forgot your password?", "ResetPasswordForUser", "Account")
En tiempo de ejecución, al hacer clic en este enlace con un usuario anónimo, accedo a la acción ResetPasswordForUser, pero al devolver la vista, se invoca la acción de inicio de sesión y nunca puedo acceder a la vista deseada. Por alguna razón, mi solicitud es interceptada aunque estoy usando la decoración [AllowAnonymous].
¿Me estoy perdiendo de algo?
Gracias por adelantado
Actualización 1:
Según la solicitud de Darin Dimitrov que agrega mi vista de ResetPasswordForUser:
@using TBS.Models
@model TBS.ViewModels.ResetPasswordForUserViewModel
@{
ViewBag.Title = "Reset Password";
}
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<table class="edit-table rounded bordered" style="width: 400px">
<tr>
<td class="label-td">
@Html.LabelFor(m => m.Username)
</td>
<td>
@Html.TextBoxFor(m => m.Username)
@Html.ValidationMessageFor(model => model.Username)
</td>
</tr>
<tr>
<td class="label-td">
@Html.LabelFor(m => m.Password)
</td>
<td>
@Html.Password("Password")
@Html.ValidationMessageFor(model => model.Password)
</td>
</tr>
<tr>
<td colspan="2" style="text-align: center">
<input type="submit" value="Reset" />
</td>
</tr>
</table>
}
¿Es posible que el archivo _Layout utilizado por la vista ResetPasswordForUser
esté invocando una Acción en su Controlador (por ejemplo, en un menú) que no haya sido decorado con AllowAnonymous
?
Esto causaría este tipo de comportamiento.
No sé si agregar ese filtro de autorización global entra en conflicto con AllowAnonymous. La forma en que configuro mi proyecto es tener un Controlador Base que tiene el atributo [Autorizar] establecido en el nivel del controlador.
Todos mis controladores heredan de este BaseController, excepto los que requieren acceso anónimo, generalmente mi AccountController y mi MarketingController. Esos simplemente heredan del Controlador y luego puedo establecer [Autorizar] en el nivel de Acción.
Parece que podría tener un @ Html.Action o Html.RenderAction no anónimo en su diseño, lo que está causando que su página redirija al inicio de sesión.
Edición: Se eliminó la respuesta anterior porque era incorrecta y no es útil para nadie que venga a verla.