2010-01-14 115 views
1

我試圖通過Silverlight驗證對WCF DataServices服務的調用。實質上,當用戶登錄時,他們會得到一個特殊的散列,該散列應嵌入WCF DataServices的每個請求的標頭中。目前使用這個作爲通過QueryInterceptor方法檢查,例如對WCF DataServices進行身份驗證

[QueryInterceptor("Orders")] 
    public Expression<Func<Orders,bool>> OnQueryOrders() 
    { 
     string hash = WebOperationContext.Current.IncomingRequest.Headers.Get("MyHeader"); 

     if(!TestHash(hash)) 
     { 
      return o => false; 
     } 
     else 
     { 
      return o => true; 
     } 
    } 

這似乎是最糟糕的方式來實現這一點。 WCF Dataservices中是否有任何鉤子在運行查詢之前可用於取消請求的運行?請記住,此服務是無狀態的,無法訪問會話。

回答

5

其實我想我自己解決了這個問題。通過重寫OnStartProcessingRequest,我可以拋出一個例外,如果它不適合例如

protected override void OnStartProcessingRequest(ProcessRequestArgs args) 
    { 
     if (string.IsNullOrEmpty(WebOperationContext.Current.IncomingRequest.Headers.Get("MyMagicHeader"))) 
     { 
      throw new DataServiceException(404, "Access denied!"); 
     } 
     else 
     { 
      base.OnStartProcessingRequest(args); 
     } 
    } 
+1

YOu應該返回一個403(禁止)而不是404(Not Found) –

+0

太棒了!爲什麼我們不能這樣做認證,而不是愚蠢的基本的cust授權。這樣更安全嗎?我可以加密消息或令牌並在服務器上驗證它。 – gideon

0

您是否考慮過WCF Message Inspectors?我認爲(不保證)消息檢查器會在查詢攔截器之前被命中,因此您可以檢查這些頭並驗證用戶哈希值。這裏有一個很好的鏈接信息Writing Message Inspectors