2009-05-15 8 views
5

jquery ajaxをGUIに組み込んだコンテンツ管理システムを構築するにあたって、私はハードルに遭遇しました。一部の顧客は、何を書こうとしているのかについて長すぎる思考を費やしているため、サーバーセッションがログアウトしてしまいます。彼らが変更を提出しようとすると、私はサーバーにajax呼び出しを使用してデータを保存します。ajaxフォームの投稿の前にmvcでHTTP認証を確認する

次は、MVCサーバーアプリケーションが「401 Unauthorized」ステータスを返すことが予想されます。その後、jquery ajaxオブジェクトを取得してユーザーにログインさせてから、ユーザーが承認されると変更を再送信することができます。

しかし、MVCアプリケーションから実際に返されるのは、「302 Found」ステータスとログインフォームページへのリダイレクトURLです。ログインフォームページは "200 OK"ステータスコードを返し、jquery ajaxオブジェクトは成功イベントを呼び出し、MVCアプリケーションが何を言っているのかによってユーザーに成功したことを知らせます。

MVCアプリケーションを実行して、それを行うか、ログインページを検出するためにjquery ajaxイベントを変更する必要があると思う方法がありますか?

更新:

私はそのためのコードを、MVCコードとAUTHORIZE属性で見てNotAuthorizedResultを返すために反射板を使用しましたが(0x191 = 401)以下

public override void ExecuteResult(ControllerContext context) 
{ 
    if (context == null) 
    { 
     throw new ArgumentNullException("context"); 
    } 
    context.HttpContext.Response.StatusCode = 0x191; 
} 
です

私はおそらく、Forms Authorization HttpModuleが401を見て、リダイレクトを強制していると考えています。あなたはこのような何かを試みることができる

答えて

6

:HttpModuleをして

void context_EndRequest(object sender, EventArgs e) 
    { 
     var app = sender as HttpApplication; 
     var response = app.Response; 
     var request = app.Request; 

     if ((response.StatusCode == 302) && IsAjaxRequest(request)) 
      response.StatusCode = 401; 
    } 

を、それはとてもステータスコードを修正します順番にFormsAuthモジュールの後になります。きわめて効果的ではありません。

+0

.Net 4.0(おそらく他のバージョンでもわかりません)、FormsAuthenticationはEndRequestハンドラでリダイレクトを実行します。EndRequestを使用した場合、FormsAuthが応答を処理していないことがわかりましたが、PreSendRequestHeadersイベントを使用すると、EndRequestの後の方がずっと良くなりました。この素晴らしい投稿をありがとう。 – womp

5

私はこの解決策が本当に好きです。 ajaxリクエストの302レスポンスを401に変更することで、クライアント側のajaxを設定して401を探しているAjaxリクエストを監視し、ログインページにリダイレクトするリクエストがあればそれを探します。非常に簡単で効果的です。

のGlobal.asax:

protected void Application_EndRequest() 
{ 
    if (Context.Response.StatusCode == 302 && 
     Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest") 
    { 
     Context.Response.Clear(); 
     Context.Response.StatusCode = 401; 
    } 
} 

クライアント側コード:

$(function() { 
     $.ajaxSetup({ 
     statusCode: { 
      401: function() { 
      location.href = '/Logon.aspx?ReturnUrl=' + location.pathname; 
      } 
     } 
     }); 
    }); 
1

より軽量なアプローチは、ログインページにカスタムHTTPヘッダーを追加し、チェックするだけであることを、私を見つけましたAJAXの成功のコールバックにその存在のために。

すなわち。クライアント側のAJAXハンドラで

public ActionResult Login(string returnUrl = "") 
{ 
    Response.AddHeader("X-Unauthorized", "true"); 
    ... 

そして:

success: function(data, textStatus, jqXhr) 
{ 
    if (jqXhr.getResponseHeader("X-Unauthorized")) 
    { 
     ... 

この作品LoginController(これはMVCプロジェクトですが、同じ原理は、他のASP.NETソリューションを申請してください)で少なくとも私のために。

関連する問題