2012-10-03 28 views
7

ajaxから関数を呼び出すとき。プログラムフローで期限切れのセッションが認識されない、つまりログインページにリダイレクトされません。その代わりに、レコードを保存します。私はc#.net mvcで作業しています。それでは、どうやってAJAX呼び出し中にセッションを処理できるのですか?ここで私はコードを渡した。ここでC#mvcコントローラへのajax呼び出しが動作しないときのセッションタイムアウトの処理

$.ajax({ 
      type: "POST", 
      url:'/Employee/SaveEmployee', 
      data: 
      { 
       Location:$("#txtLocation").val(), 
       dateApplied:$("#txtDateApplied").val(), 
       Status:$("#ddStatus").val(), 
       mailCheck:$("#ddMailCheck").val(), 
       ... 
       ... 
       ... 
      }, 
      success: function (result) 
      { 

      }, 
      error: function (msg) 
      { 
      } 
     }); 

コントローラ

[Authorize] 
public string SaveEmployee(string Location, string dateApplied, string Status, string mailCheck, ...) 
{ 
     objEmpMain.FirstName = firstName; 
     objEmpMain.LastName = lastName; 
     objEmpMain.Initial = Initial; 
     objEmpMain.Address1 = Address; 
     ... 
     ... 
     ... 
} 

答えて

23

は、あなたのAJAX呼び出しの結果はまだ可能性(心配しないで、けれども、それは実際にあなたのアクションメソッドが実行されません)成功登場することになりますと、 successハンドラを呼び出します。これは、あなたがHTMLを期待しているからです。それはあなたが受け取っているものです(しかし、結果として得られるHTMLはあなたが望むHTMLではなくあなたのログインページです)。さて、もしあなたがJSON(dataType:'JSON'を使って)を期待するならば、それはJSONとしてHTMLを解析するので、エラーを引き起こすでしょう。

FormsAuthがAJAXリクエストのログインページをリダイレクトしないようにするだけです。現在、AuthorizeAttributeNotAuthorizedResultを忠実に返します。これは、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; 
     ... 
     ... 
     ... 
} 
+0

実際には、私の現在のクラスは "public class EmployeeController:Controller"のように見えます。あなたは次のように私に "public class AjaxAuthorizeAttribute:AuthorizeAttribute"のように指示しますか? –

+1

コントローラやコントローラのアクションで装飾した 'AjaxAuthorizeAttribute'のために' AuthorizeAttribute'をスワップアウトするだけです。私が今追加した#4を見てください。 – HackedByChinese

+0

申し訳ありませんが、私は "public class AjaxAuthorizeAttribute:AuthorizeAttribute"クラスを作成する必要があることを私に説明できますか? –

1

私は401を使用するときに、私はいくつかの問題に会ったのStatusCode = 306 を使用することができsugguestしたいと思います。 IISは私が理解しているものとは異なる401を扱います。 306はうまく動作します。

よろしくお願いいたします。

関連する問題