Autorizar el atributo y jquery AJAX en asp.net MVC
asp.net-mvc authorize (4)
Ajax se usa para actualizar parcialmente el contenido de una página, por lo que es mejor que maneje esta redirección en su lado del cliente, en su código de javascript / jquery. También puede obtener una idea de esta post .
He utilizado la función jquery ajax para enviar un formulario. Los usuarios tienen que iniciar sesión, de lo contrario deben redirigir a una página de inicio de sesión. He utilizado el atributo Authorize () para ello.
[Authorize]
public ActionResult Creat()
{
....
}
Si el usuario no inicia sesión, la acción devuelve la página de inicio de sesión a las funciones ajax de jquery y se muestra en la misma página, pero quiero redirigir al usuario a la página de inicio de sesión. ¿Hay alguna solución?
Como otra extensión de la respuesta de Ronnie Overby.
Su solución no funciona con webapi, pero está bien porque en su lugar puede usar el atributo Autorizar normal y luego manejar el estado 401 en la función ajaxError de la siguiente manera.
$(document).ajaxError(function (e, xhr) {
//ajax error event handler that looks for either a 401 (regular authorized) or 403 (AjaxAuthorized custom actionfilter).
if (xhr.status == 403 ||xhr.status == 401) {
//code here
}
});
Ejemplo de trabajo: https://github.com/ronnieoverby/mvc-ajax-auth
Partes importantes:
AjaxAuthorizeAttribute:
using System.Web.Mvc;
namespace MvcApplication1
{
public class AjaxAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext context)
{
if (context.HttpContext.Request.IsAjaxRequest())
{
var urlHelper = new UrlHelper(context.RequestContext);
context.HttpContext.Response.StatusCode = 403;
context.Result = new JsonResult
{
Data = new
{
Error = "NotAuthorized",
LogOnUrl = urlHelper.Action("LogOn", "Account")
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
else
{
base.HandleUnauthorizedRequest(context);
}
}
}
}
Javascript:
$(function () {
$(document).ajaxError(function (e, xhr) {
if (xhr.status == 403) {
var response = $.parseJSON(xhr.responseText);
window.location = response.LogOnUrl;
}
});
});
Use el atributo en un controlador:
[AjaxAuthorize]
public ActionResult Secret()
{
return PartialView();
}
Haz algo de ajax:
@Ajax.ActionLink("Get Secret", "Secret", new AjaxOptions { UpdateTargetId = "secretArea", })
<div id="secretArea"></div>
Solo una útil adición a la respuesta de # Ronnie
si desea mantener la URL de la página al redirigir.
var pathname = window.location.pathname;
if (xhr.status == 403) {
var response = $.parseJSON(xhr.responseText);
window.location = response.LogOnUrl + ''?ReturnUrl='' + pathname;
}