Active Directory PrincipalContext доступ запрещен при публикации в IIS - PullRequest
0 голосов
/ 10 марта 2020

У нас есть. NET Core 2.2 Web Api, который использует Windows аутентификацию. Мы хотели бы создать страницу, на которой разные администраторы могут go входить и добавлять / удалять пользователей для указанных c групп AD. Мы не можем использовать служебную учетную запись или общую учетную запись c, поскольку в зависимости от того, кто вошел в систему, они смогут управлять различными группами.

Проблема в том, что когда я публикую sh в IIS, это удостоверение AppPools, которое обращается к AD, и ему отказывают. Как я могу сделать запрос к серверу LDAP как зарегистрированный пользователь, поскольку. NET Core не поддерживает олицетворение?

public UserApiModel AddGroupMember(string networkId, string groupName)
{
    using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "DOMAIN"))
    {
        GroupPrincipal group = GroupPrincipal.FindByIdentity(pc, groupName);
        var canAdd = true;
        var currentUsers = group.GetMembers();

        foreach (var groupUser in currentUsers)
        {
            if (groupUser.SamAccountName == networkId)
            {
                canAdd = false;
                break;
            }
        }

        if (canAdd)
        {
            var usr = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, networkId);

            if (usr != null)
            {
                group.Members.Add(pc, IdentityType.SamAccountName, "DOMAIN\\" + networkId);
                group.Save();

                return new UserApiModel
                    {
                        NetworkId = usr.SamAccountName,
                        Name = usr.DisplayName
                    };
            }
            else
                return null;
        }

        return null;
    }
}

1 Ответ

0 голосов
/ 10 марта 2020

ASP. NET Ядро не поддерживает олицетворение в том смысле, что вы не можете заставить его автоматически обрабатывать весь запрос под учетными данными пользователя с параметром web.config, как в ASP. NET .

Однако вы можете выдать себя за указанный блок кода c, используя WindowsIdentity.RunImpersonated(). В документации по Windows Аутентификация есть раздел Олицетворение , который описывает это.

Это будет выглядеть примерно так (в контроллере, где доступен HttpContext):

var userToImpersonate = (WindowsIdentity) HttpContext.User.Identity;

WindowsIdentity.RunImpersonated(userToImpersonate.AccessToken, () =>
{
    // Any code in here will run as the impersonated user
});
...