2008-11-22 24 views
3

quelqu'un peut-il expliquer le comportement C# suivant? J'ai écrit une petite application console juste pour en apprendre davantage sur CAS, mais je ne peux pas l'air de comprendre pourquoi les lignes suivantes de travail de code comme ils le font:Comportement SecurityManager.IsGranted()

string[] myRoles = new string[] { "role1", "role2", "role3" }; 
GenericIdentity myIdentity = new GenericIdentity("myUsername", "customAuthType"); 
GenericPrincipal myPrincipal = new GenericPrincipal(myIdentity, myRoles); 

System.Threading.Thread.CurrentPrincipal = myPrincipal; 

Console.WriteLine(SecurityManager.IsGranted(new PrincipalPermission(null, "role1"))); 
Console.WriteLine(SecurityManager.IsGranted(new PrincipalPermission(null, "roleX"))); 

La sortie est « true » pour les deux SecurityManager.IsGranted () appels.

Si je puis ajouter les lignes suivantes:

new PrincipalPermission(null, "role1").Demand(); 
new PrincipalPermission(null, "roleX").Demand(); 

le premier passe l'appel de la demande, mais la deuxième (comme prévu) provoque une SecurityException.

Pourquoi l'appel SecurityManager.IsGranted() ne renvoie-t-il pas la valeur false pour l'autorisation "roleX"?

Répondre

0

Je crois que SecurityManager.IsGranted regarde principalement les demandes de code (l'ensemble etc) - pas des demandes spécifiques telles que les permissions principales.

Pour faire ce que vous voulez:

static bool HasAccess(string role) 
    { 
     IPrincipal principal = System.Threading.Thread.CurrentPrincipal; 
     return principal == null ? false : principal.IsInRole(role); 
    } 
1

Des réponses à une question similaire here il semble que IsGranted() fonctionne uniquement avec des autorisations de CAS, et non des autorisations non-CAS.

Citations de l'article:

SecurityManager.IsGranted() détermine si une autorisation est accordée par examen des autorisations de CAS qui ont été accordées par l'administrateur . Étant donné que WorkingTimePermission est une autorisation non-CAS , cela signifie que les stratégies de sécurité définies par l'administrateur ont aucun impact concernant cette autorisation. En d'autres termes, aucun administrateur ne peut accorder ou révoquer un [autorisation non-CAS]. Par conséquent, SecurityManager.IsGranted() retournera toujours false pour [autorisation autre que CAS].

et

Il m'a fallu un certain temps pour s'y habituer CAS par rapport à des autorisations non-CAS, et se rendent compte que des phrases clés comme « politiques de sécurité » et « politique » ne appliquer aux autorisations CAS. Une fois que je suis arrivé à l'aise avec cela, déchiffrage entrées d'aide apparemment innocents comme Remarques de SecurityManager.IsGranted section est devenu beaucoup plus facile:

« Octroi d'autorisations est déterminé par la politique ... »

Cela implique - mais ne pas explicitement état - que la méthode fonctionne uniquement avec des autorisations CAS, car il est en vérifiant la stratégie de sécurité en cours. Il faut un peu de temps pour s'y habituer.

1

Dans .NET 4.0 SecurityManager.IsGranted a été rendu obsolète.

C'est ce que c'était et si vous compilez en compatibilité .NET 4.0, il se plaindra.

bool isGranted = SecurityManager.IsGranted(new SecurityPermission(SecurityPermissionFlag.Infrastructure)) 

Pour résoudre ce problème:

var permissionSet = new PermissionSet(PermissionState.None); 
permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode)); 
bool isGranted = permissionSet.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet); 

Référence:
http://www.stringbuilder.net/post/2009/07/31/In-NET-40-SecurityManagerIsGranted-is-obsolete.aspx