2009-06-24 5 views
1

J'essaie d'autoriser tous les utilisateurs du groupe Administrateurs à accéder via WCF.Comment puis-je obtenir l'attribut WindowsIdentity ou WindowsPrincipal d'une réclamation/identificateur de sécurité WCF (SID)?

internal sealed class AuthorizationManager : ServiceAuthorizationManager 
{ 
    public override bool CheckAccess(OperationContext operationContext) 
    { 
     base.CheckAccess(operationContext); 

     ReadOnlyCollection<ClaimSet> claimSets = operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets; 
     ClaimSet claimSet = claimSets[0]; 

     foreach (var claim in claimSet.FindClaims(ClaimTypes.Sid, Rights.Identity)) 
     { 
      SecurityIdentifier sid = (SecurityIdentifier)claim.Resource; 
      NTAccount ntAccount = (NTAccount)sid.Translate(typeof(NTAccount)); 

      //This line throws an error. How can i convert a SecurityIdentifier to a WindowsIdentity? 
      WindowsIdentity user = new WindowsIdentity(ntAccount.Value); 

      WindowsPrincipal principal = new WindowsPrincipal(user); 
      return principal.IsInRole(WindowsBuiltInRole.Administrator); 
     } 
    } 
} 

Répondre

3

Vous devez vous authentifier. Vous avez un identifiant qui identifie un compte, il est isomorphe avec un nom de compte, c'est-à-dire SID: S-1-5-domain-500 < => DOMAINE \ Administrateur. Un WindowsIdentity est un utilisateur qui a été authentifié. Cela dit, je pense que l'utilisateur que vous essayez d'obtenir a déjà été authentifié et fournit une revendication de son identité de compte (SID).

1

JP est correct. Les revendications fournies incluent le SID de tous les groupes d'utilisateurs dont l'utilisateur est membre. Voici notre solution.

internal sealed class AuthorizationManager : ServiceAuthorizationManager 
{ 
    public override bool CheckAccess(OperationContext operationContext) 
    { 
     base.CheckAccess(operationContext); 

     ReadOnlyCollection<ClaimSet> claimSets = operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets; 
     ClaimSet claimSet = claimSets[0]; 

      //is this a member of the local admins group 
      SecurityIdentifier adminsSid = new SecurityIdentifier("S-1-5-32-544"); 
      foreach (var claim in claimSet.FindClaims(ClaimTypes.Sid, Rights.PossessProperty)) 
      { 
       if (adminsSid.Equals(claim.Resource)) 
       { 
        return true; 
       } 
      } 
    } 
} 
Questions connexes