は、あなたのAJAX呼び出しの結果はまだ可能性(心配しないで、けれども、それは実際にあなたのアクションメソッドが実行されません)成功登場することになりますと、 success
ハンドラを呼び出します。これは、あなたがHTMLを期待しているからです。それはあなたが受け取っているものです(しかし、結果として得られるHTMLはあなたが望むHTMLではなくあなたのログインページです)。さて、もしあなたがJSON(dataType:'JSON'
を使って)を期待するならば、それはJSONとしてHTMLを解析するので、エラーを引き起こすでしょう。
FormsAuthがAJAXリクエストのログインページをリダイレクトしないようにするだけです。現在、AuthorizeAttribute
はNotAuthorizedResult
を忠実に返します。これは、HTTP 401 Not Authorizedレスポンスをクライアントに送信します。これはAJAXクライアントに最適です。
問題はFormsAuthモジュールがStatusCodeをチェックし、401であればリダイレクトを実行することです。私はこの方法でこの問題に闘おました:
1)AuthorizeAttribute
の私自身の派生タイプを作成します。私は、認証に失敗しました知っているようにHttpContext.Items
にフラグを配置し、私はリダイレクトではなく、401を強制する必要があります。
public class AjaxAuthorizeAttribute : AuthorizeAttribute
{
/// <summary>
/// Processes HTTP requests that fail authorization.
/// </summary>
/// <param name="filterContext">Encapsulates the information for using <see cref="T:System.Web.Mvc.AuthorizeAttribute"/>. The <paramref name="filterContext"/> object contains the controller, HTTP context, request context, action result, and route data.</param>
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest()) filterContext.HttpContext.Items["AjaxPermissionDenied"] = true;
base.HandleUnauthorizedRequest(filterContext);
}
}
2)あなたのGlobal.asax.csに入れる:
protected void Application_EndRequest(Object sender, EventArgs e)
{
if (Context.Items["AjaxPermissionDenied"] is bool)
{
Context.Response.StatusCode = 401;
Context.Response.End();
}
}
3)は、お使いのjQueryのAJAXのセットアップにからstatusCodeハンドラを追加します。
$.ajaxSetup({
statusCode: {
401: function() {
window.location.href = "path/to/login";
}
}
});
4)あなたはAuthorizeAttribute
を使用してからAjaxAuthorizeAttribute
にこの動作をしたいコントローラやアクションを変更します。
[AjaxAuthorize]
public string SaveEmployee(string Location, string dateApplied, string Status, string mailCheck, ...)
{
objEmpMain.FirstName = firstName;
objEmpMain.LastName = lastName;
objEmpMain.Initial = Initial;
objEmpMain.Address1 = Address;
...
...
...
}
実際には、私の現在のクラスは "public class EmployeeController:Controller"のように見えます。あなたは次のように私に "public class AjaxAuthorizeAttribute:AuthorizeAttribute"のように指示しますか? –
コントローラやコントローラのアクションで装飾した 'AjaxAuthorizeAttribute'のために' AuthorizeAttribute'をスワップアウトするだけです。私が今追加した#4を見てください。 – HackedByChinese
申し訳ありませんが、私は "public class AjaxAuthorizeAttribute:AuthorizeAttribute"クラスを作成する必要があることを私に説明できますか? –