2009-11-02 2 views
1

개체에 대한 보안 설명자가 있습니다. 해당 보안 설명자를 사용하여 해당 개체에 대한 사용 권한을 가진 사용자 및 그룹을 가져 오려고합니다. 해당 보안 설명자를 사용하여 어떤 사용자가 어떤 사용 권한을 갖고 있는지 알고있는 방법? ObjectSecurity 또는 CommonObjectSecurity 추상 클래스를 사용할 수 있습니까? 그렇다면 액세스 규칙을 정의하는 방법은 무엇입니까? 이것에 대한 샘플이 있습니까?.Net에서 보안을 구현하는 방법은 무엇입니까?

답변

2

권한이있는 사용자 및 그룹에 액세스하려면 .Net에서 쉽게 메커니즘을 사용할 수 있습니다. 추상 클래스 인 CommonObjectSecurity 클래스를 구현하고 AccessRuleFactory 및 AuditRuleFactory 메서드를 재정의하고 AccessRuleType 및 AuditRuleType 속성을 재정의합니다. 다음 예제에서 SampleSecurity 클래스는 CommonObjectSecurity에서 파생됩니다. 또한 AccessRule에서 SampleAccessRule 클래스를 정의합니다. 선택적으로 AddAccessRule 및 RemoveAccessRule을 구현하여 보안을 수정할 수 있습니다.

public class SampleSecurity : CommonObjectSecurity 
{ 
    public SampleSecurity(bool isContainer) 
     : base(isContainer) 
    { 
    } 

    public override AccessRule AccessRuleFactory(IdentityReference identityReference, 
     int accessMask, bool isInherited, InheritanceFlags inheritanceFlags, 
     PropagationFlags propagationFlags, AccessControlType type) 
    { 
     return new SampleAccessRule(identityReference, accessMask, type); 
    } 

    public void AddAccessRule(IdentityReference identityReference, 
     int accessMask, AccessControlType type) 
    { 
     base.AddAccessRule(new ProxyAccessRule(identityReference, accessMask, type)); 
    } 

    public void RemoveAccessRule(ProxyAccessRule rule) 
    { 
     base.RemoveAccessRule(rule); 
    } 

    public override Type AccessRuleType 
    { 
     get { return typeof(ProxyAccessRule); } 
    } 

    public override AuditRule AuditRuleFactory(System.Security.Principal.IdentityReference identityReference, int accessMask, bool isInherited, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AuditFlags flags) 
    { 
     throw new NotImplementedException(); 
    } 

    public override Type AuditRuleType 
    { 
     get { throw new NotImplementedException(); } 
    } 

      public override Type AccessRightType 
    { 
     get { return typeof(SampleRightsEnum); } 
    } 
} 

public class SampleAccessRule : AccessRule 
{ 
    public ProxyAccessRule(IdentityReference identity, int accessMask, AccessControlType accessType) 
     : base(identity, accessMask, false, InheritanceFlags.None, PropagationFlags.None, accessType) 
    { 
    } 

    public int AccessRights { get { return AccessMask; } } 
} 

    public enum SampleRightsEnum 
{ 
    sampleRead = 0x001, 
    sampleWrite = 0x002, 
    sampleExecute = 0x004 
} 

이가 정의되면, 우리는 SampleSecurity의 객체를 생성하고 그것을 아래로 우리가 서로 다른 사용자에 대한 권한을 읽을 수있는 보안 설명을 할당 할 수 있습니다.

SampleSecurity security = new SampleSecurity(false); 
      security.SetSecurityDescriptorBinaryForm((byte[])securityDescriptor, AccessControlSections.All); 
      AuthorizationRuleCollection coll = dataSecurity.GetAccessRules(true, false, typeof(NTAccount)); 
      foreach (AuthorizationRule rule in coll) 
      { 
       SampleAccessRule accRule = rule as SampleAccessRule; 
       SampleRightsEnum rights = (SampleRightsEnum)accRule.AccessRights; 
       Console.Writeline("User or Group {0} having the permissions {1} with access type {2}", rule.IdentityReference.Value, rights.ToString(), accRule.AccessControlType.ToString()); 
      } 
+0

나는'ProxyAccessRule'이 무엇인지 알지 못합니다. 나에게 계몽 해 줄 수있어? .Net에서 사용할 수있는 네임 스페이스로 표시되지 않습니다. 관습? 그렇다면 클래스가 수행하는 작업의 예를 제공하는 것이 도움이 될 수 있습니다. 이 대답은 더 많은 upvotes를 얻을 수 있습니다. – IAbstract

+0

nvm, 알아 냈습니다. 나는 네가 실수 한 것 같아. 당신은 클래스를'SampleAccessRule'으로 정의했지만,'ProxyAccessRule'으로 정의 된 생성자를 제공했습니다. – IAbstract

+0

이제'securityDescriptor' 변수가 무엇인지 이해하려고합니다. 어떤 힌트? – IAbstract

관련 문제