2015-08-28 78 views
2

當用戶超時或者會話cookie被刪除時使用MVC 5認證,用戶被重定向到登錄頁面。MVC認證超時/會話cookie被刪除後的Ajax請求

這適用於整頁加載,但對於我的Ajax調用,這打破了客戶端。重定向在身份驗證頁面顯示時運行,但沒有響應(在標準加載輪後)。

我很確定這是某種JS問題。

JS:

$(function() { 
    $('#dealSearchForm').on("submit", function (e) { 
     e.preventDefault(); 
     $.ajax({ 
      url: this.action, 
      type: this.method, 
      data: $(this).serialize(), 
      success: function (data) { 
       $('#dealSearchForm').html(data); 
      }, 
      complete: function (data) { 
       $('#searchResults').show(); 
      } 
     }); 
    }); 
}); 

主視圖:

@{Html.RenderPartial("_DealSearch");} 

<script src="@Url.Content("~/Scripts/DealSearch.js")"></script> 

<script> 

    $(document).ready(function() { 
     @if (Model.Deals.Count > 0) { 
      @Html.Raw("$('#searchResults').show();"); 
     } 
    }); 

</script> 

局部視圖:

@using (Html.BeginForm("DealSearch", DealManagement, FormMethod.Post, new { @id = "dealSearchForm" })) 
{ 
/* Search filters etc */ 

<div class="col-xs-7"> 
    <button id="button-search" class="btn btn-primary pull-right" type="submit" data-loading-text="Please wait...">Search</button> 
</div> 

<div id="searchResults"> 
    /* Grid with results */ 
</div> 

控制器:

public virtual ActionResult Index() 
     { 
      var model = new DealSearchModel(); 

      return this.View(model); 
     } 

public virtual ActionResult DealSearch(DealSearchModel model) 
     { 
      // Get deals from service, uses search criteria 
      model.Deals = GetDeals(model); 

      // Return the view 
      return PartialView(MVC.DealManagement.Views._DealSearch, model); 
     } 

我得到的錯誤客戶端:

Error client side

如果任何人有他們會是非常讚賞的任何想法!

+0

你也可以顯示服務器端(控制器)代碼嗎? –

+0

嗨,我已經添加了控制器。謝謝。 – MattMcGowan

+0

試試這個JS內部的剃鬚刀代碼:http://stackoverflow.com/questions/5614941/mix-razor-and-javascript-code – rico

回答

1

使用基於Kamos答案的方法,我解決了這個使用以下:

自定義屬性

public class AuthoriseAjaxAttribute : AuthorizeAttribute 
{ 
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      filterContext.Result = new RedirectResult("~/Error/AjaxUnauthorized"); 
     } 
     else 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 
} 

的/錯誤/ AjaxUnauthorised查看

@{ 
    Layout = ""; // Result of an ajax call 
} 

// Refresh the page, resulting in MVC default login/redirection 
<script> 
    $(document).ready(function($) { 
     location.reload(true); 
    }); 
</script> 

// Only here for if Javascript is off 
<div class="panel panel-default"> 
    <div class="panel-heading"> 
     <div class="row"> 
      <div class="col-xs-12"> 
       Authorisation timeout. 
      </div> 
     </div> 
    </div> 
    <div class="panel-body black-text"> 
     Please refresh the page and log back in. 
    </div> 
</div> 

對於用戶,這使得Ajax調用以相同的方式響應超時。

2

您必須重寫默認行爲 - 我假設您的問題是當用戶點擊需要授權並且當前他的會話已過期的操作時,AJAX響應不再有效。

你沒有提供你如何授權您的方法,但考慮創建自定義的授權屬性:

public class CustomAuthorizationAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     // Check whether it is an AJAX or standard request 
    } 
} 

如何檢查它是否是一個Ajax請求,你可以找到here。而不是重定向你應該返回403未經授權的結果,並在你的AJAX調用中處理它。