windows 域验证 IIS7.0
public sealed class UserInfo { public string GivenName; public string FullName; public string Email; }
/// <summary> /// 活动目录中的搜索路径,也可根据实际情况来修改这个值。 /// </summary> public static string DirectoryPath = "LDAP://" + GetDomainName(); /// <summary> /// 获取与指定HttpContext相关的用户信息 //登录时调用的方法 /// </summary> /// <param name="context"></param> /// <returns></returns> public static UserInfo GetCurrentUserInfo(string userName,string password) { string loginName = GetUserLoginName(userName); if (string.IsNullOrEmpty(loginName)) return null; return GetUserInfoByLoginName(loginName,password); } /// <summary> /// 根据指定的HttpContext对象,获取登录名。 /// </summary> /// <param name="context"></param> /// <returns></returns> public static string GetUserLoginName(string userNames) { //if (context == null) // return null; //if (context.Request.IsAuthenticated == false) // return null; // string userName = context.User.Identity.Name; string userName = @"JABIL\" + userNames; // 此时userName的格式为:UserDomainName\LoginName // 我们只需要后面的LoginName就可以了。 string[] array = userName.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries); if (array.Length == 2) return array[1]; return null; } /// <summary> /// 根据登录名查询活动目录,获取用户信息。 /// </summary> /// <param name="loginName"></param> /// <returns></returns> public static UserInfo GetUserInfoByLoginName(string loginName,string password) { if (string.IsNullOrEmpty(loginName)) return null; // 下面的代码将根据登录名查询用户在AD中的信息。 // 为了提高性能,可以在此处增加一个缓存容器(Dictionary or Hashtable)。 try { //string domainAndUsernames = Environment.UserDomainName + "\\" + loginName; //在IIS7.0中不起作用 string domainAndUsername = "JABIL" + "\\" + loginName; DirectoryEntry entry = new DirectoryEntry(DirectoryPath, domainAndUsername, password); DirectorySearcher search = new DirectorySearcher(entry); search.Filter = "(SAMAccountName=" + loginName + ")"; search.PropertiesToLoad.Add("givenName"); search.PropertiesToLoad.Add("cn"); search.PropertiesToLoad.Add("mail"); // 如果还需要从AD中获取其它的用户信息,请参考ActiveDirectoryDEMO SearchResult result = search.FindOne(); if (result != null) { UserInfo info = new UserInfo(); info.GivenName = result.Properties["givenName"][0].ToString(); info.FullName = result.Properties["cn"][0].ToString(); info.Email = result.Properties["mail"][0].ToString(); return info; } } catch { // 如果需要记录异常,请在此处添加代码。 } return null; } private static string GetDomainName() //获取登录名 { // 注意:这段代码需要在Windows XP及较新版本的操作系统中才能正常运行。 SelectQuery query = new SelectQuery("Win32_ComputerSystem"); using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query)) { foreach (ManagementObject mo in searcher.Get()) { if ((bool)mo["partofdomain"]) return mo["domain"].ToString(); } } return null; } } }
备注 Environment.UserDomainName 在VS可以起租用的,在IIS7.0中不起作用
人生,因静而从容,因从容而优雅