2014-05-25 44 views
3

如何知道用戶未被授權執行Breeze查詢?當用戶未被授權查詢時,如何讓Breeze返回HttpResponse 401?

我已經添加了Authorize屬性到我的微風控制器的查詢:

[BreezeController] 
public class GamesController : ApiController 
{ 
    //... 
    [HttpGet] 
    [Authorize] 
    public IQueryable<Game> Games() 
    { 
     // return query from EF 
    } 
} 

當我詢問這從微風的JavaScript,我得到的200的HttpResponse和裏面的登錄屏幕的HTML 。我想知道用戶什麼時候沒有被授權,然後在javascript中處理(並且顯示那個時候我想要的任何HTML)。

我該如何做到這一點?

回答

2

經過一番進一步的調查,我相信這與Breeze無關。這是負責這種行爲的ASP.NET(MVC)。當用戶未被授權時,它將返回302重定向。

解決此問題的方法是掛鉤行爲並使ASP.NET返回401.但我們只想對AJAX請求執行此操作。

細節在this blogpost,但它歸結爲一個IHttpModule,做改變響應的StatusCode:

if (true.Equals(context.Items["RequestWasNotAuthorized"]) && request.IsAjaxRequest()) 
{ 
    response.StatusCode = 401; 
    response.ClearContent(); 
} 

和自定義屬性,而不是ASP.NET的授權屬性:

public class AjaxAwareAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if (filterContext.Result is HttpUnauthorizedResult && filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      filterContext.HttpContext.Items["RequestWasNotAuthorized"] = true; 
     } 
    } 
} 

然後您只需在客戶端檢查401的響應。