1. NUget 引入:
System.DirectoryServices
System.DirectoryServices.AccountManagement
2 登陆种情况:有登陆界面和无登陆界面
2.1. 有登陆界面,有表单,输入用户名密码,后台拿到用户名密码,找AD 服务器验证
protected virtual bool ValidateCredentials(PrincipalContext principalContext, string userNameOrEmailAddress, string plainPassword) { return principalContext.ValidateCredentials(userNameOrEmailAddress, plainPassword, ContextOptions.Negotiate); }
2.2. 无登陆界面,浏览器弹出密码输入框。
需要做的有:
- IIS 支持安装 Windows Authentication
- .NetCore 选择windows 认证。
- Action上带上 Authoriz(…) (.NetCore 3.1 模板,自己会加上这一步。)
3.根据组名获取邮箱(下面代码是先获取组成员,再得到他的邮箱):
public string[] GetEmails(string groupName) { DirectorySearcher ds = new DirectorySearcher(); ds.SearchRoot = new DirectoryEntry("LDAP://" + _appConfiguration["Container"]); ds.Filter = $"(&(objectClass=group)(cn={groupName}))"; var ms = new List<string>(); foreach (SearchResult result in ds.FindAll()) { DirectoryEntry deGroup = new DirectoryEntry(result.Path); var pcoll = deGroup.Properties["member"]; for (int l = 0; l < pcoll.Count; l++) { var n = pcoll[l].ToString(); DirectoryEntry deUser = new DirectoryEntry($"LDAP://{n}"); ms.Add(deUser.Properties["mail"][0].ToString()); } } return ms.ToArray(); }
4.对于Windows认证,很容易获取到 Name.
怎么根据Name,获取组呢? 既然在域中,网站服务器知道AD服务器在哪儿,代码不用关心这个了。
下面代码实现这个。
DirectoryEntry entry = new DirectoryEntry(); DirectorySearcher search2 = new DirectorySearcher(entry); search2.Filter = $"(cn={Name})"; search2.PropertiesToLoad.Add("memberOf"); SearchResult result2 = search2.FindOne(); foreach (var item in result2.Properties["memberof"]) { Console.WriteLine(item.ToString()); } Console.Read();