2009-11-16 80 views
1

我目前正在使用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()來創建類?或者有沒有其他方法可以做到同樣的事情呢?我不想用完全相同的屬性聲明位來標記每一個方法。

回答

1

當您將類自身標記爲PrincipalPermissionAttribute時,它有效地告訴運行時,在使用類時必須滿足權限需求。所以現在當Castle-Windsor試圖實例化這個類時,許可需求正在被制定,當然它不能被滿足,因爲在那個時候安全上下文沒有被正確地建立。

由於其運行時的性質,AFAIK,PrincipalPermissionAttribute在WCF的類級別上不受支持,即使它是從純.NET透視圖允許的。因此Castle-Windsor無法基於相同的原因創建服務實例。

+0

這似乎符合我所看到的。我想知道,是否有另一種方法來做類似的事情,而不必標記每種方法? –

+0

如果你正在編寫自己的IAuthorizationPolicy,那麼你可以做任何你想做的事情。因此,如果您希望創建一個安全模型,並在服務級別控制訪問權限,則可以檢查當前身份的聲明以查看是否允許訪問該服務。唯一的區別是您負責將訪問控制列表數據存儲在您自己的表單中,而不是使用PrincipalPermissionAttribute。這可以是您自己編寫的自定義屬性,也可以將其存儲在數據庫/配置文件中的靜態代碼之外。 –