我正在尝试根据用户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错误,因为我无法证明我的代码有效(或无效)。
答案 0 :(得分:0)
根据文档https://docs.microsoft.com/en-us/graph/api/directoryrole-delete-member
您需要一个具有委托的Directory.AccessAsUser.All
权限的应用程序。您将需要管理员(具有正确的权限)登录到该应用程序。
设计不支持应用程序凭据(或客户端凭据流)。
如果某些管理员创建具有这些权限的应用程序,则可能会导致特权提升。如果随后将该管理员从管理员角色中删除,他将能够使用自己的应用程序再次成为自己的管理员