2016-01-20 62 views
6

我正在設計和測試WCF服務並將它們公開爲SOAP Web服務。WCF中不同服務操作的不同安全性

我有我的服務類邏輯分裂。我有一個帳戶服務。要訪問帳戶Web服務,您必須提供用戶名和密碼以及API令牌。我編寫了一個擴展UserNamePasswordValidator的自定義類來關注身份驗證,並編寫了一個IDispatchMessageInspector來檢查該令牌。

需求剛剛浮出水面,我們希望提供一些帳戶檢查而無需用戶進行身份驗證。邏輯上這些操作應該保留在賬戶服務中。然而,服務行爲被配置爲需要用戶名,密碼並且具有IServiceBehavior,其添加IDispatchMessageInspector來檢查令牌的所有消息。

我已經通過Extending Dispatchers - MicrosoftWCF Extensibility - Carlos Figueira

審查所有不同的擴展點的我似乎可以找到一種方法,僅在操作級別應用安全。或者一種配置服務的方式,以便某些功能需要安全/令牌,而其他功能則不需要。

我是WCF的新手,所以它可能很簡單,但我沒有找到它。如果您知道一篇文章展示如何以不同方式保護服務的不同部分,或者您知道如何獲得服務,請向我提供一些信息。謝謝。

+0

爲此,您可以創建單獨的端點('免費'/公共服務),無需安全或使用不同的安全設置 – SalientBrain

+0

如何限制該端點中的操作?如果沒有認證,我想限制可以調用的內容。 – Allan

+0

您將終端暴露給與主要不同的特殊接口(僅限於受限制的操作) – SalientBrain

回答

1

由於您希望在操作級別允許/拒絕權限,因此您可以使用PrincipalPermission屬性來設置您的方法。

你可以使用這樣的:

[PrincipalPermission(SecurityAction.Demand,Authenticated=false)] 
void NotAutenticationRequiredMethod() 
[PrincipalPermission(SecurityAction.Demand,Authenticated=true)] 
void AuthenticationRequiredMethod() 

當你想要的東西更「靈活」,你也可以使用的角色,因此將不需要重新編譯:

[PrincipalPermission(SecurityAction.Demand, Role = "CustomRole")] 

你可以閱讀更多這裏:https://msdn.microsoft.com/en-us/library/ff649821.aspx

在方法級別,你也可以檢查你的OperationContext.Current.ServiceSecurityContext對象來驗證請求是否來自經過身份驗證的用戶並作出一些決定。

記住SecurityContext中可以有不同的認證:

string primaryIdentity = OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name; 

string windowsIdentity = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name; 

在這裏閱讀更多:https://sankarsan.wordpress.com/2010/07/25/identity-securitycallcontext-in-wcf/

希望它能幫助。

+0

謝謝。角色解決了我的問題的一部分。怎麼樣的令牌? 2個不同的操作需要不同的令牌才能工作。現在我正在使用IMessageInspector,但它會檢查所有消息,如何在操作級別消除消息? – Allan

+0

認證數據,包括您使用OperationContext對象訪問的令牌。你在MessageHeader中傳遞令牌嗎?如果是這樣,可以使用OperationContext.Current.IncomingMessageHeaders在標題的操作級讀取令牌。 –