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

时间:2017-12-11 15:38:44

标签: c# winforms security authentication active-directory

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

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

       AppDomain currentDomain = AppDomain.CurrentDomain;
        // Set the principal policy to WindowsPrincipal.
        currentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);

但我需要该系统要求用户:

  • 选择登录凭据=> 这可以通过PrincipalPolicy.WindowsPrincipal我猜
  • 选择在Windows登录表单中输入不同的凭据(不在我的应用程序中)=> 我该如何运作?

P.S。我知道可以像这里描述的那样发送用户名/密码: Validate a username and password against Active Directory? 但我不希望通过我的应用程序获得用户凭据,因为有安全风险

我在CodeProject.com中发现了有关如何使用Active DirectoryLDAP进行身份验证的项目,但这也需要在我的应用程序中输入用户凭据...

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

针对Active Directory进行桌面身份验证的任何解决方案?

1 个答案:

答案 0 :(得分:2)

这是我过去在VB.NET中编写的一种方法,并为您转换为C# 使用System.DirectoryServices命名空间(您需要提供参考),以便检查用户对网络中的DC(LDAP)服务器的凭据(当然是Windows网络)。

澄清:我们公司安全部门要求此方法用于用户需要从同事计算机登录公司软件的情况。
我建议(出于安全原因)要求从您的IT部门将所有用户添加到特定的活动目录组,并检查用户是否是此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;
        }
    }
}