【问题标题】:How to keep my application "authenticated" with an AD account? c#如何使用 AD 帐户保持我的应用程序“经过身份验证”? C#
【发布时间】:2020-03-12 17:02:07
【问题描述】:

我对 C# 很陌生
我一直在使用 Powershell 脚本来编写诸如解锁 AD 用户或启用/禁用帐户之类的代码。但是,我使用不同的帐户执行此操作,因此我将使用管理员帐户(Get-Credential)登录并将其存储为例如“$cred”。

我目前正在尝试在 C# 中做类似的事情,并且我发现了如何有效地“验证” 但我不确定如何存储该身份验证,或者让我的应用通过身份验证来执行诸如禁用或解锁 AD 帐户之类的操作。

我有这个:

public bool ADauthenticate(string username, string password)
{
    bool result = false;
    using (DirectoryEntry _entry = new DirectoryEntry())
    {
        _entry.Username = username;
        _entry.Password = password;
        DirectorySearcher _searcher = new DirectorySearcher(_entry);
        _searcher.Filter = "(objectclass=user)";
        try
        {
            SearchResult _sr = _searcher.FindOne();
            string _name = _sr.Properties["displayname"][0].ToString();
            MessageBox.Show("authenticated!");
            result = true;
            this.Close();
        }
        catch
        {
            MessageBox.Show("Incorrect credentials");
            this.ADUsername.Text = "";
            this.ADPwd.Text = "";
        }
    }
    return result; //true = user Authenticated.
}

这只是告诉我该帐户当然是正确的,但不会让我的应用程序保持“身份验证”,有什么想法吗?

【问题讨论】:

  • 这是什么应用程序?桌面、网络或 API?
  • 这是一个桌面应用程序

标签: c# active-directory user-accounts


【解决方案1】:

说您的“应用程序”已通过身份验证是不准确的。所有经过身份验证的都是到您的域控制器的单个网络连接。一旦_entry 被销毁,您就会失去该身份验证。

如果您希望使用这些凭据完成所有操作,那么您有多种选择,从简单(对您而言)到更困难:

  1. 让您的用户使用他们需要的凭据运行您的应用程序。然后,您无需费心获取他们的用户名和密码或在 DirectoryEntry 对象上设置用户名和密码。用户可以通过以下方式做到这一点:

    • 使用 Shift + 右键单击​​应用程序图标并单击“以其他用户身份运行”,或者
    • 创建到:runas.exe /user:DOMAIN\username "yourapplication.exe" 的快捷方式。这将打开一个要求输入密码的命令窗口,然后在这些凭据下启动您的应用程序。
  2. 您仍然要求输入用户名和密码,但使用 Process.Start() 在这些凭据下重新启动您的应用程序。

  3. 在应用程序的整个生命周期中保持usernamepassword 变量有效,并将它们传递给您在应用程序中创建的每个DirectoryEntry 对象。

选项 1 和 2 要求您运行它的计算机与您要连接的域加入到相同或受信任的域。但既然我看到你没有指定域名,我猜是这样。

【讨论】:

    【解决方案2】:

    您可以通过使用System.DirectoryServices.AccountManagement 程序集和命名空间更轻松地做到这一点。

    System.DirectoryServices.AccountManagement 程序集的引用添加到您的项目中,然后使用此代码针对 AD 验证用户名/密码:

    using System.DirectoryServices.AccountManagement;
    
    // create the principal context
    using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YourDomain"))
    {
        bool accountValidated = ctx.ValidateCredentials(userName, password);
    
        // do whatever you want to do with this information
    }
    

    【讨论】:

    • 请记住,AccountManagement 命名空间总是比直接使用 DirectoryEntry/DirectorySearcher 慢。但它可以使开发人员的事情变得更容易。这是一种权衡。
    • @GabrielLuci:同意-但验证用户凭据通常不是时间紧迫的事情,而且您通常只做一次(或很少)-这不是常见的、频繁的操作-所以它的速度是次要的。
    猜你喜欢
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    相关资源
    最近更新 更多