Estoy intentando redirigir al usuario a una acción diferente si su dirección de correo electrónico no se ha validado. La cuestión es que no quiero que se desconecten, solo quiero redirigirlos. Cuando hago esto en OnAuthorization para el controlador, redirige como se esperaba, pero el usuario no está autenticado. No estoy seguro de por qué es esto. Mi código se ve así:La redirección de MVC en OnAuthorization provoca que la autorización falle
protected override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
//_applicationService.CurrentUser is populated correctly at this point
// from Controller.User
if (_applicationService.CurrentUser != null)
{
if (_applicationService.CurrentUser.EmailVerified != true)
{
var url = new UrlHelper(filterContext.RequestContext);
var verifyEmailUrl = url.Action("EmailVerificationRequired", "Account", null);
filterContext.Result = new RedirectResult(verifyEmailUrl);
}
}
}
Nota: He eliminado el código innecesario para hacerlo más claro. _applicationService.CurrentUser se completa con el usuario actual, y el usuario se autenticó correctamente cuando llega a ese punto. Pero después de la redirección, el usuario ya no está autenticado.
¿Cómo puedo lograr esta redirección sin afectar la autorización de usuario incorporada?
He intentado poner mi código en OnActionExecuting, y también he intentado implementarlo en un ActionFilterAttribute personalizado, pero donde sea que ponga este redireccionamiento en él impide que el 'Usuario' (es decir: System.Security.Principal .IPrincipal Controller.User) no se autenticará.
¿Qué me falta aquí? Espero que esto tenga sentido. Cualquier ayuda muy apreciada.
En respuesta a la solicitud de Darin para mi acción de acceso:
[HttpPost]
[AllowAnonymous]
public ActionResult Login(LoginViewModel model, string returnUrl)
{
string errorMessage = "The username or password is incorrect";
if (ModelState.IsValid)
{
if (_contextExecutor.ExecuteContextForModel<LoginContextModel, bool>(new LoginContextModel(){
LoginViewModel = model
}))
{
ViewBag.CurrentUser = _applicationService.CurrentUser;
_formsAuthenticationService.SetAuthCookie(model.LoginEmailAddress, model.RememberMe);
if (_applicationService.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
return RedirectToAction("Index", "Home").Success("Thank you for logging in.");
}
else
{
errorMessage = "Email address not found or invalid password.";
}
}
return View(model).Error(errorMessage);
}
¿Podría mostrar cómo está autenticando al usuario, su acción 'LogOn'? –
@DarinDimitrov - He agregado mi acción de inicio de sesión según lo solicitado. – soupy1976
¡Esto es justo lo que he estado buscando! Ahorro mucho tiempo – JosephDoggie