gpt4 book ai didi

azure - 尽管授予了权限,Graph API 仍不断返回 Authorization_RequestDenied

转载 作者:行者123 更新时间:2023-12-02 07:28:55 27 4
gpt4 key购买 nike

我们正在尝试使用图形 API 来设置由 Azure AD 管理的用户帐户的属性。这个想法是,在用户完成注册策略后,我们的后端 Web API 被调用(由 Azure AD)来设置用户无法自行设置的一些属性(例如新用户的内部客户 ID)。

不幸的是,当尝试发送更新用户的补丁请求时,Graph API 不断返回异常(“权限不足,无法完成此操作”)。我试图向所有用户授予管理员权限,因为更新帐户时没有用户登录。我基本上希望我的应用程序成为能够自动管理用户配置文件的第三方。

我的代码如下所示:

public class GraphAPIClient
{
private AuthenticationContext authContext;
private ClientCredential clientCredential;
private string adTenant;

public GraphAPIClient(string tenant, string clientID, string clientSecret)
{
authContext = new AuthenticationContext("https://login.microsoftonline.com/" + tenant);
clientCredential = new ClientCredential(clientID, clientSecret);
adTenant = tenant;
}

public async Task<string> UpdateUserInfo(string objectID, string jsonUpdate)
{
return await SendPatchRequest("/users/" + objectID, jsonUpdate);
}

private async Task<string> SendPatchRequest(string api, string jsonRequest)
{
AuthenticationResult authResult = await authContext.AcquireTokenAsync("https://graph.windows.net/", clientCredential);
HttpClient httpClient = new HttpClient();
string url = "https://graph.windows.net/" + adTenant + api + "?" + "api-version=1.6";

HttpRequestMessage request = new HttpRequestMessage(new HttpMethod("PATCH"), url);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
request.Content = new StringContent(jsonRequest, Encoding.UTF8, "application/json");

HttpResponseMessage response = await httpClient.SendAsync(request);
if(!response.IsSuccessStatusCode)
{
string error = await response.Content.ReadAsStringAsync();
object formattedError = JsonConvert.DeserializeObject(error);
throw new Exception("Graph API request failed:\n" + JsonConvert.SerializeObject(formattedError, Formatting.Indented));
}

return await response.Content.ReadAsStringAsync();
}
}

我使用已注册应用程序的应用程序 ID、目录的租户以及我在 Azure 中生成的 key 作为客户端 key 。我成功收到 token 。

我尝试过的:

  • 我已设置(或者我认为我拥有)编辑用户所需的权限。我使用管理员帐户单击“授予权限”,在 Azure 面板中查看权限时会显示权限: Image
  • 我已设置“读取和写入所有用户的完整个人资料”和“读取和写入目录数据”。这些权限适合此类任务吗?
  • 我还尝试使用新的应用程序注册控制台,但在尝试获取 token 时出现“无法建立调用应用程序的身份”异常。在此控制台中创建的应用程序在普通的 Azure AD 面板中不可见。

有人可以帮我解决这个问题吗?我已经彻底搜索过,但有关此问题的大多数问题都较旧,建议使用旧的 Azure 面板。我已经尝试过,但仍然不起作用,我认为新的 Azure 面板最近才获得 AD 编辑功能,并且在提出这些问题时并没有这些功能。

非常感谢您 - 如果您需要更多信息,我很乐意提供。

最佳答案

您的场景和代码都反射(reflect)了客户端凭据流程和应用程序权限的使用。但是,Azure 门户的屏幕截图仅显示已设置的委派权限。

根据您想要的权限/操作类型,您可以利用两种方法:

  1. 最简单的设置,但权限集有限:通过 Azure 门户。确保从“应用程序权限”中选择权限,然后单击授予权限。如果没有显示,那是因为您已将应用程序创建为 native 应用程序。对于将安全地位于服务器端(而不是交给最终用户)的 headless 客户端,您应该选择 Web 应用程序/API,它将使您能够访问应用程序权限:

    Application permissions in Azure Portal

  2. 最难设置但最广泛的权限集:通过 PowerShell。如果您希望能够删除用户,这是唯一可行的选择。您需要获取应用程序的 ServicePrincipalID,然后向服务主体授予所需的角色,如下所示:

    $appDisplayName = <Your-app-display-name>

    $msolcred = Get-Credential
    Connect-MsolService -credential $msolcred

    $servicePrincipal = Get-MsolServicePrincipal | where DisplayName -eq $appDisplayName
    $objectId = $servicePrincipal.ObjectId.ToString()

    Add-MsolRoleMember -RoleObjectId 88d8e3e3-8f55-4a1e-953a-9b9898b8876b -RoleMemberObjectId $objectId -RoleMemberType servicePrincipal
    Add-MsolRoleMember -RoleObjectId 9360feb5-f418-4baa-8175-e2a00bac4301 -RoleMemberObjectId $objectId -RoleMemberType servicePrincipal
    Add-MsolRoleMember -RoleObjectId fe930be7-5e62-47db-91af-98c3a49a38b1 -RoleMemberObjectId $objectId -RoleMemberType servicePrincipal

    或者,您可以按照 this article. 中的步骤操作。

关于azure - 尽管授予了权限,Graph API 仍不断返回 Authorization_RequestDenied,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43583384/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com