【问题标题】:Get list of users belonging to a role using Authorization Manager (AzMan)使用授权管理器 (AzMan) 获取属于某个角色的用户列表
【发布时间】:2010-04-08 11:46:08
【问题描述】:

使用 ASP.NET (C#) 我设置了授权管理器以允许我处理网站上的角色。将用户添加到角色很简单Roles.AddUserToRole("DOMAIN\\UserName", "role")。但是,我想列出属于某个角色的用户,但由于它们存储为 SID,因此显示它们不会有太大帮助。为了获得用户,我认为必须使用 XML,尽管是否可以使用 COM Interop 来做到这一点并获取用户名?无论哪种方式,我怎样才能获得属于某个角色的用户?

管理角色的表格基本上是这样的:

Role    User
----    ----
admin   DOMAIN\UserName [delete]
        DOMAIN\UserName2 [delete]
        [add user text box]
news    DOMAIN\UserName3 [delete]
        [add user text box]

【问题讨论】:

    标签: c# asp.net authorization azman authorizationmanager


    【解决方案1】:

    找到了一种方法(IAzRole 接口,感谢 Bermo),循环遍历每个角色的 MembersName 属性。无需映射回 Windows 帐户,除非您需要获取的不仅仅是用户名。

    设置角色详见文章:How To: Use Authorization Manager (AzMan) with ASP.NET 2.0

    在 Visual Studio 项目中添加对 AzMan COM 库(azroles 1.0 类型库)的引用。然后添加using AZROLESLib;。添加<form id="form1" runat="server">,然后在Page_Load中:

    AzAuthorizationStoreClass AzManStore = new AzAuthorizationStoreClass();
    string connString = ConfigurationManager.ConnectionStrings["AuthorizationServices"].ConnectionString;
    string path = Server.MapPath(connString.Substring("msxml://".Length));
    AzManStore.Initialize(0, "msxml://" + path, null);
    IAzApplication azApp = AzManStore.OpenApplication("AppName", null);
    PlaceHolder p = new PlaceHolder();
    StringBuilder sb = new StringBuilder();
    sb.Append("<ul>");
    foreach (IAzRole role in azApp.Roles)
    {
        sb.Append("<li>");
        sb.Append(role.Name);
        sb.Append("<ul>");
        foreach (object member in (object[])role.MembersName)
        {
            sb.Append("<li>");
            sb.Append(member);
            sb.Append("</li>");
        }
        sb.Append("</ul>");
        sb.Append("</li>");
    }
    sb.Append("</ul>");
    p.Controls.Add(new LiteralControl(sb.ToString()));
    form1.Controls.Add(p);
    

    这会显示每个角色中的角色和成员列表。

    【讨论】:

      【解决方案2】:

      如果您将 Azman 角色信息存储在 XML 文件中,您应该能够使用 XPath 获取包含每个角色的授权用户的 SID 列表(尽管可能是使用 LINQ2XML 的好机会......):

      <AzAdminManager MajorVersion="2" MinorVersion="0" Description="My application">
       <AzApplicationGroup Name="Admin" Description="" GroupType="Basic">
        <BizRuleLanguage /> 
        <Member>S-1-5-21-3124078386-165137298-1092301467-1001</Member> 
        <Member>S-1-5-21-3124078386-165137298-1092301467-1003</Member> 
       </AzApplicationGroup>
       <AzApplicationGroup Name="Users" Description="" GroupType="Basic">
        <BizRuleLanguage /> 
        <Member>S-1-5-21-3124078386-165137298-1092301467-501</Member> 
       </AzApplicationGroup>
      </AzAdminManager>
      

      以下帖子展示了将 SID 映射回 Windows 帐户的多种方法 - How can I convert from a SID to an account name in C#

      【讨论】:

      • 那么 AzMan 没有内置反向查找,即 XPath 和 LDAP 查询是唯一的方法?
      • 虽然我无法验证它是否有效,但我注意到 IAzRole 接口有一个 MembersName 属性。 COM doco 表示它会为您进行反向查找 - msdn.microsoft.com/en-us/library/aa378219(v=VS.85).aspx
      【解决方案3】:

      请注意,角色成员可以是 AD 组。因此,您不能仅通过查看角色成员来枚举所有用户。您还需要查询 AD。

      【讨论】:

        猜你喜欢
        • 2010-12-10
        • 2011-10-24
        • 2020-11-12
        • 1970-01-01
        • 2013-08-07
        • 2017-01-28
        • 1970-01-01
        • 2015-04-21
        • 1970-01-01
        相关资源
        最近更新 更多