2017-09-07 24 views
1

私はアズールでの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" 
     } 
    } 
} 

を私はアプリケーションを作成し、権限は次のとおりです。 Function with allowd Azure AD login

Permisions for function-app

(私が与えましたすべてのパーミッションは何が間違っているかをテストするためだけです)

答えて

1

client_credentialsを使用しているので、「ユーザ」はありません。そのOAUTH認可は、実際のユーザーではなく、アプリケーションのみを認証します。

client_credentialsを使用する場合は、「アプリケーションのアクセス許可」に記載されているスコープのみが適用されます。あなたは認証されたユーザーを持っていないので、あなたのアプリに "委任"するユーザーはいません。

アプリケーションのアクセス許可は、アプリケーションが使用する前にすべてがAdmin Consentを必要とするという点でもユニークです。同意がない場合、アプリケーションにはの操作を完了するための十分な特権がありません。操作。

また、この呼び出しは何も返しません。

await client.GetStringAsync($"https://graph.microsoft.net/v1.0/users/user"); 

私はあなたが本当に探しているものと仮定している:

private async Task<bool> DoesUserExistsAsync(HttpClient client, string userPrincipalName, TraceWriter log) 
{ 
    log.Info("---- Suche Benutzer ----"); 
    try 
    { 
     var payload = await client.GetStringAsync($"https://graph.microsoft.net/v1.0/users/" 
                + userPrincipalName); 
     return true; 
    } 
    catch (HttpRequestException) 
    { 
     return false; 
    } 
} 
+1

同意が本当にただのサービスにそれらの「役割」を割り当て、プリンシパル:)これらのAppRoleAssignmentsを作成するには、ディレクトリへの管理アクセスがかなり必要です。また、アプリケーションに*ロール/パーミッションが必要であることを指定することは、実際にパーミッションを付与することとは別物です。 – juunas

+0

優れたポイントとフェアな補正。私はしばしばサービスのディシパルに行き、役割はADの背景を持たない人々を混乱させることになります。特に、最後にグラフを取得してデータを返すだけの場合:-) –

+0

あなたの答えはそれなりのものですが、好奇心が強い場合に備えて拡張したいと考えています。 – juunas

関連する問題