私はアズールでのC#関数を作成して、それは次のようになります。私は、ベアラトークンを取得し、私のログでAzureの機能をグラフAPI権限が不十分
using System;
using System.Net;
using System.Net.Http.Headers;
using System.Collections.Specialized;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Newtonsoft.Json;
using System.Text;
using Newtonsoft.Json.Linq;
public static async void Run(string input, TraceWriter log)
{
log.Info("---- Gestartet ----");
var token = await HttpAppAuthenticationAsync();
log.Info("---- Token: " + token.ToString());
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var user = "[email protected]";
var userExists = await DoesUserExistsAsync(client, user, log);
if(userExists)
{
log.Info("Der Benutzer existiert.");
}
else {
log.Info("Benutzer nicht gefunden.");
}
}
public static async Task<string> HttpAppAuthenticationAsync()
{
//log.Info("---- Start ----");
// Constants
var tenant = "2XXXXXCC6-c789-41XX-9XXX-XXXXXXXXXX";
var resource = "https://graph.windows.net/";
var clientID = "5XXXXef-4905-4XXf-8XXa-bXXXXXXX2";
var secret = "5GFzeg6VyrkJYUJ8XXXXXXXeKbjYaXXX7PlNpFkkg=";
var webClient = new WebClient();
var requestParameters = new NameValueCollection();
requestParameters.Add("resource", resource);
requestParameters.Add("client_id", clientID);
requestParameters.Add("grant_type", "client_credentials");
requestParameters.Add("client_secret", secret);
var url = $"https://login.microsoftonline.com/{tenant}/oauth2/token";
var responsebytes = await webClient.UploadValuesTaskAsync(url, "POST", requestParameters);
var responsebody = Encoding.UTF8.GetString(responsebytes);
var obj = JsonConvert.DeserializeObject<JObject>(responsebody);
var token = obj["access_token"].Value<string>();
//log.Info("HIER: " + token);
return token;
}
private static async Task<bool> DoesUserExistsAsync(HttpClient client, string user, TraceWriter log)
{
log.Info("---- Suche Benutzer ----");
try
{
var payload = await client.GetStringAsync($"https://graph.microsoft.net/v1.0/users/user");
return true;
}
catch (HttpRequestException)
{
return false;
}
}
。しかし、DoesUserExistsAsync
の結果はfalseです。 私は次の応答を取得トークンでポストマンを経由してリクエストを送信する場合:AzureのADに
{
"error": {
"code": "Authorization_RequestDenied",
"message": "Insufficient privileges to complete the operation.",
"innerError": {
"request-id": "10XXX850-XXX-4d72-b6cf-78X308XXXXX0",
"date": "2017-09-07T14:03:58"
}
}
}
を私はアプリケーションを作成し、権限は次のとおりです。
(私が与えましたすべてのパーミッションは何が間違っているかをテストするためだけです)
同意が本当にただのサービスにそれらの「役割」を割り当て、プリンシパル:)これらのAppRoleAssignmentsを作成するには、ディレクトリへの管理アクセスがかなり必要です。また、アプリケーションに*ロール/パーミッションが必要であることを指定することは、実際にパーミッションを付与することとは別物です。 – juunas
優れたポイントとフェアな補正。私はしばしばサービスのディシパルに行き、役割はADの背景を持たない人々を混乱させることになります。特に、最後にグラフを取得してデータを返すだけの場合:-) –
あなたの答えはそれなりのものですが、好奇心が強い場合に備えて拡張したいと考えています。 – juunas