azure 尝试使用Graph API获取所有用户时遇到System.Text.Encoding.Web错误

z9gpfhce  于 2023-02-05  发布在  其他
关注(0)|答案(1)|浏览(116)

我一直在探索Azure和Graph API。我已经创建了两个应用程序,一个是MVC应用程序,另一个是Azure函数应用程序。当我尝试graphClient.Users.Request().GetAsync()时,我在MVC应用程序中获得数据,但我遇到了错误,如System.Text.Encoding.Web version=6.0.0.0 with Azure Function。然而,在函数应用程序中,如果我尝试像graphClient.Users[Id].Requests().GetAsync()这样的特定用户,我会得到数据。下面是我初始化和请求的代码片段。

clientId = Environment.GetEnvironmentVariable("ClientId");
tenantId = Environment.GetEnvironmentVariable("TenantId");
clientSecret = Environment.GetEnvironmentVariable("ClientSecret");

_clientApplication = ConfidentialClientApplicationBuilder.Create(clientId)
        .WithTenantId(tenantId)
        .WithClientSecret(clientSecret)
        .Build();

graphClient = new GraphServiceClient(new DelegateAuthenticationProvider(async (requestMessage) => {

    var authResult = await _clientApplication
        .AcquireTokenForClient(scopes)
        .ExecuteAsync();

    requestMessage.Headers.Authorization =
        new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
    })

var result = await graphClient.Users.Request().Top(100).GetAsync();

我的.NET版本是3.1,我使用的是最新的图形API,即4.5.0和Microsoft.NET.sdk版本。函数是3.1.1。我尝试使用过滤器,以避免任何内部可能导致我的问题,但这是没有用的。我尝试了我的测试用例在其他笔记本电脑与. net6,它是工作的预期。但是,我需要使用netcore3.1运行此问题。请帮助我解决此问题。

ars1skjm

ars1skjm1#

在您的代码片段中,我看到您使用了Graph SDK并生成了一个访问令牌。在我的拙见中,由于这是一个Azure功能,您应该添加User.Read.All应用程序API权限,然后使用客户端凭据流。您可以尝试下面的代码吗?
我创建了一个功能与门户网站的经验和代码如下:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using Azure.Identity;
using Microsoft.Graph;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    var scopes = new[] { "https://graph.microsoft.com/.default" };
    var tenantId = "xxx.onmicrosoft.com";
    var clientId = "azure_ad_app_id";
    var clientSecret = "client_secret";
    var clientSecretCredential = new ClientSecretCredential(
                    tenantId, clientId, clientSecret);
    var graphClient = new GraphServiceClient(clientSecretCredential, scopes);
    var users = await graphClient.Users.Request().GetAsync();
    return new OkObjectResult("hello");
}

我在kudo中创建了一个文件function.proj来添加引用。这里的运行时必须是netstandard2.0

<Project Sdk="Microsoft.NET.Sdk">  
    <PropertyGroup>  
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>  
    <ItemGroup>  
        <PackageReference Include="Microsoft.Graph" Version="4.51.0" />
        <PackageReference Include="Azure.Identity" Version="1.8.1" />
    </ItemGroup>  
</Project>

相关问题