Autorizza attributo e jquery AJAX in asp.net MVC

Ho usato la funzione jjery ajax per inviare un modulo. Gli utenti devono essere registrati altrimenti devono redirect a una pagina di accesso. Ho utilizzato l’attributo Authorize () per questo.

[Authorize] public ActionResult Creat() { .... } 

Se l’utente non effettua il login, la pagina di login per il ritorno dell’azione alle funzioni ajax di jquery viene visualizzata sulla stessa pagina, ma desidero redirect l’utente alla pagina di accesso. C’è qualche soluzione?

Esempio di lavoro: https://github.com/ronnieoverby/mvc-ajax-auth

Parti importanti:

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; } }); }); 

Usa l’attributo in un controller:

  [AjaxAuthorize] public ActionResult Secret() { return PartialView(); } 

Fai un po ‘di ajax:

 @Ajax.ActionLink("Get Secret", "Secret", new AjaxOptions { UpdateTargetId = "secretArea", }) 

Una semplice aggiunta alla risposta di # Ronnie

se si desidera mantenere l’URL della pagina sul reindirizzamento.

  var pathname = window.location.pathname; if (xhr.status == 403) { var response = $.parseJSON(xhr.responseText); window.location = response.LogOnUrl + '?ReturnUrl=' + pathname; } 

Ajax è usato per aggiornare parzialmente il contenuto di una pagina, quindi sarebbe meglio che tu gestisca questo reindirizzamento sul lato client, nel tuo codice di richiamo javascript / jquery. Potresti anche avere un’idea di questo post .

Come un’altra estensione alla risposta di Ronnie Overby.

La sua soluzione non funziona con webapi, ma va bene perché è ansible utilizzare normalmente l’attributo Authorize e quindi gestire lo stato 401 nella funzione ajaxError come segue.

  $(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 } });