2

J'ai donc une application Web MVC5 (elle est fournie avec le framework ASP.Identity) et j'ai cet attribut personnalisé Authorize.Comment retourner à l'URL précédente après la connexion? (ajax)

public class FrontEndAuthorize : AuthorizeAttribute 
{ 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     dynamic user = (ClaimsPrincipal)httpContext.User; 

     if (user.Identity.IsAuthenticated) { 
      return true; 
     } 

     return false; 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext context) 
    { 
     if (context.HttpContext.Request.IsAjaxRequest()) { 
      dynamic urlHelper = new UrlHelper(context.RequestContext); 
      context.HttpContext.Response.TrySkipIisCustomErrors = true; 
      context.HttpContext.Response.StatusCode = 403; 

      context.Result = new JsonResult { 
       Data = new { 
        Error = "NotAuthorized", 
        LogOnUrl = urlHelper.Action("LogIn", "Account") 
       }, 
       JsonRequestBehavior = JsonRequestBehavior.AllowGet 
      }; 
     } else { 
      base.HandleUnauthorizedRequest(context); 
     } 
    } 
} 

Et j'ai un problème avec la méthode ajax. Par exemple si j'ai la page articles warheat1990.com/articles/batman-arkham-knight-review avec un bouton pour soumettre un commentaire.

[HttpPost] 
[FrontEndAuthorize] 
public ActionResult SubmitComment(string comment) 
{ 
    //code here 
    return Content("success"); 
} 

et moi avons un script pour appeler la méthode lorsque l'utilisateur cliquez sur le bouton Soumettre Commentaire.

$.ajax({ 
    url: '/Articles/SubmitComment/' 
    type: 'POST' 
    //rest of code here 
}) 

Lorsque l'utilisateur cliquez sur le bouton Soumettre un commentaire sans connecter, l'utilisateur sera redirigé vers la page de connexion, mais le succès de LOGIN, l'utilisateur est repris à la page d'accueil alias warheat1990.com au lieu de warheat1990.com/articles/batman-arkham-knight-review.

Ceci est dû à la méthode SubmitComment appelée par ajax. Donc, ma question est que dois-je faire pour être en mesure de rediriger l'utilisateur à la page précédente sur l'appel ajax?

Répondre

3

L'idée de base est que votre méthode HandleUnauthorizedRequest doit fournir un paramètre "return to" à la page/au contrôleur gérant la connexion. Au lieu d'envoyer votre utilisateur juste la page de connexion:

LogOnUrl = urlHelper.Action("LogIn", "Account") 

Vous fournirez une requête returnUrl supplémentaire param:

// for your ajax 
LogOnUrl = urlHelper.Action("LogIn", "Account", new { returnUrl = context.HttpContext.Request.RawUrl }) 

// for your non-ajax: 
context.Result = new RedirectToRouteResult(
       new System.Web.Routing.RouteValueDictionary 
        {      
          { "controller", "Account" }, 
          { "action", "Login" }, 
          { "returnUrl", context.HttpContext.Request.RawUrl } 
        }); 

L'utilisateur débarquerait sur une page comme:

warheat1990.com/login?returnUrl=warheat1990.com%2Farticles%2Fbatman-arkham-knight-review 

Si la connexion réussit, vous devez analyser la requête pour la valeur de paramètre returnUrl de la requête (si elle existe) et rediriger l'utilisateur vers cet emplacement.

1

Vous pouvez obtenir l'URL de l'appelant comme ci-dessous

if (context.HttpContext.Request.IsAjaxRequest()) 
      { 
       UrlHelper urlHelper = new UrlHelper(context.RequestContext); 
       context.HttpContext.Response.TrySkipIisCustomErrors = true; 
       context.HttpContext.Response.StatusCode = 403; 

       /* Get return url */ 
       var returnUrl = context.RequestContext.HttpContext.Request.Url.PathAndQuery; 
       context.Result = new JsonResult 
        { 
         Data = new 
          { 
           Error = "NotAuthorized", 
           LogOnUrl = urlHelper.Action("LogIn", "Account", new {returnUrl}) 
          }, 
         JsonRequestBehavior = JsonRequestBehavior.AllowGet 
        }; 
      } 
      else 
      { 
       base.HandleUnauthorizedRequest(context); 
      } 

et contrôleur de compte et action index redirigent vers cette url

[HttpPost] 
     [AllowAnonymous] 
     [ValidateAntiForgeryToken] 
     public ActionResult Login(LoginModel model, string returnUrl) 
     { 
      /* Together with some other code */ 
      return RedirectToLocal(returnUrl); 

     } 
0

vous pouvez obtenir la demande précédente par Request.UrlReferrer ou Request.ServerVariables ["http_referer"].

Ensuite, une fois que vous avez terminé le processus de connexion, vous pouvez rediriger vers cette adresse