图形API - 没有足够的权限来完成操作

时间:2017-06-02 07:49:49

标签: c# azure permissions azure-active-directory azure-ad-graph-api

尝试使用我接收错误时访问图形服务客户端:

  

代码:Authorization_RequestDenied
  消息:没有足够的权限来完成操作。

在研究此错误后,最常见的解决方案是设置API的权限。这已经完成,并具有读取基本/完整配置文件的权限。

我删除并重新添加了API。

以下是AzureAuthenticationProvider类中继承自IAuthenticationProvider的代码:

public class AzureAuthenticationProvider : IAuthenticationProvider
{
    private string _azureDomain = "myDevDom.onmicrosoft.com";

    public async Task AuthenticateRequestAsync(HttpRequestMessage request)
    {
        try
        {
            string clientId = "2b823c67-1b0d-4a10-a9e1-737142516f5q";
            string clientSecret = "xxxxxx";

            AuthenticationContext authContext = new AuthenticationContext("https://login.windows.net/" + _azureDomain + "/oauth2/token");

            ClientCredential credentials = new ClientCredential(clientId, clientSecret);

            AuthenticationResult authResult = await authContext.AcquireTokenAsync("https://graph.microsoft.com/", credentials);

            request.Headers.Add("Authorization", "Bearer " + authResult.AccessToken);
        }
        catch (Exception ex)
        {
        }
    }
}

我已尝试将客户端密码更改为无效的ID并且它引发了错误,因此客户端密钥是正确的。我还尝试通过更改访问令牌来验证访问令牌是否有效,这也会返回错误。

上面的代码似乎工作正常。

以下是我尝试访问Azure AD的代码:

public async Task<IGraphServiceUsersCollectionPage> GetUsersByLastName(string lastname)  
{
    GraphServiceClient graphClient = new GraphServiceClient(new AzureAuthenticationProvider());
    string filter = String.Format("startswith(surname, '{0}')", lastname);
    IGraphServiceUsersCollectionPage users = await graphClient.Users.Request().Filter(filter).GetAsync(); //Fails on this line
    return users;
}

非常感谢任何帮助,并提前感谢您的帮助。 azureADpermissionProperties

9 个答案:

答案 0 :(得分:10)

Grant permission 确保点击“授予权限”,然后点击所有用户帐户的“是”。

答案 1 :(得分:9)

请参阅以下步骤:

  1. 从您的屏幕截图中,您似乎已授予Read and write directory data(azure ad graph api)的Windows Azure Active Directory申请权限。由于您使用的是Microsoft(https://graph.microsoft.com/),因此您需要为Microsoft Graph授予应用程序权限: enter image description here

  2. 由于您是AAD的管理员,您可以点击上面屏幕截图中显示的Grant permission按钮,为组织中的用户授予权限。

  3. 然后您可以使用您的代码(客户端凭据流来获取令牌)并查询用户信息。如果您检查azure广告发布的访问令牌中的声明,则可以在Directory.Read.All声明中找到roles权限。

答案 2 :(得分:5)

对我来说,解决这个问题的关键是提示:

要将Graph API与B2C租户一起使用,您需要使用Azure门户中的通用应用程序注册菜单(所有服务并且默认情况下不是收藏星标)注册专用应用程序, NOT Azure AD B2C的“应用程序”菜单。您无法重用已在Azure AD B2C的“应用程序”菜单中注册的现有B2C应用程序。

在页面AD B2C aPI access demo

上查找更多内容

答案 3 :(得分:2)

在某些情况下,实际问题是因为我们使用“应用程序权限”而不是“委派权限”。在我的应用程序中,我尝试列出具有应用程序权限的所有用户,但它无法正常工作。当我切换到委派权限时,它可以工作。

因此,一些快速检查将是这样的:

  1. 检查您是否使用 Microsoft Graph API 或其他
  2. 使用委派权限
  3. 点击授予权限按钮以传播权限:)
  4. 希望这对某人有帮助。

答案 4 :(得分:1)

您的应用程序似乎没有足够的权限来访问AD信息。您可以按照以下链接/文章中提到的步骤登录Azure门户,查看您的应用程序是否具有访问AD的足够权限。

http://www.morgantechspace.com/2016/01/graph-api-insufficient-privileges-to-complete-the-operation.html

https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet

我也希望,&#34; authResult.AccessToken&#34;在你的情况下不是null。 有一点,上面的第二个链接是对AD的应用程序访问权限进行非常详细的说明。可能会对你有所帮助。

答案 5 :(得分:1)

假设您要在azure活动目录中创建组 我必须执行以下步骤来解决这个问题

  1. AD&gt; App注册&gt;你的应用
  2. 选择所需权限
  3. 单击“添加”并选择“Microsoft Graph”并添加
  4. 选择Microsoft Graph
  5. 选择从委派权限列表中读取和写入所有组
  6. 并保存
  7. 选择Windows Azure Active Directory并授予所有应用程序权限
  8. 保存

答案 6 :(得分:0)

通过勾选“ Directory.Read.All / Write”来授予权限是不够的。

我遇到了同样的问题。并通过在管理员角色中添加服务原理来解决。

如果应用程序是最近创建的,则可以通过Azure AD Powershell完成。

$pricinple = Get-AzureADServicePrincipal || Where-Object {$_.DisplayName -eq 'youappname'}

 $role = Get-AzureADDirectoryRole | Where-Object {$_.displayName -eq 'Company Administrator'}

Add-AzureADDirectoryRoleMember -ObjectId $role.ObjectId -RefObjectId $pricinple.ObjectId

有关详细信息,请参见https://docs.microsoft.com/en-us/powershell/module/Azuread/Add-AzureADDirectoryRoleMember?view=azureadps-2.0

如果您的应用程序是很久以前创建的,则需要使用MSOnline。 参见:https://docs.microsoft.com/en-us/powershell/module/msonline/Add-MsolRoleMember?view=azureadps-1.0

答案 7 :(得分:0)

我正在使用 Credentials flow https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow 我的问题是设置 Delegate Permissions 而不是 Application Permission

我无法获得用户,因为我没有使用来自 User.Read.AllApplication Permissions https://docs.microsoft.com/en-us/graph/api/user-get?view=graph-rest-1.0&tabs=http

Application User.Read.All, User.ReadWrite.All, Directory.Read.All, Directory.ReadWrite.All

答案 8 :(得分:-3)

不需要授予权限,应用程序注册-> YourApp-> API权限-> +添加权限-> Microsoft Graph->复制权限-> Directory.Read.All和 Directory.ReadWrite.All(根据需要)。最后,授予您租户的管理员同意

Directory.Read.. permission

Grant Admin consent

但是我还需要在“角色和管理员”中设置分配->搜索“用户管理员”->添加分配,然后在搜索框中,将已注册的应用程序名称放在搜索框中( WebApp是我的情况)。最后单击添加。它为应用程序分配了ServicePrincipal分配。

Admin assigment