C#从Active Directory、IIS中的登录用户获取登录用户电子邮件地址

C#从Active Directory、IIS中的登录用户获取登录用户电子邮件地址,c#,asp.net-mvc,iis,active-directory,C#,Asp.net Mvc,Iis,Active Directory,我正在开发一个MVC应用程序,我希望通过从Active Directory检索用户的电子邮件地址,自动将用户登录到系统中,使用该电子邮件地址在我的数据库中查找用户,如果找到,请将其登录到系统中。这样做的目的是,系统不会强制用户在登录到其在工作域/Active Directory上设置的工作站后输入登录详细信息 请在这方面帮助我,因为我已经尝试了许多线程中描述的大多数方法 我已将IIS应用程序池设置为网络服务 ASP.NET模拟已禁用 我已在应用程序池->高级设置中启用加载用户配置文件 当我使

我正在开发一个MVC应用程序,我希望通过从Active Directory检索用户的电子邮件地址,自动将用户登录到系统中,使用该电子邮件地址在我的数据库中查找用户,如果找到,请将其登录到系统中。这样做的目的是,系统不会强制用户在登录到其在工作域/Active Directory上设置的工作站后输入登录详细信息

请在这方面帮助我,因为我已经尝试了许多线程中描述的大多数方法

  • 我已将IIS应用程序池设置为网络服务
  • ASP.NET模拟已禁用
  • 我已在应用程序池->高级设置中启用加载用户配置文件
当我使用以下代码时,搜索失败:

using ( System.Web.Hosting.HostingEnvironment.Impersonate() )
{
    PrincipalContext ctx = new PrincipalContext( ContextType.Domain );

    UserPrincipal user = UserPrincipal.FindByIdentity( ctx, User.Identity.Name );

    Response.Write( "User: " + User.Identity.Name );
    Response.Write( user.EmailAddress );
    Response.Flush();
    Response.End();
}
错误:
(&(objectCategory=user)(objectClass=user)(|(userPrincipalName=)(DifferentizedName=)(name=))搜索筛选器无效。

有人能给我指出我想要达到的目标的正确方向吗?我的要求是否有误

提前谢谢

public bool CheckUserInGroup(string group)
    {
        string serverName = ConfigurationManager.AppSettings["ADServer"];
        string userName = ConfigurationManager.AppSettings["ADUserName"];
        string password = ConfigurationManager.AppSettings["ADPassword"];
        bool result = false;
        SecureString securePwd = null;
        if (password != null)
        {
            securePwd = new SecureString();
            foreach (char chr in password.ToCharArray())
            {
                securePwd.AppendChar(chr);
            }
        }
        try
        {  
            ActiveDirectory adConnectGroup = new ActiveDirectory(serverName, userName, securePwd);

            SearchResultEntry groupResult = adConnectGroup.GetEntryByCommonName(group);

            Group grp = new Group(adConnectGroup, groupResult);

            SecurityPrincipal userPrincipal = grp.Members.Find(sp => sp.SAMAccountName.ToLower() == User.Identity.Name.ToLower());

            if (userPrincipal != null)
            {
                result = true;
            }
        }
        catch
        {
            result = false;
        }
        return result;
    }

我相信有很多方法可以从C#MVC中检索广告用户。请使用GalacticAPI(免费开源软件包)看看这个好例子

要让用户自动登录,您需要使用Windows身份验证。要实现这一点,有几个先决条件:

  • 用户必须使用其用于向您的网站进行身份验证的帐户登录到Windows
  • 您的网站必须添加到Windows中Internet选项中的受信任站点(或视为“Intranet站点”),以便IE和Chrome自动发送凭据。Firefox有自己的设置,称为
    网络。协商身份验证。可信URI
  • 您的服务器必须加入到对用户域具有信任的域(通常是同一个域)
  • 如果所有这些都是真的,那么您可以按照说明在IIS中安装Windows身份验证功能(取决于您的版本)。如果您使用IIS Express在本地运行它,那么您可以在开发机器上跳过此步骤

    然后,通过修改web.config文件,在网站中启用Windows身份验证。将此添加到
    标记下:

    
    
    并将其添加到
    下:

    
    

    然后,只要浏览器信任您的网站(上面的步骤2),您就会自动登录。登录用户的用户名将是
    user.Identity.Name
    。您显示的所有代码都可以工作,但是您不需要调用
    System.Web.Hosting.HostingEnvironment.Impersonate()

    我不想指定连接到Active Directory的用户名和密码。我想获取当前登录到给定工作站的用户的配置电子邮件地址。然后使用该电子邮件地址/用户名在我的数据库中查找用户。Hi@Morgs,用于连接active directory的用户名和密码。您可以尝试要求网络人员为您的系统创建特定凭据。或者你可以看看这个。如果您在{上设置断点,
    User.Identity.Name
    的值是多少?@briansays>该值为空…在这里有相同的想法和相同的问题。我有一个问题理解为什么用户需要“重新登录”在经过身份验证后,从AD检索他自己的信息。请更新此线程。注意:我有一个通过LDAP的替代登录,在那里我可以获取所有用户信息(姓名、姓氏、电话、电子邮件、组等)。为什么我不能从IIS获取?