C# 如何在Winforms/C中使用Active Directory进行身份验证?

C# 如何在Winforms/C中使用Active Directory进行身份验证?,c#,winforms,security,authentication,active-directory,C#,Winforms,Security,Authentication,Active Directory,我需要为我的Winforms应用程序使用Active Directory实现身份验证 我知道可以像这样获取当前Windows用户凭据: AppDomain currentDomain = AppDomain.CurrentDomain; // Set the principal policy to WindowsPrincipal. currentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPri

我需要为我的Winforms应用程序使用Active Directory实现身份验证

我知道可以像这样获取当前Windows用户凭据:

       AppDomain currentDomain = AppDomain.CurrentDomain;
        // Set the principal policy to WindowsPrincipal.
        currentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
但我需要系统要求用户:

选择logged in credentials=>这可能与PrincipalPolicy.WindowsPrincipal一起实现 选择在Windows登录窗体中输入不同的凭据,而不是在我的应用程序中=>如何才能使其正常工作? 另外,我知道可以发送如下所述的用户名/密码: 但我不想让用户凭据通过我的应用程序,因为这样可以避免安全风险

我在关于如何使用LDAP对Active Directory进行身份验证的文章中也发现了这个项目,但这也需要在我的应用程序中输入用户凭据

我知道也有Active Directory联合服务,但据我所知,它用于基于Web的身份验证


有针对Active Directory的桌面身份验证解决方案吗?

这是我过去在VB.NET中编写的一个方法,并为您转换为C。 使用System.DirectoryServices命名空间您需要进行引用,以便根据网络中的DCLDAP服务器检查用户的凭据当然是windows网络

澄清:此方法是我公司安全部门要求的,用于用户需要从同事计算机登录到公司软件的情况。出于安全原因,我建议您的IT部门要求将所有用户添加到特定的active directory组,并检查该用户是否是此AD组的成员,同时记录连接到软件的每个本地ip地址

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.DirectoryServices;

namespace WindowsFormsApplication15
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            if (IsAuthenticated("YOUR DOMAIN", "USERNAME", "PASSWORD") == false)
            {
                // not exist in active directory!
            }
            else
            {
                // user is exist in active directory
            }
        }

        private string _path { get; set; }
        private string _filterAttribute { get; set; }

        public bool IsAuthenticated(string domain, string username, string pwd)
        {
            string domainAndUsername = domain + "\\" + username;
            DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd);
            try
            {
                object obj = entry.NativeObject;
                DirectorySearcher search = new DirectorySearcher(entry);
                search.Filter = "(SAMAccountName=" + username + ")";
                search.PropertiesToLoad.Add("cn");
                SearchResult result = search.FindOne();
                if ((result == null))
                {
                    return false;
                }

                _path = result.Path;
                _filterAttribute =  result.Properties["cn"][0].ToString();

            }
            catch (Exception ex)
            {
                return false;
            }

            return true;
        }
    }
}

听起来这是一个奇怪的要求,并且违反了一些原则,例如,要以其他用户的身份登录,您需要同时了解这两个方面——一个是登录操作系统,另一个是登录应用程序。我知道可能有多个用户在使用该系统,这也很奇怪。我真的不理解这个问题。您向用户请求用户名和密码,并使用LDAP对该数据进行身份验证,这就是如何完成的。这有什么问题?@RowlandShaw我不认为这是一个奇怪的要求,在某些情况下,用户需要从同事的计算机上使用其系统的用户配置文件登录。@RowlandShaw在我看来,切换用户是一个庞大的解决方案。组织中的计算环境需要适应用户的需求,而不是相反,毕竟工作需要高效、快速地进行,以满足组织的需求。程序员的工作是确保一切都是安全的,但这不再是编程中已经渗透到其他领域的争论,因此争论是徒劳的。谢谢你的回答,但这个解决方案要求用户在我的应用程序中输入他的广告密码。。。嗯,我知道我可以相信我自己,但在安全审计的情况下,我认为向第三方泄露广告凭据的申请不会被接受。对于Azure AD,有基于令牌的身份验证,我正在搜索与Winforms+Active Directory组合类似的内容。您的Winforms应用程序是否也有服务器端或只是客户端应用程序?所有内容是否仅在组织的局域网内通信?客户端应用程序正在与服务器上的数据库通信,服务器上托管了一些Windows服务。我同意业务逻辑应该在服务器端,但这会如何影响授权?如果我正确获得架构,就可以在应用程序服务器端WCF或类似的东西上创建安全服务,另一个应用程序将向服务器传递用户凭据,服务器将检查是否授权,并将其发送到您的应用程序。顺便说一句,业务逻辑不必在服务器上,在许多情况下,在客户端机器上运行时会更高效,这是桌面应用程序的专业之一,这就是他们发明angular的原因。。。