2016-03-21 72 views
2

將定製授權添加到WCF Web服務我正在使用.NET 4.5和SimpleInjector編寫WCF服務。這是一個REST服務(使用http/get/post)。如何使用DI

我需要添加授權層到我的服務。經過大量搞亂之後,我現在有一個基於ServiceAuthorizationManager的自定義授權管理器。

我見過的所有例子(我發現很多)都有硬編碼的用戶名和密碼檢查。我想使用數據庫,因此想要將數據層注入到我的類中。如果我將構造函數更改爲參數,則會引發異常「爲此對象定義的無參數構造函數」。

這是我根據我的代碼從例子:https://msdn.microsoft.com/en-us/library/ms731774(v=vs.110).aspx我添加了一個構造函數的接口:

public class MyServiceAuthorizationManager : ServiceAuthorizationManager 
{ 
    public MyServiceAuthorizationManager (IMyDataLayer mdl) 
    { ... 

Custom "Basic" Authentication for my WCF services. REST and RIA. Possible?

+0

請你包含引發錯誤和完整堆棧跟蹤的代碼嗎? – qujck

+0

這是我基於我的代碼的示例:https://msdn.microsoft.com/en-us/library/ms731774(v=vs.110).aspx – Neil

+0

這是一個使用WCF的REST服務?你確定要這麼做嗎? WCF有點糟糕,如果你做REST,Web API使得這更容易。我認爲如果您使用Web API應用[此練習](https://cuttingedge.it/blogs/steven/pivot/entry.php?id=95),您會使自己的生活變得更加輕鬆,正如可以在[this存儲庫(https://github.com/dotnetjunkie/solidservices)。 – Steven

回答

4

什麼你可能確實是配置在配置的行爲,你的經理級文件(如MSDN文章所示):

<serviceBehaviors> 
    <behavior name="CalculatorServiceBehavior"> 
    <serviceAuthorization serviceAuthorizationManagerType="Samples.MyServiceAuthorizationManager,MyAssembly" /> 
    </behavior> 
</serviceBehaviors> 

在這種情況下,WCF完全控制此ty的創建PE;不是簡單的噴油器。這意味着它需要一個默認的構造函數。

想到的第一個解決方案是讓該類爲Humble Object,並讓它委託給真正的身份驗證邏輯,並將其放入真正的服務中。這基本上意味着你的Humble對象只是調用容器來解析實際的服務並調用其適當的方法。應該在Humble Object的類中完成解析,並且不應該緩存「真實」的服務。

另一種選擇是從容器解析,並將其分配給WCF從代碼配置管理器(如MSDN也顯示):

serviceHost.Authorization.ServiceAuthorizationManager = 
    container.GetInstance<MyServiceAuthorizationManager>(); 

,但必須在這裏拍攝,因爲經理現在變成一個單身人士,因爲WCF將永遠堅持下去。除非它的所有依賴都是單例,否則不要這樣做。確保你明確地在容器中註冊你的經理作爲單身人士,所以當你撥打Verify時,容器可以爲你檢查俘虜依賴。

+1

正如你所建議的那樣,我已經使用了配置文件版本,並且最終也得到了serviceHost.Authorisation。我基本上擔心處理所有授權的單身人士。我將調查Humble對象(不是我之前遇到過的模式,謝謝 – Neil

+0

我接受了你的答案,因爲它基本上證實了我的懷疑並給出了適當的解決方法。 – Neil