Azure active directory Azure函数图API权限不足

Azure active directory Azure函数图API权限不足,azure-active-directory,microsoft-graph-api,Azure Active Directory,Microsoft Graph Api,我在Azure中创建了一个C#函数,它如下所示: 使用系统; Net系统; 使用System.Net.Http.Header; 使用System.Collections.Specialized; 使用Microsoft.IdentityModel.Clients.ActiveDirectory; 使用Newtonsoft.Json; 使用系统文本; 使用Newtonsoft.Json.Linq; 公共静态异步无效运行(字符串输入,TraceWriter日志) { log.Info(“--Gest

我在Azure中创建了一个C#函数,它如下所示:

使用系统;
Net系统;
使用System.Net.Http.Header;
使用System.Collections.Specialized;
使用Microsoft.IdentityModel.Clients.ActiveDirectory;
使用Newtonsoft.Json;
使用系统文本;
使用Newtonsoft.Json.Linq;
公共静态异步无效运行(字符串输入,TraceWriter日志)
{
log.Info(“--Gestartet-->”);
var token=wait HttpAppAuthenticationAsync();
log.Info(“----Token:+Token.ToString());
var client=新的HttpClient();
client.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“承载者”,令牌);
变量用户=”username@XXXXX.com";
var userExists=wait DoesUserExistsAsync(客户端、用户、日志);
如果(用户存在)
{
log.Info(“Der Benutzer existiert.”);
}
否则{
log.Info(“Benutzer nicht gefunden”);
}
}
公共静态异步任务HttpAppAuthenticationAsync()
{
//log.Info(“----开始----”;
//常数
var tenant=“2XXXXXCC6-c789-41XX-9XXX-xxxxxxxxx”;
变量资源=”https://graph.windows.net/";
var clientID=“5xxxef-4905-4XXf-8XXa-bxxxxxx2”;
var secret=“5GFzeg6VyrkJYUJ8XXXXXXXeKbjYaXXX7PlNpFkkg=”;
var webClient=新的webClient();
var requestParameters=new NameValueCollection();
requestParameters.Add(“资源”,resource);
添加(“客户端id”,clientID);
添加(“授权类型”、“客户端凭据”);
requestParameters.Add(“client_secret”,secret);
var url=$”https://login.microsoftonline.com/{tenant}/oauth2/token”;
var responsebytes=wait webClient.UploadValuesTaskAsync(url,“POST”,requestParameters);
var responseByte=Encoding.UTF8.GetString(responsebytes);
var obj=JsonConvert.DeserializeObject(responsebody);
var token=obj[“访问令牌”].Value();
//日志信息(“HIER:+token”);
返回令牌;
}
专用静态异步任务DoesUserExistsAsync(HttpClient客户端、字符串用户、TraceWriter日志)
{
log.Info(“----Suche Benutzer----”;
尝试
{
var payload=await client.GetStringAsync($)https://graph.microsoft.net/v1.0/users/user");
返回true;
}
捕获(HttpRequestException)
{
返回false;
}
}
在我的日志中,我得到了不记名代币。但是,
doesurexistsasync
的结果是false。 如果我通过邮递员发送带有令牌的请求,我会得到以下响应:

{
“错误”:{
“代码”:“授权请求被拒绝”,
“消息”:“权限不足,无法完成操作。”,
“内部错误”:{
“请求id”:“10XXX850-XXX-4d72-b6cf-78x308xxxx00”,
“日期”:“2017-09-07T14:03:58”
}
}
}
在Azure广告中,我创建了一个应用程序,权限为:


(我给出的所有权限都只是为了测试问题所在)

因为您使用的是
客户端凭据,所以没有“用户”。OAUTH授权只验证您的应用程序,而不是实际用户

使用
客户端\u凭据时,只有“应用程序权限”下列出的范围才适用。由于您没有对用户进行身份验证,因此没有用户可以“委托”到您的应用程序

应用程序权限也是唯一的,因为在应用程序可以使用它们之前,每个应用程序都需要这些权限。未经同意,您的应用程序将没有足够的权限完成任何操作

此外,此呼叫不会返回任何内容:

wait client.GetStringAsync($)https://graph.microsoft.net/v1.0/users/user");
我想你真正想要的是:

private async Task doesurexistsasync(HttpClient-client,string-userPrincipalName,TraceWriter-log)
{
log.Info(“----Suche Benutzer----”;
尝试
{
var payload=await client.GetStringAsync($)https://graph.microsoft.net/v1.0/users/" 
+用户名);
返回true;
}
捕获(HttpRequestException)
{
返回false;
}
}

许可实际上只是将这些“角色”分配给服务主体:)这是必需的,因为创建这些许可几乎需要对目录的管理员访问权限。指定一个应用程序需要一个角色/权限与实际授予权限是两码事。这一点很好,也很正确。我经常发现当一名服务负责人和一个角色最终会让那些没有广告背景的人感到困惑。特别是如果最后,他们只是想让Graph返回一些数据。:-)同意,你的答案很好,只是想扩大范围以防有人好奇。