jqueryを使用してasp.netmvcコントローラーアクションに対してajax呼び出しを行っています:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult GetWeek(string startDay)
{
var daysOfWeek = CompanyUtility.GetWeek(User.Company.Id, startDay);
return Json(daysOfWeek);
}
セッションがタイムアウトすると、Userオブジェクトがセッションに保存されるため、この呼び出しは失敗します。セッションが失われたかどうかを確認し、ログインページにリダイレクトするために、カスタムの承認属性を作成しました。これはページリクエストでは正常に機能しますが、ajaxリクエストからリダイレクトできないため、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;
}
}
別のスレッドで、ユーザーが認証されておらず、ajaxリクエストを行う場合は、ステータスコードを401(未承認)に設定してから、jsで確認し、ログインページにリダイレクトする必要があることを読みました。ただし、これを機能させることはできません。
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (Request.IsAjaxRequest() && (!Request.IsAuthenticated || User == null))
{
filterContext.RequestContext.HttpContext.Response.StatusCode = 401;
}
else
{
base.OnActionExecuting(filterContext);
}
}
基本的には401に設定されますが、その後コントローラーアクションに進み、オブジェクトエラーのインスタンスに設定されていないオブジェクト参照をスローします。これにより、エラー500がクライアント側のjsに返されます。カスタムのAuthorize属性を変更してajaxリクエストも検証し、認証されていないリクエストに対してfalseを返すと、ajaxリクエストはログインページを返しますが、これは明らかに機能しません。
これを機能させるにはどうすればよいですか?