Azure功能Graph API权限不足

时间:2017-09-07 14:29:37

标签: azure-active-directory microsoft-graph

我在Azure中创建了一个C#函数,它看起来像这样:

slug

在我的日志中,我获得了持票人令牌。但是<a class="nav-link" href="{% url 'board:delete_post' slug=post.slug %}"> 的结果是错误的。 如果我通过邮递员发送请求,我会得到以下回复:

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 = "username@XXXXX.com";
    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;
    }
}

在Azure AD中,我创建了一个应用程序,权限是: Function with allowd Azure AD login

Permisions for function-app

(我给了所有的权利只是为了测试什么是错的)

1 个答案:

答案 0 :(得分: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;
    }
}