Je suis en train de faire un appel ajax à l'aide de jquery pour un asp.net mvc action de contrôleur:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult GetWeek(string startDay)
{
var daysOfWeek = CompanyUtility.GetWeek(User.Company.Id, startDay);
return Json(daysOfWeek);
}
Lors de la session d', cet appel échoue, l'objet Utilisateur est stocké dans la session. J'ai créé un custom autoriser attribut afin de vérifier si la session a été perdu et les rediriger vers la page de connexion. Cela fonctionne très bien pour les demandes de page, cependant, il ne fonctionne pas pour les requêtes ajax, que vous ne pouvez pas rediriger une requête ajax:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AuthorizeUserAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (!httpContext.Request.IsAjaxRequest())
{//validate http request.
if (!httpContext.Request.IsAuthenticated
|| httpContext.Session["User"] == null)
{
FormsAuthentication.SignOut();
httpContext.Response.Redirect("~/?returnurl=" + httpContext.Request.Url.ToString());
return false;
}
}
return true;
}
}
J'ai lu sur un autre thread que lorsque l'utilisateur n'est pas authentifié et vous faire une requête ajax, vous devez définir le code d'état à 401 (non autorisé) et vérifier alors qu'en js et les rediriger vers la page de connexion. Cependant, je ne peux pas le faire fonctionner:
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (Request.IsAjaxRequest() && (!Request.IsAuthenticated || User == null))
{
filterContext.RequestContext.HttpContext.Response.StatusCode = 401;
}
else
{
base.OnActionExecuting(filterContext);
}
}
En gros, c'vais le mettre à 401, mais alors il va continuer dans le contrôleur de l'action et de jeter un objet ref n'est pas définie à une instance d'un objet d'erreur, puis renvoie une erreur 500 du côté client js. Si je change mon custom Autoriser attribut pour valider les requêtes ajax ainsi et renvoie la valeur false pour ceux qui ne sont pas authentifiés, qui fait la requête ajax retour de ma page de connexion, ce qui évidemment ne fonctionne pas.
Comment puis-je le faire fonctionner?