2010-07-20 169 views
2

我有一個RESTful WCF服務使用基本身份驗證,自定義服務主機和。我有一個自定義的UserNamePasswordValidator設置,並且一個自定義的IPrincipal正確地流向操作。但是,對於傳統的互操作性,我需要支持不同的身份驗證模式。它應該工作的方式前進:WCF基本身份驗證和自定義令牌身份驗證

  1. 用戶張貼到登錄URI
  2. 服務認證用戶如上述,但返回的會話令牌(加密的用戶憑證)作爲HTTP響應報頭中。
  3. 來自用戶的所有後續請求都包含會話令牌而不是基本驗證。

我當前的想法是這樣的:如果會話令牌包含加密憑證,那麼應該可以操縱傳入消息,解密憑證並用基本驗證頭替換會話頭。我的問題是要找到一個擴展點:

  • 暴露了一些方式和郵件屬性
  • 執行-before-定製UserNamePasswordValidator執行..

做任何你知道大師的這樣的可擴展性點,還是一種定製傳輸安全機制的方式?我被這裏的大量選項所困惑,並且在Reflector中瀏覽System.ServiceModel命名空間一直是一個令人沮喪的練習。

謝謝!

+0

我也想知道這是否可能。對於使用sessionKey進行後續認證請求的想法,還沒有找到太多的東西。 – 2010-08-19 01:17:51

回答

2

我自己發現了答案,答案是我不知道如何實現問題中概述的機制 - 即在密碼驗證之前用另一個替換HTTP標頭。

相反,我用IAuthorizationPolicy替換了UserNamePasswordValidator。在策略的Evaluate方法中,另一個類處理基本憑證或會話密鑰的檢查,並返回自定義IIdentity。這裏的關鍵在於,如果認證成功,則將包含自定義ID的新List添加到evaulationContext,的「Identities」屬性中,自定義主體將添加到「Principal」屬性中。一旦設置了這些屬性,WCF就會正確地將主體傳遞給操作。

這已經被證明是一個令人滿意的解決方案,但是我還是很失望,沒有找到我期待的擴展點。