Ошибка с методом UserPrincipal.GetAuthorizationGroups () - PullRequest
9 голосов
/ 04 августа 2010

У меня проблема с использованием метода GetAuthorizationGroups класса UserPrincipal в веб-приложении.

Используя следующий код, я получаю сообщение «При попытке получить группы авторизации произошла ошибка (5)»

PrincipalContext context = new PrincipalContext(ContextType.Domain, null, "DC=MyCompany,DC=COM", "username", "password");
UserPrincipal p = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "joe.blogs");
var groups = p.GetAuthorizationGroups();

Я считаю, что этот код работает до определенной степени.

  • Когда я просматриваю объект контекста, я вижу, что сервер и имя пользователя / пароль были правильно разрешены в объекте
  • Когда я просматриваю объект p, я вижу, что данные AD были заполнены, как номер телефона и т. Д.

Вот трассировка стека от ошибки.

[PrincipalOperationException: While trying to retrieve the authorization groups, an error (5) occurred.]
   System.DirectoryServices.AccountManagement.AuthZSet..ctor(Byte[] userSid, NetCred credentials, ContextOptions contextOptions, String flatUserAuthority, StoreCtx userStoreCtx, Object userCtxBase) +317279
   System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOfAZ(Principal p) +441
   System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroupsHelper() +78
   System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroups() +11

Если удалить имя пользователя и пароль из конструктора PrincipalContext и изменить пул приложений (в iis7) для запуска под тем же пользователем (username@mycompany.com) - работает следующий код.

PrincipalContext context = new PrincipalContext(ContextType.Domain, null, "DC=MyCompany,DC=COM");
UserPrincipal p = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "joe.blogs");
var groups = p.GetAuthorizationGroups();

Мне нужно, чтобы код в первом примере работал - я не хочу запускать пул приложений от имени пользователя домена только для того, чтобы этот код работал.

Ответы [ 3 ]

5 голосов
/ 21 февраля 2013

Я имел дело с этой же проблемой.Смотрите обсуждение аналогичного вопроса.https://stackoverflow.com/a/8347817/2012977

Решение ниже:

public List<GroupPrincipal> GetGroups(string userName)
    {
        var result = new List<GroupPrincipal>();
        PrincipalContext ctx = GetContext(); /*function to get domain context*/
        UserPrincipal user = UserPrincipal.FindByIdentity(ctx, userName);
        if (user != null)
        {
            PrincipalSearchResult<Principal> groups = user.GetAuthorizationGroups();

            var iterGroup = groups.GetEnumerator();
            using (iterGroup)
            {
                while (iterGroup.MoveNext())
                {
                    try
                    {
                        Principal p = iterGroup.Current;
                        result.Add((GroupPrincipal) p);
                    }
                    catch (PrincipalOperationException)
                    {
                        continue;
                    }
                }
            }
        }

        return result;
    }
2 голосов
/ 17 августа 2010

Ошибка 5 указывает ERROR_ACCESS_DENIED , что указывает на проблему, связанную с разрешениями. Тем не менее, следующий код только что работал для меня, работает на Windows 7 с веб-сайтом, работающим в качестве пула приложений по умолчанию:

Содержимое "тела" страницы .aspx:

<asp:GridView ID="GridView1" runat="server">
</asp:GridView>

Код-за:

protected void Page_Load(object sender, EventArgs e)
{
    var Context = new PrincipalContext(ContextType.Domain, "logon_domain", "username", "password");
    var principal = UserPrincipal.FindByIdentity(Context, "user_to_query");
    var groups = principal.GetAuthorizationGroups();

    GridView1.DataSource = groups;
    GridView1.DataBind();
}

В моем примере logon_domain был левым от domain_name\username, а не стилем спецификации домена, который вы использовали. Мое решение может или не может работать для вас. Если это не так, это указывает на проблему с разрешениями.

0 голосов
/ 03 декабря 2014

Пусть ваш администратор просмотрит учетную запись AD для пользователя, который возвращает код ошибки 5. Я столкнулся с этим сегодня, и это оказалось настройкой для учетной записи этого пользователя. Есть флажок для наследования настроек безопасности, которые не были проверены (все остальные пользователи были проверены). Это решило это для меня.

...