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

Используя ASP.NET (C#), я установил Диспетчер авторизации, который позволяет мне обрабатывать роли на веб-сайте. Добавлять пользователей в роли просто Roles.AddUserToRole("DOMAIN\\UserName", "role"), Однако я хочу перечислить пользователей, принадлежащих к роли, но, поскольку они хранятся в виде идентификаторов безопасности, их отображение не будет таким уж полезным. Чтобы привлечь пользователей, я думаю, что XML придется использовать, хотя возможно ли использовать COM Interop, чтобы сделать это и получить имя пользователя? В любом случае, как я могу получить пользователей, принадлежащих к роли?

Таблица для управления ролями в основном будет выглядеть так:

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

3 ответа

Решение

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

Настройте роли, как описано в статье: Практическое руководство. Использование диспетчера авторизации (AzMan) с ASP.NET 2.0

В Visual Studio Project добавьте ссылку на библиотеку COM AzMan (библиотека типов 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);

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

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

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

Другие вопросы по тегам