2011-11-02 89 views
2

我試圖在我的MVC3應用程序中授權ajax操作方法。當用戶會話過期並且要求執行ajax操作方法時會出現問題。 asp.net身份驗證系統發送302重定向,而不是發送401,這對於非Ajax請求似乎是合乎邏輯的。但是隨着Ajax的發展,它們很快就會混亂起來。所以我決定按照ASP.NET MVC forces an AJAX request be redirected to the login page when the FormsLogin session is no longer active建議的方法。 基本上,在請求結束時,我們檢查請求是否是ajax請求,並且存在重定向(302響應)。如果是,那麼我們將響應代碼從302更換爲401.因此,在JavaScript中,我們檢查401並從那裏執行重定向。這裏是我都忍了在Ajax上授權屬性控制器中的操作方法

在Global.asax.cs中的基本代碼

protected void Application_EndRequest() { 
     var context = new HttpContextWrapper(Context); 
     // If we're an ajax request, and doing a 302, then we actually need to do a 401 
     if (Context.Response.StatusCode == 302 && context.Request.IsAjaxRequest()) { 
      Context.Response.Clear(); 
      Context.Response.StatusCode = 401; 
     } 
    } 

jQuery的全局錯誤處理程序(包括在asp.net mvc的母版頁:_Layout.cshtml)

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) { 
    if (jqXHR.status == 401) { 
     window.location.replace(loginUrl); 
    } 
}); 

我剛剛很快測試了這段代碼,它似乎工作正常。這段代碼是否有任何潛在的問題。就asp.net mvc和jquery而言,我是一個相對新手的程序員,所以我想在實際執行代碼之前我會詢問其他意見。

回答

4

這是blog post,我強烈建議您閱讀。它說明了處理這個問題的更好方法。

+0

感謝您的鏈接。我想我會採用博客中提出的方法。我安裝了相同的Nuget包,它似乎工作正常。 – Jatin

+0

@Nirvan,太棒了。我很高興你採用了這種方法。 –

相關問題