gpt4 book ai didi

active-directory - 在 Active Directory 中查找域名

转载 作者:行者123 更新时间:2023-12-04 07:09:58 26 4
gpt4 key购买 nike

我正在运行一个 ASP.NET 4.0 应用程序,它使用用户名(即 HttpContext.Current.Request.LogonUserIdentity.Name.ToString())来管理对各种组件的访问。

返回的用户名格式为“abc\jsmith”,其中“abc”是域名,“jsmith”是用户的登录名。

此应用程序的部分安全模块访问用户所属的 Active Directory 组(例如,“Accounting”、“AccountsPayable”、“AdminDepartment”)。我可以使用 DirectoryEntry.Properties(即 System.DirectoryServices.PropertyCollection”)“sAMAccountName”.Value 从 Active Directory 获取用户名。

到目前为止,一切都很好,但我希望能够跨多个域扩展应用程序,这意味着我需要能够在 Active Directory 中找到域名以及用户的登录名。我可以从 PrincipalContext 获得一个“域”值,但它返回的是“abcdc”,而不是“abc”。我可以假设这个属性总是在每个域的末尾返回“dc”(如“域 Controller ”)(在这种情况下我可以使用属性的子字符串),还是在其他地方我可以得到用户的当前域名?

最佳答案

我不清楚的一件事是您关于在域 Controller 中检索给定目录条目的域名的问题。我假设您有一台可以查看多个受信任域的服务器,并且用户可以从其中任何一个域登录到您的应用程序,这样您就不知道测试角色成员资格所需的域。

要通过 ADGroup 成员资格控制对功能的访问,您可以使用

HttpContext.Current.User.IsInRole("appdomain\groupname") 

其中 User.Identity.Name=="userdomain\user"。我不熟悉域信任问题,但这假设您可以将受信任域中的用户添加到您控制的域组中,因此您无需担心组域位置。

如果你不能,或者如果你在每个不同的域中有相同的组名,那么你可以做这样的事情吗?
HttpContext.Current.User.IsInRole(userDomainname + "\groupname")

几点:
  • 除非您已经建立了大型 AD 代码库,否则我建议您使用 System.DirectoryServices.AccountManagement 命名空间中的对象。
  • 我强烈推荐ADExplorer来自 Sysinternals 的实用程序,以获取您域的更多 LDAP View ,这通常有助于 LDAP 连接字符串和目录编程。
  • 如果您对互操作感到满意,并且需要执行任何 LDAP 连接字符串解析,请查看 site .
  • System.DirectoryServices.AccountManagement。 PrincipalContext.Container 和 System.DirectoryServices。 DirectoryEntry.Path 属性返回带有字符串末尾域的 LDAP 连接字符串(即 DC=mycompany,DC=com)
  • 不要忘记可信赖的旧 Environment.UserDomainName 和 Environment.UserName(它从当前执行的线程中获取 WindowsPrincipal;请参阅 表 1:线程暴露 CurrentPrincipal 对象 @ http://msdn.microsoft.com/en-us/library/Aa480475.aspx 以获得关于什么的好表当前用户在 asp.net 运行时内。)

  • ** 更新 2011 年 6 月 8 日下午 2:15**

    如果我正确理解 AD,用户的域是 AD 返回的用户对象的一个​​组成部分。扩展您的“Bob Newaccountant”示例...

    因此,鉴于以下 2 个域之间存在信任:
    1. "abcdc.com"
    CN=Users
    CN="Bob NewAccountant"
    2. "abc.com"
    CN=Users
    CN="Local User1"
    OU=Applications
    OU=MyApplication
    CN=ReportReaders (Members: abcdc\BNewAccountant, abc\luser1)

    给定以下查询,您应该获取用户的信息:
    //name parameter = domain
    //container parameter = distinguished name
    using(var ctx = new PrincipalContext(
    ContextType.Domain,
    name: "abc.com",
    container: "OU=MyApplication,OU=Applications,DC=abc,DC=com",
    "abc\serviceaccountname",
    "Password1"))
    {
    var officeGroup = GroupPrincipal.FindByIdentity(ctx,
    IdentityType.SamAccountName,
    "ReportReaders");

    foreach(Principal prin in officeGroup.GetMembers(recursive: true))
    {
    Console.WriteLine("DistinguishedName: " + prin.DistinguishedName
    + " UPN: " + prin.UserPrincipalName);
    }
    //Should result in
    // DistinguishedName: CN=luser1,CN=Users,DC=abc,DC=com UPN: luser1@abc.com
    // DistinguishedName: CN=BNewAccountant,CN=Users,DC=abcdc,DC=com UPN: BNewAccountant@abcdc.com
    }

    所以你应该可以通过 获取用户的域。尊贵姓名 用户主体名称 事件目录的属性。 (注意:我没有方便的双域设置,所以我现在无法测试上面的代码。)是不是越来越近了?

    关于active-directory - 在 Active Directory 中查找域名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6270069/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com