使用Graph API从目录角色中删除用户

时间:2019-06-20 16:19:04

标签: directory microsoft-graph roles credentials

我正在尝试根据用户ID从目录角色(来宾Inviter)添加和删除用户。我的客户端ID具有Microsoft Graph应用程序的Directory.AccessAsUserAll。我使用目录角色的ID和用户的ID。使用HTTP客户端调用(动词为DELETE),我使用Microsoft建议的格式,并获得“权限不足,无法完成操作”。错误。我可以成功执行其他功能

在我看来,我似乎很缺少某些东西。我认为您仍然使用客户端ID和客户端密钥登录,然后使用管理员类型的ID和密码进行操作,而不是仅基于这些凭据(因为为什么要链接它们)创建一个类似于模拟代码的新令牌,但是我不知道怎么做,似乎也找不到一个例子。

使用HTTPClient 动词删除

遵循此模式 删除/ directoryRoles / {id} / members / {id} / $ ref

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

使用C#创建承载令牌(带有客户端ID和客户端密钥),然后使用HTTPCLient,我根据建议的模式使用url字符串调用DeleteAsync。

我看到了需要为管理员角色的用户传递用户凭证的参考。

我认为问题在于缺少重要的东西。一旦使用外出租户的客户端ID和客户端密钥获得了承载令牌,就会调用此方法。

 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

我建立了一个包含属性的类,因此在使用客户端ID和客户端机密获取原始令牌后,输入的是全局管理员凭据,现在我收到了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 :(得分:0)

根据文档https://docs.microsoft.com/en-us/graph/api/directoryrole-delete-member 您需要一个具有委托的Directory.AccessAsUser.All权限的应用程序。您将需要管理员(具有正确的权限)登录到该应用程序。

设计不支持应用程序凭据(或客户端凭据流)。

如果某些管理员创建具有这些权限的应用程序,则可能会导致特权提升。如果随后将该管理员从管理员角色中删除,他将能够使用自己的应用程序再次成为自己的管理员