【问题标题】:Can I get a users identity from an email address instead of a username in ASP.NET Core and DirectoryServices?我可以从电子邮件地址而不是 ASP.NET Core 和 DirectoryServices 中的用户名获取用户身份吗?
【发布时间】:2019-10-15 08:38:02
【问题描述】:

我需要用户能够输入电子邮件地址,并且在单击提交后,我想从输入的电子邮件地址中获取一些 Active Directory 信息。不幸的是,我们的用户名没有遵循单一的命名约定,因此我无法从输入的电子邮件地址中可靠地猜出用户名。

我可以从用户名中查找信息,有没有办法从使用 DirectoryServices 或类似方法输入的电子邮件地址回溯到身份?

谢谢,

编辑和一些澄清:

在表单上,​​我要查找的不是经过身份验证的用户电子邮件地址,而是在表单中输入的电子邮件地址。

    public class ManagerDetails
    {
        public string GetManagersName(string emailAddress)
        {
            PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
            UserPrincipal mgr = UserPrincipal.FindByIdentity(ctx, emailAddress);

            string managersName = mgr.GivenName;

            return managersName;
        }
    }

这段代码有效,但前提是用户名与电子邮件地址匹配。

例如,这有效,Joe.Bloggs@mydomain.com(电子邮件)和 Joe.Bloggs(域用户名)。

如果是 Joe.Bloggs@mydomain.com(电子邮件)和 BloggsJ(域用户名),则失败。

这显然是因为它使用电子邮件地址作为完整的用户名,但希望它解释了我想要实现的目标。

【问题讨论】:

  • 也许您可以展示一下您现在是如何查找用户的,然后我们可以帮助指导您?
  • 那么,如果员工离职而新员工收到相同的电子邮件,会发生什么情况?您可以在 AD 中通过电子邮件查找(Directory 的含义),但您不能使用它进行身份验证。
  • 至于从 AD 帐户获取信息,同样,您是从您已通过身份验证的 帐户 获取的,而不是电子邮件。虽然可以,但您可以通过电子邮件查找帐户,用户的帐户是您已经通过身份验证并且您已经可以访问其个人资料的帐户。
  • 添加了更多信息,希望它能阐明我想要做什么。

标签: c# asp.net asp.net-core active-directory


【解决方案1】:

我仍在完善,但这可行,它允许我使用目录搜索器从输入的电子邮件地址中获取名称。

        public string GetManagersName(string emailAddress)
        {
            string userName = GetManagersUserNameByEmailAddress(emailAddress);

            PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
            UserPrincipal usr = UserPrincipal.FindByIdentity(ctx, userName);

            string managersName = usr.GivenName;

            return managersName;
        }

        private string GetManagersUserNameByEmailAddress(string emailAddress)
        {
            DirectorySearcher adSearcher = new DirectorySearcher();
            adSearcher.Filter = ("mail=" + emailAddress);
            adSearcher.PropertiesToLoad.Add("samaccountname");

            SearchResult result = adSearcher.FindOne();

            DirectoryEntry user = result.GetDirectoryEntry();

            string userName = user.Properties["samaccountname"].Value.ToString();

            return userName;
        }

【讨论】:

  • 如果您也想包含辅助电子邮件地址(因为任何帐户都可以分配多个电子邮件地址),那么您可以使用adSearcher.Filter = ("proxyAddresses=smtp:" + emailAddress);
  • 巧合的是,我刚刚遇到了这个问题。谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多