2011-09-26 57 views
1

我開發一個web服務它必須符合給定應用所需的WSDL規範,其中每一個SOAP請求攜帶清晰,純文本用戶名密碼 (我知道這是一個非常糟糕的主意,但那不是我的設計選擇)。現在,我必須通過針對有效憑證的數據庫檢查這些憑據來驗證對我的服務方法的每次調用。我聽說過WCF的UserNamePasswordValidator,但根據我的理解,只有當證書通過SOAP頭傳遞時才適用,但它們不是。我在這裏有什麼選擇?在消息的主體證書WCF認證

回答

1

你知道這是一個壞主意,所以我不會質疑你的設置:-)

如果你的用戶名和密碼以明文形式發送過線你的肥皂身體裏面,簡單的使用信息以手動驗證您的數據庫實例。取出用戶名和密碼並用SQL查詢驗證(或其MD5散列),只有在數據庫中找到值時才返回一行。當該行返回時,您知道用戶已通過身份驗證。

0

我在這裏有什麼選擇?

在這種情況下您需要做的是爲您的服務實施自定義授權管理器。這並不難,因爲我之前做過幾次。簡而言之,您將您的服務配置爲指向一個名爲CheckAccessCore的新重寫方法,您可以在其中執行授權邏輯。您應該能夠檢查上下文和消息正文以獲取您需要的任何憑據。有一點需要了解的是在這一點上對檢查郵件正文有一些性能影響,但是如果你沒有選擇,至少有一個工作解決方案就足夠了。

這一切都發生在之前被調用的實際方法被執行,這是有效的,因爲如果方法沒有被授權,該方法永遠不會被調用。

所以這裏可能是一個典型的配置(一些其他配置冷落爲了簡潔):

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MySvcBehavior"> 
     <serviceAuthorization serviceAuthorizationManagerType="MyWCFService.CustomAuthorizationManager, MyWCFService" /> 
    </behavior> 
    </serviceBehaviors> 
<behaviors> 

在你的,你可能有類似的東西在下面,或者用你自己的需要來檢查服務代碼郵件正文:

public class CustomAuthorizationManager : ServiceAuthorizationManager 
{ 

    protected override bool CheckAccessCore(OperationContext operationContext) 
    { 

     IIdentity primaryIdentity = operationContext.ServiceSecurityContext.PrimaryIdentity; 
     if (primaryIdentity.Name == "user1") 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 

    } 

} 

這裏是一些特別的筆記從我的代碼從MSDN包括:在Windows通訊基礎(WCF)身份驗證模型的基礎設施支持可擴展基於聲明的authorizat離子模型。索賠是從令牌中提取的,並可以通過自定義授權策略進行處理,然後放入AuthorizationContext中。授權管理者檢查AuthorizationContext中的聲明以作出授權決定。默認情況下,授權決策由ServiceAuthorizationManager類進行;但是,通過創建自定義授權管理器可以覆蓋這些決定。要創建自定義授權管理器,請創建一個從ServiceAuthorizationManager(此類)派生的類並實現CheckAccessCore方法(在此類中完成)。授權決策在CheckAccessCore方法中進行,該方法在授予訪問權限時返回「true」,並在拒絕訪問時返回「false」。

這裏有(2)其他鏈接,例如。第一個是在方法中使用聲明的MSDN鏈接。只要記住,你可以做任何你需要在CheckAccessCore內。它只需要最後返回truefalse。第二個鏈接來自我的博客,我有一個完整的實現,但使用Windows身份驗證。再一次,您的詳細信息將檢查郵件正文以獲取CheckAccessCore方法中所需的詳細信息。

如何:
http://msdn.microsoft.com/en-us/library/ms731774.aspx

如何:創建ASP.NET風格的Windows身份驗證策略WCF服務:
http://allen-conway-dotnet.blogspot.com/2010/01/how-to-create-aspnet-windows.html

的服務創建自定義的授權管理器