Basf_EProject/EProject/BLL/LdapAuthentication.cs

477 lines
18 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.DirectoryServices;
using System.Data;
namespace BLL
{
public class LdapAuthentication
{
// public LdapAuthentication()
// {
// }
// private string _path;
// private string _filterAttribute;
// public LdapAuthentication(string path)
// {
// _path = path;
// }
private static string _path;
private static string _filterAttribute;
#region
/// <summary>
/// </summary>
/// <param name="domainName">域名或IP</param>
/// <param name="userName">用户名</param>
/// <param name="userPwd">密码</param>
/// <param name="entry">域</param>
/// <returns></returns>
public static DirectoryEntry IsConnected(string domainName, string userName, string userPwd)
{
DirectoryEntry domain = new DirectoryEntry();
try
{
domain.Path = string.Format("LDAP://{0}", domainName);
domain.Username = userName;
domain.Password = userPwd;
domain.AuthenticationType = AuthenticationTypes.Secure;
domain.RefreshCache();
return domain;
}
catch (Exception ex)
{
BLL.ErrLogInfo.WriteLog(ex.ToString());
return null;
}
}
#endregion
/// <summary>
/// 判断是否域用户
/// </summary>
/// <param name="domain">域名</param>
/// <param name="username">用户名</param>
/// <param name="pwd">密码</param>
/// <returns></returns>
public static bool IsAuthenticated(string domain, string username, string pwd)
{
string domainAndUsername = domain + @"\" + username;
DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd);
try
{
//Bind to the native AdsObject to force authentication.
object obj = entry.NativeObject;
DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = "(SAMAccountName=" + username + ")";
search.PropertiesToLoad.Add("cn");
SearchResult result = search.FindOne();
if (null == result)
{
return false;
}
//Update the new path to the user in the directory.
_path = result.Path;
_filterAttribute = (string)result.Properties["cn"][0];
}
catch (Exception ex)
{
throw new Exception("Error authenticating user. " + ex.Message);
}
return true;
}
/// <summary>
/// 根据用户名获取所属组名
/// </summary>
/// <returns></returns>
public static string GetGroupByUser()
{
DirectorySearcher search = new DirectorySearcher(_path);
search.Filter = "(cn=" + _filterAttribute + ")";
search.PropertiesToLoad.Add("memberOf");
StringBuilder groupNames = new StringBuilder();
try
{
SearchResult result = search.FindOne();
int propertyCount = result.Properties["memberOf"].Count;
string dn;
int equalsIndex, commaIndex;
for (int propertyCounter = 0; propertyCounter < propertyCount; propertyCounter++)
{
dn = (string)result.Properties["memberOf"][propertyCounter];
equalsIndex = dn.IndexOf("=", 1);
commaIndex = dn.IndexOf(",", 1);
if (-1 == equalsIndex)
{
return null;
}
groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1));
}
}
catch (Exception ex)
{
throw new Exception("Error obtaining group names. " + ex.Message);
}
return groupNames.ToString();
}
/// <summary>
/// 获取组用户
/// </summary>
/// <param name="Groupname">组名</param>
/// <returns></returns>
public static string[] GetUsersForGroup(string Groupname)
{
DirectorySearcher ds = new DirectorySearcher(_path);
ds.Filter = "(&(objectClass=group)(cn=" + Groupname + "))";
ds.PropertiesToLoad.Add("member");
SearchResult r = ds.FindOne();
if (r.Properties["member"] == null)
{
return (null);
}
string[] results = new string[r.Properties["member"].Count];
for (int i = 0; i < r.Properties["member"].Count; i++)
{
string theGroupPath = r.Properties["member"][i].ToString();
results[i] = theGroupPath.Substring(3, theGroupPath.IndexOf(",") - 3);
}
return (results);
}
/// <summary>
/// 获取用户所属组
/// </summary>
/// <param name="username">用户名</param>
/// <returns></returns>
public static string[] GetGroupsForUser(string username)
{
DirectorySearcher ds = new DirectorySearcher(_path);
ds.Filter = "(&(sAMAccountName=" + username + "))";
ds.PropertiesToLoad.Add("memberof");
SearchResult r = ds.FindOne();
if (r.Properties["memberof"].Count == 0)
{
return (null);
}
string[] results = new string[r.Properties["memberof"].Count];
for (int i = 0; i < r.Properties["memberof"].Count; i++)
{
string theGroupPath = r.Properties["memberof"][i].ToString();
results[i] = theGroupPath.Substring(3, theGroupPath.IndexOf(",") - 3);
}
return (results);
}
public static string[] GetAllGroupsForUser(string username)
{
DirectorySearcher ds = new DirectorySearcher(_path);
ds.Filter = "(&(sAMAccountName=" + username + "))";
ds.PropertiesToLoad.Add("memberof");
SearchResult r = ds.FindOne();
if (r.Properties["memberof"] == null)
{
return (null);
}
string[] results = new string[r.Properties["memberof"].Count + 1];
for (int i = 0; i < r.Properties["memberof"].Count; i++)
{
string theGroupPath = r.Properties["memberof"][i].ToString();
results[i] = theGroupPath.Substring(3, theGroupPath.IndexOf(",") - 3);
}
results[r.Properties["memberof"].Count] = "All";//All组属于任何人,在AD之外定义了一个组以便分配用户权限
return (results);
}
/// <summary>
/// 获取组用户
/// </summary>
/// <param name="username">用户名</param>
/// <returns></returns>
public static string GetUserDisplayName(string username)
{
string results;
DirectorySearcher ds = new DirectorySearcher(_path);
ds.Filter = "(&(objectClass=user)(sAMAccountName=" + username + "))";
ds.PropertiesToLoad.Add("DisplayName");
SearchResult r = ds.FindOne();
results = r.GetDirectoryEntry().InvokeGet("DisplayName").ToString();
return (results);
}
public static string GetAdGroupDescription(string prefix)//根据CN获取组description
{
string results;
DirectorySearcher groupsDS = new DirectorySearcher(_path);
groupsDS.Filter = "(&(objectClass=group)(CN=" + prefix + "*))";
groupsDS.PropertiesToLoad.Add("cn");
SearchResult sr = groupsDS.FindOne();
results = sr.GetDirectoryEntry().InvokeGet("description").ToString();
return (results);
}
public static DataTable GetAdGroupInfo()//根据CN获取组信息
{
DataTable dt = new DataTable();
dt.Columns.Add("URL", typeof(System.String));
dt.Columns.Add("cn", typeof(System.String));
dt.Columns.Add("Description", typeof(System.String));
DirectorySearcher searcher = new DirectorySearcher(_path);
searcher.Filter = "(&(objectClass=group))";
//searcher.SearchScope = SearchScope.Subtree;
//searcher.Sort = new SortOption("description", System.DirectoryServices.SortDirection.Ascending);
searcher.PropertiesToLoad.AddRange(new string[] { "cn", "description" });
SearchResultCollection results = searcher.FindAll();
if (results.Count == 0)
{
return (null);
}
else
{
foreach (SearchResult result in results)
{
DataRow dr = dt.NewRow();
dr[0] = result.Path.ToString();
dr[1] = result.GetDirectoryEntry().InvokeGet("cn").ToString();
if (result.GetDirectoryEntry().InvokeGet("Description") != null)
dr[2] = result.GetDirectoryEntry().InvokeGet("Description").ToString();
else
dr[2] = result.GetDirectoryEntry().InvokeGet("cn").ToString();
dt.Rows.Add(dr);
}
dt.DefaultView.Sort = "description ASC";
return dt;
}
}
public static string getAccountName(string cn) //根据CN获取登陆名
{
foreach (string path in _path.Split(','))
{
DirectorySearcher ds = new DirectorySearcher(path);
ds.Filter = "(&(objectClass=user)(cn=*" + cn + "*))";
ds.PropertiesToLoad.Add("sAMAccountName");
SearchResult r = ds.FindOne();
if (r != null)
return r.GetDirectoryEntry().InvokeGet("sAMAccountName").ToString();
}
return null;
}
public static DataTable adUserlist(string groupname) //生成用户数据表
{
DataTable dt = new DataTable();
dt.Columns.Add("cn", typeof(System.String));
dt.Columns.Add("sAMAccountName", typeof(System.String));
string[] groupmember = GetUsersForGroup(groupname);
if (groupmember.Length == 0)
{
return null;
}
else
{
foreach (string member in groupmember)
{
if (IsAccountActive(getAccountControl(getAccountName(member))))
{
DataRow dr = dt.NewRow();
dr[0] = member.ToString();
dr[1] = getAccountName(member);
dt.Rows.Add(dr);
}
}
return dt;
}
}
public static DataTable adUserlist() //生成指定的用户信息数据表
{
DataTable dt = new DataTable();
dt.Columns.Add("memberof", typeof(System.String));
dt.Columns.Add("cn", typeof(System.String));
dt.Columns.Add("Description", typeof(System.String));
dt.Columns.Add("name", typeof(System.String));
dt.Columns.Add("Mail", typeof(System.String));
dt.Columns.Add("samaccountname", typeof(System.String));
dt.Columns.Add("whencreated", typeof(System.String));
dt.Columns.Add("title", typeof(System.String));
dt.Columns.Add("department", typeof(System.String));
DirectorySearcher searcher = new DirectorySearcher(_path);
//searcher.Filter = "(description=ADPJ*)";
searcher.Filter = "(description=ADPL*)";
searcher.PropertiesToLoad.AddRange(new string[] { "memberof", "cn", "description", "name", "Mail", "samaccountname", "whencreated", "title", "department" });
SearchResultCollection results = searcher.FindAll();
if (results.Count == 0)
{
return (null);
}
else
{
foreach (SearchResult result in results)
{
DataRow dr = dt.NewRow();
//dr[0] = result.Path.ToString();
if (result.GetDirectoryEntry().InvokeGet("memberof") != null)
dr[0] = result.GetDirectoryEntry().InvokeGet("memberof").ToString();
else
dr[0] = "";
if (result.GetDirectoryEntry().InvokeGet("cn") != null)
dr[1] = result.GetDirectoryEntry().InvokeGet("cn").ToString();
else
dr[1] = "";
if (result.GetDirectoryEntry().InvokeGet("Description") != null)
dr[2] = result.GetDirectoryEntry().InvokeGet("Description").ToString();
else
dr[2] = result.GetDirectoryEntry().InvokeGet("cn").ToString();
if (result.GetDirectoryEntry().InvokeGet("name") != null)
dr[3] = result.GetDirectoryEntry().InvokeGet("name").ToString();
else
dr[3] = "";
if (result.GetDirectoryEntry().InvokeGet("Mail") != null)
dr[4] = result.GetDirectoryEntry().InvokeGet("Mail").ToString();
else
dr[4] = "";
if (result.GetDirectoryEntry().InvokeGet("samaccountname") != null)
dr[5] = result.GetDirectoryEntry().Properties["samaccountname"].Value.ToString();
else
dr[5] = "";
if (result.GetDirectoryEntry().InvokeGet("whencreated") != null)
dr[6] = result.GetDirectoryEntry().Properties["whencreated"].Value.ToString();
else
dr[6] = "";
if (result.GetDirectoryEntry().InvokeGet("title") != null)
dr[7] = result.GetDirectoryEntry().Properties["title"].Value.ToString();
else
dr[7] = "";
if (result.GetDirectoryEntry().InvokeGet("department") != null)
dr[8] = result.GetDirectoryEntry().Properties["department"].Value.ToString();
else
dr[8] = "";
dt.Rows.Add(dr);
}
dt.DefaultView.Sort = "description ASC";
return dt;
}
}
//public void adUserlistbox(ListBox results, string groupName) //生成USER
//{
// results.Items.Clear();
// DataTable dt = adUserlist(groupName);
// if (dt != null)
// {
// results.DataSource = dt;
// results.DataTextField = dt.Columns[0].Caption;
// results.DataValueField = dt.Columns[1].Caption;
// results.DataBind();
// }
//}
//public void adGrouplistbox(ListBox results)
//{
// results.Items.Clear();
// DataTable dt = GetAdGroupInfo();
// DataRow dr = dt.NewRow();
// dr[1] = "All";
// dr[2] = "All";
// dt.Rows.Add(dr);
// results.DataSource = dt;
// results.DataTextField = dt.Columns[2].Caption;
// results.DataValueField = dt.Columns[1].Caption;
// results.DataBind();
//}
//public void aduserGrouplist(DropDownList results)
//{
// results.Items.Clear();
// DataTable dt = GetAdGroupInfo();
// results.DataSource = dt;
// results.DataTextField = dt.Columns[2].Caption;
// results.DataValueField = dt.Columns[1].Caption;
// results.DataBind();
//}
public static int getAccountControl(string accountName)//获取权限码
{
int results;
DirectorySearcher ds = new DirectorySearcher(_path);
ds.Filter = "(&(objectClass=user)(sAMAccountName=" + accountName + "))";
ds.PropertiesToLoad.Add("userAccountControl");
try
{
SearchResult r = ds.FindOne();
results = Convert.ToInt32(r.GetDirectoryEntry().InvokeGet("userAccountControl"));
return results;
}
catch
{
return 0;
}
}
public static bool IsAccountActive(int userAccountControl)//判断是否有效
{
int ADS_UF_ACCOUNTDISABLE = 0X0002;
int userAccountControl_Disabled = Convert.ToInt32(ADS_UF_ACCOUNTDISABLE);
int flagExists = userAccountControl & userAccountControl_Disabled;
if (flagExists > 0)
return false;
else
return true;
}
public static DirectoryEntry GetDirectoryEntryByAccount(string sAMAccountName)
{
DirectorySearcher deSearch = new DirectorySearcher(_path);
deSearch.Filter = "(&(objectCategory=person)(objectClass=user)(sAMAccountName=" + sAMAccountName + "))";
// deSearch.SearchScope = SearchScope.Subtree;
try
{
SearchResult result = deSearch.FindOne();
if (result == null)
{ return null; }
DirectoryEntry de = new DirectoryEntry(_path);
return de;
}
catch
{
//throw;
return null;
}
}
}
}