Получить список пользователей, принадлежащих роли, с помощью диспетчера авторизации (AzMan)

Используя 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]

person SamWM    schedule 08.04.2010    source источник


Ответы (3)


Нашел способ сделать это (интерфейс IAzRole, спасибо Bermo), прокручивая свойство MembersName для каждой роли. Нет необходимости сопоставлять обратно с учетной записью Windows, если только вам не нужно получить больше, чем имя пользователя.

Настройте роли, как описано в статье: Как использовать диспетчер авторизации (AzMan) с 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);

Это отображает список ролей и членов в каждой роли.

person SamWM    schedule 12.04.2010

Если вы храните информацию о своей роли Azman в файле XML, вы должны иметь возможность получить списки SID, содержащие авторизованных пользователей для каждой роли, используя XPath (хотя, возможно, это хорошая возможность использовать 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 — Как преобразовать SID в имя учетной записи в C#.

person Bermo    schedule 08.04.2010
comment
Значит, тогда у AzMan не было встроенного обратного поиска, т. е. только запросы XPath и LDAP? - person SamWM; 09.04.2010
comment
Хотя я не могу проверить, работает ли он, я заметил, что интерфейс IAzRole имеет свойство MembersName. Документ COM указывает, что он выполняет обратный поиск для вас - msdn.microsoft.com/en-us/library/aa378219(v=VS.85).aspx - person Bermo; 09.04.2010

Обратите внимание, что членом роли может быть группа AD. Таким образом, вы не можете перечислить всех пользователей, просто взглянув на членов ролей. Вам также нужно будет запросить AD.

person Craig Fisher    schedule 10.06.2011