Удалить пользователя из роли каталога с помощью Graph API - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь добавлять и удалять пользователей из роли каталога (Guest Inviter) на основе идентификатора пользователя.Мой идентификатор клиента имеет Directory.AccessAsUserAll для приложения Microsoft Graph.Я использую идентификатор для роли каталога и идентификатор для пользователя.Используя клиентский вызов HTTP (глагол DELETE), я использую формат, предложенный Microsoft, и получаю «Недостаточно прав для завершения операции».ошибка.Я могу успешно выполнять другие функции

Мне кажется, что я что-то упустил.Я бы подумал, что вы по-прежнему входите в систему с помощью Client ID и Client Secret, а затем делаете что-то с ID и паролем типа администратора, а не просто создаете новый токен на основе этих учетных данных (потому что тогда зачем вам их связывать), аналогично коду олицетворения, но яне знаю, как и не могу найти пример того, как.

Использование HTTPClient Verb DELETE

по этому шаблону DELETE / directoryRoles / {id} / members / {id} / $ ref

https://docs.microsoft.com/en-us/graph/api/directoryrole-delete-member?view=graph-rest-1.0&tabs=cs

Используя C #, создающий токен носителя (с идентификатором клиента и секретом клиента), затем использующий HTTPCLient, я вызываю DeleteAsync, используя строку URL-адреса на основе рекомендуемого шаблона.

Я вижу ссылки на необходимость передачи учетных данных пользователя в роли администратора.

Я думаю, что проблема заключается в отсутствии чего-то важного.Это вызывается, как только токен носителя получен с использованием идентификатора клиента и секрета клиента для нашего арендатора.

 string delURL = $"{settings.RestUrl.value}{settings.RestVersion.value}/directoryRoles/{settings.GuestInviterRoleObjectID.value}/members/{user.id}/$ref";

                    HttpResponseMessage payload = await client.DeleteAsync(delURL);

                    Task<string> json = payload.Content.ReadAsStringAsync();

                    JObject o = new JObject();

                    if (json.Result.Length > 0)
                    {
                        o = JObject.Parse(json.Result);
                    }

Я хотел бы удалить пользователя из роли каталога Guest Inviter.Однако я получаю

error:  code:"authorization_requestDenied",
messsage: "Insufficient privileges to complete the operation"  ....

Обновление: я следовал этому примеру https://dzone.com/articles/getting-access-token-for-microsoft-graph-using-oau-2

Я создал класс, содержащий свойства, поэтому после получения моего исходного токена с использованием идентификатора клиента и секрета клиента затем выполняется подачав том, что мне сказали, были глобальные полномочия администратора, и теперь я получаю 401 несанкционированную ошибку.


string tURL = $"https://login.microsoftonline.com/{settings.TenantID.value}/oauth2/token";

using (System.Net.WebClient c = new System.Net.WebClient())
                    {
                        c.Headers["Authorization"] = $"Bearer {token}";
                        c.Headers["Content-Type"] = "application/x-www-form-urlencoded";

                        System.Collections.Specialized.NameValueCollection data = new System.Collections.Specialized.NameValueCollection();

                        body.GetType().GetProperties().ToList().ForEach(delegate (System.Reflection.PropertyInfo item)
                        {
                            data.Add(item.Name, item.GetValue(body) == null ? string.Empty : item.GetValue(body).ToString());
                        });


                        var res = await Task.Run(() => c.UploadValues(tURL, data));

                        Task.WaitAll();

                        if(res != null)
                        {
                           string response =  System.Text.Encoding.UTF8.GetString(res);
                        }
                    }

Data object
public class JSONBody
    {

        public string grant_type { get; set; }
        public string client_id { get; set; }
        public string client_secret { get; set; }
        public string resource { get; set; }
        public string username { get; set; }
        public string password { get; set; }

        public JSONBody()
        {
            this.grant_type = "password";
            this.resource = "https://graph.microsoft.com";
        }

    }

Я не могу доказать или опровергнуть ошибку 401, потому что я не могу доказать, что мой код работает (или нет).

1 Ответ

0 голосов
/ 23 июня 2019

Согласно документации https://docs.microsoft.com/en-us/graph/api/directoryrole-delete-member Вам потребуется приложение с делегированным разрешением Directory.AccessAsUser.All. Вам потребуется администратор для входа в это приложение (с правильными разрешениями).

Учетные данные приложения (или поток учетных данных клиента) не поддерживаются в соответствии с проектом.

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

...