【发布时间】:2017-11-03 13:09:24
【问题描述】:
当我尝试访问图形服务客户端时收到错误消息:
代码: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;
}
【问题讨论】:
-
您具体添加了哪些权限?能发个截图吗?您需要的是应用程序权限来读取用户。
-
感谢您在应用程序权限下的建议,我选择了“读取和写入目录数据”,在委派权限下,我有“登录并读取用户个人资料”“真实所有用户的基本个人资料”和'以登录用户身份访问 firectory'。尽管为了在开发应用程序中进行测试,我选择了所有可用选项,但仍然出现身份验证错误。
-
委派权限对于此 API 调用无关紧要。您正在执行仅应用程序调用(指定客户端 ID 和密码)。您是否也授予了权限?您可以检查访问令牌内容,例如jwt.io
-
@juunas 我同意委派权限,我已经在此之上设置了应用程序权限(用于读取和写入目录数据) - 我刚刚用屏幕截图剪掉了标题。尝试授予权限时,我收到一条错误消息,指出“未能授予应用程序权限”。我猜这可能是问题所在?感谢您的帮助。
-
有时可能需要几分钟。最好的方法是检查 jwt.io 中的访问令牌。具体来说,查看令牌中的范围。你应该有类似 Directory.ReadWrite.All 的东西。
标签: c# azure permissions azure-active-directory azure-ad-graph-api