2013-11-01 96 views
2

我有一堂課,課堂用ClaimsPrincipalPermissionsAttribute裝飾。該班有一個方法,也用ClaimsPrincipalPermissionsAttribute裝飾。我期望的是:在課程級別和方法級別申請ClaimsPrincipalPermissionAttribute時出現異常

首先,當我實例化類時,我接到一個調用我的自定義ClaimsAuthorizationManager。這按預期工作。

二,當我打電話給我的方法時,我得到兩個電話給我的ClaimsAuthorizationManager。一個來自類級別屬性的資源和操作,另一個來自方法級別屬性。這不起作用。相反,當我調用該方法時,我得到了一個SecurityException。例外消息是:

對嵌入的權限集對象解碼失敗。

要嘗試查看發生了什麼,我通過複製ClaimsPrincipalPermissionsAttribute的代碼創建了自定義屬性。我可以看到在我的屬性上調用CreatePermission()方法,並且它成功返回ClaimsPrincipalPermission,但在調用ClaimsAuthorizationManager之前拋出異常。

我的代碼如下所示:

using System; 
using System.IdentityModel.Services; 
using System.Security.Permissions; 

namespace ConsoleApplication5 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var test = new SecuredClass(); 

      test.MethodLevelSecuredMethod(); 

      Console.ReadKey(); 
     } 
    } 

    [ClaimsPrincipalPermission(SecurityAction.Demand, Resource = "SecuredClass", Operation = "GeneralAccess")] 
    class SecuredClass 
    { 
     [ClaimsPrincipalPermission(SecurityAction.Demand, Resource = "MethodLevelSecuredMethod", Operation = "Call")] 
     public void MethodLevelSecuredMethod() 
     { 
      Console.WriteLine("Called MethodLevelSecuredMethod"); 
     } 
    } 
} 

我在做什麼錯?是否可以在類和方法級聲明屬性?

我正在使用.Net 4.5。

回答

3

問題正在發生,因爲ClaimsPrincipalPermission沒有實現一個採用PermissionState參數的公共構造函數。 (需要記錄在http://msdn.microsoft.com/en-us/library/vstudio/yaah0wb2.aspx,儘管隱藏在文本中間。)

這實質上是一個框架中的錯誤,應該在https://connect.microsoft.com/visualstudio/feedback處報告。如果你這樣做了,你可能想補充說一個FxCop規則來檢查這個構造函數的存在可能也是一個好主意。

如果您希望爲基於聲明的授權使用聲明式方法,那麼在您修復錯誤之前,您唯一的選擇是重新實施ClaimsPrincipalPermissionClaimsPrincipalPermissionAttribute

0

我工作圍繞這通過使用類構造函數中的CheckAccess電話:

class SecuredClass 
{ 
    public SecuredClass() 
    { 
     ClaimsPrincipalPermission.CheckAccess("SecuredClass", "GeneralAccess"); 
    } 

    [ClaimsPrincipalPermission(SecurityAction.Demand, Resource = "MethodLevelSecuredMethod", Operation = "Call")] 
    public void MethodLevelSecuredMethod() 
    { 
     Console.WriteLine("Called MethodLevelSecuredMethod"); 
    } 
} 
+0

我嘗試這個解決方案,並進入了其他問題。當上面的CheckAccess方法被調用並且返回false時 - 在System.IdentityModel.Services(mscorlib.dll)中拋出System.Reflection.TargetInvocationException之前拋出了System.Security.SecurityException。因此,這使得它很難捕獲安全異常,因爲它是由targetinvocationexception包裝的 – David