我目前正在使用Castle-Windsor和WCF工具來注入我所有的WCF服務。我剛剛開始使用自定義IAuthorizationPolicy
添加權限要求,這似乎在對服務執行每個方法的基礎上工作,但是當服務類本身用需求標記時,我會得到拋出的異常。與WCF和Castle-Windsor一起使用IAuthorizationPolicy時遇到的麻煩
我已經設置了基於How To – Use Username Authentication with Transport Security in WCF from Windows Forms的示例。我沒有設置自定義HTTP Module類,因爲我使用的是現有的Membership
實現。我的IAuthorizationPolicy
實現(HttpContextPrincipalPolicy
)基本相同。
我Web.config
的重要組成部分是:
<serviceBehaviors\>
<behavior name="MyBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceAuthorization principalPermissionMode="UseAspNetRoles"
roleProviderName="UserProvider">
<authorizationPolicies>
<clear/>
<add policyType="Website.FormsAuth.HttpContextPrincipalPolicy,Website"/>
</authorizationPolicies>
</serviceAuthorization>
</behavior>
</serviceBehaviors>
一切似乎當我把對法的要求,做工精細。這是正在做像這樣:
[PrincipalPermission(SecurityAction.Demand, Role = RoleNames.USER_ADMINISTRATION)]
如果這是上OperationContract
方法,工作的事情如預期。但是,如果被移動到類本身(它實現ServiceContract
)我得到下面的異常(與大多數的修剪掉多餘的東西):
Castle.MicroKernel.ComponentActivator.ComponentActivatorException {
Message = "ComponentActivator: could not instantiate Services.UserService"
InnerException = System.Reflection.TargetInvocationException {
Message = "Exception has been thrown by the target of an invocation."
InnerException = System.Security.SecurityException {
Message = "Request for principal permission failed."
}
}
}
我調試,發現構造上HttpContextPrincipalPolicy
被調用,但Evaluate()
不是當需求被附加到類。當它連接到方法Evaluate()
時是被調用。所以在這一點上,我已經走到了我的新手.NET/WCF/Castle-Windsor技能。
有沒有辦法告訴Castle-Windsor調用服務構造函數,同時遵守IAuthorizationPolicy
?或者告訴WCF需要調用Evaluate()
來創建類?或者有沒有其他方法可以做到同樣的事情呢?我不想用完全相同的屬性聲明位來標記每一個方法。
這似乎符合我所看到的。我想知道,是否有另一種方法來做類似的事情,而不必標記每種方法? –
如果你正在編寫自己的IAuthorizationPolicy,那麼你可以做任何你想做的事情。因此,如果您希望創建一個安全模型,並在服務級別控制訪問權限,則可以檢查當前身份的聲明以查看是否允許訪問該服務。唯一的區別是您負責將訪問控制列表數據存儲在您自己的表單中,而不是使用PrincipalPermissionAttribute。這可以是您自己編寫的自定義屬性,也可以將其存儲在數據庫/配置文件中的靜態代碼之外。 –