c#检查用户是不是是组的成员?

Posted

技术标签:

【中文标题】c#检查用户是不是是组的成员?【英文标题】:c# check if the user member of a group?c#检查用户是否是组的成员? 【发布时间】:2011-05-20 22:44:27 【问题描述】:

我有一个代码,用于检查用户是否是 AD 的成员,运行良好,

现在我想添加检查用户是否也是组成员的可能性!

我需要修改什么来实现这一点,我做了一些工作,但它失败了!

这是我的代码:

        //Authenticate a User Against the Directory
        private bool Authenticate(string userName,string password, string domain)
        

            if (userName == "" || password == "")
            
                return false;
            

            bool authentic = false;
            try
            
                DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain,userName, password);
                object nativeObject = entry.NativeObject;
                authentic = true;
            
            catch (DirectoryServicesCOMException)  
            return authentic;
        

我想变成这样:

private bool Authenticate(string userName,string password, string domain, string group)

【问题讨论】:

您可能为此任务使用了错误的 API。您是否正在为应用程序编写身份验证代码?如果是这样,应该有一个更简单的 API 可以使用。例如,在 ASP.NET 中,您可以使用 Page.User 对象访问此信息。还是应用程序的目的实际上是查询 Active Directory? 【参考方案1】:

这在 Windows XP 或更早版本上不可用。

无论如何,为了检查组成员身份,您可以使用以下代码:

bool IsInGroup(string user, string group)

    using (var identity = new WindowsIdentity(user))
    
        var principal = new WindowsPrincipal(identity);
        return principal.IsInRole(group);
    

【讨论】:

我确实在一台不是 DC 成员的机器上使用了不同用户和密码的代码!它有效! 谢谢,但是如何将它集成到我的代码中? “字符串用户”让我感到困惑!还有一些我可以看一下的文档吗? 是域中的用户名。如果机器在同一个域中,它可能只使用用户名,或者它可以使用 user@domaindomain\user 对我来说,这个功能就像一个魅力,我根本不需要对请求的用户进行身份验证。 Windows XP 的问题在哪里? new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(group) 可以在 Windows XP 中工作吗?【参考方案2】:

我用这段代码解决了

public bool AuthenticateGroup(string userName, string password, string domain, string group)
    


        if (userName == "" || password == "")
        
            return false;
        

        try
        
            DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, userName, password);
            DirectorySearcher mySearcher = new DirectorySearcher(entry);
            mySearcher.Filter = "(&(objectClass=user)(|(cn=" + userName + ")(sAMAccountName=" + userName + ")))";
            SearchResult result = mySearcher.FindOne();

            foreach (string GroupPath in result.Properties["memberOf"])
            
                if (GroupPath.Contains(group))
                
                    return true;
                
            
        
        catch (DirectoryServicesCOMException)
        
        
        return false;
    

它对我来说很好,它可以与不属于域控制器/活动目录的机器一起使用

谢谢大家的帮助

【讨论】:

【参考方案3】:

在 ASP.Net 中您将使用 Page.User.IsInRole("RoleName") 或在 Windows 中您可以使用 System.Threading.Thread.CurrentPrincipal.IsInRole("RoleName")

【讨论】:

“RoleName”是“组”名称吗? 是的,一个用户可以属于不同的角色(组)。

以上是关于c#检查用户是不是是组的成员?的主要内容,如果未能解决你的问题,请参考以下文章

是组的当前用户成员

检查用户是否是SharePoint组的成员

为啥即使它是组的成员,apache也不能写入文件夹?

即使未提升权限,如何确定用户是不是为管理员

通过 C# 确定本地组的成员

win32 api - 如何检查远程机器上的用户权限