【问题标题】:Accessing Active Directory in ASP.NET?在 ASP.NET 中访问 Active Directory?
【发布时间】:2008-12-08 19:44:36
【问题描述】:

我使用控制台应用程序编写了一些测试代码:

    /// <summary>
    /// Returns AD information for a specified userID.
    /// </summary>
    /// <param name="ntID"></param>
    /// <returns></returns>
    public ADUser GetUser(string ntID)
    {            
        DirectorySearcher search = new DirectorySearcher();         
        search.Filter = String.Format("(cn={0})", ntID);
        
        search.PropertiesToLoad.Add("mail");
        search.PropertiesToLoad.Add("givenName");
        search.PropertiesToLoad.Add("sn");
        search.PropertiesToLoad.Add("displayName");
        search.PropertiesToLoad.Add("userPrincipalName");            
        search.PropertiesToLoad.Add("cn");

        SearchResult result = search.FindOne();

        return new ADUser(result);
    }

这在控制台应用程序中运行良好。但是,当我将其移至 ASP.NET 应用程序时,我收到一条关于不知道正确域的错误消息。

在 ASPNET 帐户上运行时访问 AD 是否缺少技巧?

编辑:仅传递 LDAP://domain 连接字符串是不够的,因为它需要一个实际的登录名/密码。因为它在机器上的本地帐户上运行,所以我不确定要使用什么 AD L/P。我可以以某种方式将访问用户帐户委托给它吗?

编辑 #2:当尝试使用身份模拟时,我收到了 DirectoryServicesCOMException:

身份验证机制未知。

【问题讨论】:

    标签: asp.net active-directory credentials


    【解决方案1】:

    是的。您需要给它一个目录连接字符串。控制台应用程序(以您的身份运行)使用您的凭据运行,包括目录访问权限。 ASP.NET 应用程序使用 ASPNET 用户的凭据运行,这些凭据是运行应用程序的系统本地的,而不是目录全局的。

    【讨论】:

      【解决方案2】:

      如果它是一个使用 Windows 身份验证的 Intranet 应用程序,那么您可以将您的 AD 调用包装在用户的模拟上下文中。

      类似:

      using (((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate())
      {
          // Do your AD stuff here
      }
      

      【讨论】:

      • 这是从库而不是页面调用的,那么我将如何访问用户?
      • 我附近没有视觉工作室来测试它。但如果我没记错的话,那么 System.Threading.Thread.CurrentPrincipal.Identity 应该包含完全相同的 Identity。
      • Edit #2 让我认为 System.Threading.Thread.CurrentPrincipal.Identity.Name 不包含预期的域\用户名,对吗?
      • 实际上,我无法将 System.Thrading.Thread.CurrentPrincipal.Identity 转换为 WindowsIdentity。我只是尝试在 web.config 中使用“impersonate=true”。
      • 啊,好吧。听起来您当时还没有为 IIS 中的 Web 应用程序打开 Windows 身份验证。如果它打开,那么我没有想法。
      【解决方案3】:

      或者,您可以在 web.config 中指定身份 impersonate=true 并且对 Active Directory 的请求将作为调用用户而不是 Machine\ASPNET 发送

      编辑:如果您遇到身份验证错误,请参阅 PIPTHEGEEK 的帖子,您将不得不信任您的 Web 服务器进行委托,但是要小心信任委托(因为它会为安全类型打开另一个蠕虫罐)。您必须允许 Web 服务器将当前用户的凭据传递给 AD。

      如果可能,请转到计算机的 AD 属性,选择委派选项卡,然后选择“信任此计算机以委派给任何服务(仅限 Kerberos)

      看看这是否有效。如果是这样,您可以使用第三个选项进一步细化权限

      “仅信任此计算机以委派指定的服务”

      然后选择“仅使用 Kerberos”

      并在“此账户可以出示委托凭证的服务”中,添加相关服务信息。

      【讨论】:

        【解决方案4】:

        解决此问题的最简单方法是让您的 Web 应用程序池作为具有所需访问权限的域帐户运行。这避免了您必须管理密码的安全存储。不要忘记使该帐户成为 IIS_WPG 本地组的成员。 如果您决定使用模拟,则必须配置 Kerberos 委派以及将 ASP.NET 配置更改为模拟。这将涉及使应用程序池作为域帐户运行,授予该域帐户委派凭据的权限(AD 用户和计算机 MMC 中帐户属性的委派选项卡)。然后确保网站设置为在元数据库中使用 negoiate(这是 IIS6 上的默认设置,不确定其他版本)并为新域帐户注册 SPN。

        编辑:您的“未知身份验证”错误听起来像是委派配置错误。检查您的应用程序池正在运行的帐户是否受委派信任、IIS 是否设置为仅使用 windows 身份验证以及是否为应用程序池身份帐户注册了有效的 SPN。

        【讨论】:

          【解决方案5】:

          您也可以尝试在登录中包含域

          adSharepointUsers = new DirectoryEntry("LDAP://MyDomain","MyDomain/ADUser","password");
          

          【讨论】:

          • 令人惊讶的是(对我来说),这个建议解决了我的问题。如果登录中没有域,我会收到“身份验证机制未知”错误。将域添加到用户名修复它。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多