2014-09-22 81 views
1

我熟悉表單身份驗證如何與ASP.NET MVC協同工作;這並不難。但是我對於身份驗證如何處理單頁面Web應用程序有些不確定。當然,我可以使用單頁應用程序處理初始登錄,因爲會有回傳,我可以執行標準表單身份驗證。但在此之後,我將使用ajax訪問更多的網頁內容。單頁網頁,Asp.net MVC和身份驗證

我的想法是實現一個間隔函數與jquery每20分鐘左右將要求密碼重新進行身份驗證。什麼是對asp.net MVC單頁網絡應用進行身份驗證的「最佳做法」?

回答

2

您也可以使用表單身份驗證。 ajax請求通過與完整頁面postabacks相同的管道,因爲它們只是具有不同內容類型和有效負載的普通HTTP請求。因此,一旦您驗證用戶身份並創建身份驗證cookie,它就會在服務器上傳輸。因此服務器將以標準方式檢查它。您唯一需要處理的是重定向到未經過身份驗證的用戶的登錄頁面。您可以在客戶端處理此問題(默認情況下,http重定向不由XHR請求處理,但您可以編寫自定義代碼來處理它們)。返回一個401 HTTP狀態代碼爲Ajax請求:

public class AuthorizeAjaxAttribute : AuthorizeAttribute 
    {  
     protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
     { 
      if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest() && 
       // angular.js requests 
       filterContext.RequestContext.HttpContext.Request.ContentType == "application/json" || 
       filterContext.RequestContext.HttpContext.Request.ContentType == "application/xml" || 
       ) 
      { 
       // ajax request returns HTTP 401 (Unauthorized) status code 
       filterContext.Result = new Http401Result(); 
      } 
      else 
      { 
       // standard behavior - redirect to login page 
       base.HandleUnauthorizedRequest(filterContext); 
      } 
     } 
    } 

然後處理它在客戶端(取決於您的客戶端框架):

$(document).ajaxError(function (event, jqxhr, settings, exception) { 
    if (jqxhr.status == 401) { //Forbidden, go to login 
     //Use a reload, WIF will redirect to Login 
     location.url = "/Account/Login"; 
    } 
}); 
+0

啊好吧,我想我已經得到了它!我將要編寫一些代碼,我會在這裏發佈結果。唯一的一點是,在用戶第一次登錄後,我想避免重定向到單頁面(如果初次登錄後需要重新進行身份驗證)。但是,看起來這很容易從你告訴我的事情中完成。非常感謝您在這裏指出我正確的方向! – brando 2014-09-23 21:06:11