尝试使用我接收错误时访问图形服务客户端:
代码: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;
}
答案 0 :(得分:10)
答案 1 :(得分:9)
请参阅以下步骤:
从您的屏幕截图中,您似乎已授予Read and write directory data
(azure ad graph api)的Windows Azure Active Directory
申请权限。由于您使用的是Microsoft(https://graph.microsoft.com/),因此您需要为Microsoft Graph
授予应用程序权限:
由于您是AAD的管理员,您可以点击上面屏幕截图中显示的Grant permission
按钮,为组织中的用户授予权限。
然后您可以使用您的代码(客户端凭据流来获取令牌)并查询用户信息。如果您检查azure广告发布的访问令牌中的声明,则可以在Directory.Read.All
声明中找到roles
权限。
答案 2 :(得分:5)
对我来说,解决这个问题的关键是提示:
要将Graph API与B2C租户一起使用,您需要使用Azure门户中的通用应用程序注册菜单(所有服务并且默认情况下不是收藏星标)注册专用应用程序, NOT Azure AD B2C的“应用程序”菜单。您无法重用已在Azure AD B2C的“应用程序”菜单中注册的现有B2C应用程序。
上查找更多内容答案 3 :(得分:2)
在某些情况下,实际问题是因为我们使用“应用程序权限”而不是“委派权限”。在我的应用程序中,我尝试列出具有应用程序权限的所有用户,但它无法正常工作。当我切换到委派权限时,它可以工作。
因此,一些快速检查将是这样的:
希望这对某人有帮助。
答案 4 :(得分:1)
您的应用程序似乎没有足够的权限来访问AD信息。您可以按照以下链接/文章中提到的步骤登录Azure门户,查看您的应用程序是否具有访问AD的足够权限。
我也希望,&#34; authResult.AccessToken&#34;在你的情况下不是null。 有一点,上面的第二个链接是对AD的应用程序访问权限进行非常详细的说明。可能会对你有所帮助。
答案 5 :(得分:1)
假设您要在azure活动目录中创建组 我必须执行以下步骤来解决这个问题
答案 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
如果您的应用程序是很久以前创建的,则需要使用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.All
的 Application 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(根据需要)。最后,授予您租户的管理员同意
但是我还需要在“角色和管理员”中设置分配->搜索“用户管理员”->添加分配,然后在搜索框中,将已注册的应用程序名称放在搜索框中( WebApp是我的情况)。最后单击添加。它为应用程序分配了ServicePrincipal分配。