C# 从使用AzureAD身份验证的ASP.net核心Web应用程序以身份验证用户身份调用Microsoft Graph API

C# 从使用AzureAD身份验证的ASP.net核心Web应用程序以身份验证用户身份调用Microsoft Graph API,c#,asp.net-core,asp.net-core-mvc,azure-active-directory,microsoft-graph-api,C#,Asp.net Core,Asp.net Core Mvc,Azure Active Directory,Microsoft Graph Api,我有一个Asp.NET核心MVC 2.2 WebApp,它使用Azure Active Directory登录用户,配置如下: public void ConfigureServices(IServiceCollection services){ //... services.AddAuthentication(AzureADDefaults.AuthenticationScheme) .AddAzureAD(options => configur

我有一个Asp.NET核心MVC 2.2 WebApp,它使用Azure Active Directory登录用户,配置如下:

public void ConfigureServices(IServiceCollection services){
    //...

    services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
            .AddAzureAD(options => configuration.Bind("AzureAd", options));

    //...
}
所有必需的信息都在appsettings.json(ClientID、TenantID、domain等)中配置,登录过程完美无误

现在,当用户在某个控制器中调用某个操作时,我想对MicrosoftGraphAPI进行一些调用。据我所知,由于我已经作为经过身份验证的AzureAD用户登录,这应该不是问题,因为我应该能够设置所需的
Delgated
权限,然后使用
GraphServiceClient
(来自
Microsoft.Graph
库)的实例进行调用:

[HttpGet("[action]")]
public IActionResult Test()
{
    GraphServiceClient graphClient = GetGraphServiceClient(); //HOW????

    //... make calls etc.

    return Ok("OK");
}
问题是,在在线搜索时,我完全不知道如何获取
GraphServiceClient
的已验证实例。我发现了几个示例,但都使用完全不同的方法,并且通常需要几十个额外的类和支持方法。真的有那么复杂吗

所以我的问题是,在我的场景中,调用Microsoft Graph API的最佳/最简单的方法是什么?重述:

  • 我需要在我的 控制器
  • 当呼叫结束时,用户将始终通过身份验证 并且在AzureAD中正确设置了委托权限 控制台,所以(理论上)所需要的只是获得一个工作状态 图形客户端

有人能提供最低限度的样本吗?

您可以像这样获得
GraphServiceClient

   var accessToken = "";
    var graphserviceClient = new GraphServiceClient(
    new DelegateAuthenticationProvider(
    (requestMessage) =>
    {
        requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
        return Task.FromResult(0);
    }));
这是你的参考资料

更新:

这就是为什么我问是否有更直接的方法

是的,有。您可以选择适当的身份验证提供程序来创建GraphServiceClient

GraphServiceClient graphClient = new GraphServiceClient(authProvider);

您可以像这样获得
GraphServiceClient

   var accessToken = "";
    var graphserviceClient = new GraphServiceClient(
    new DelegateAuthenticationProvider(
    (requestMessage) =>
    {
        requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
        return Task.FromResult(0);
    }));
这是你的参考资料

更新:

这就是为什么我问是否有更直接的方法

是的,有。您可以选择适当的身份验证提供程序来创建GraphServiceClient

GraphServiceClient graphClient = new GraphServiceClient(authProvider);

感谢您的回复,但现在问题变成了“如何获取accessToken?”。您链接的示例就是我以前使用的示例,它使用了相当多的额外类和方法(基本上您必须从Microsoft.Identity.Web导入整个源代码才能正常工作)。这就是为什么我问是否有更直接的方法。。。我想没有吧?谢谢你的支持,但这对我来说不起作用。我试过使用
OnBehalfOfProvider
(对于我的场景来说,它似乎是正确的),但是如果我尝试使用GraphServiceClient发出请求,它会在调用过程中抛出一个NullReferenceException,没有其他细节。感谢您的回复,但现在问题变成了“如何获取accessToken?”。您链接的示例就是我以前使用的示例,它使用了相当多的额外类和方法(基本上您必须从Microsoft.Identity.Web导入整个源代码才能正常工作)。这就是为什么我问是否有更直接的方法。。。我想没有吧?谢谢你的支持,但这对我来说不起作用。我已经尝试使用
OnBehalfOfProvider
(对于我的场景来说,它似乎是正确的),但是如果我尝试使用GraphServiceClient发出请求,它会在调用过程中抛出NullReferenceException,没有其他细节。差不多2年后,我发现自己也在想同样的事情:与
服务一起使用
GraphServiceClient
的代码示例在哪里
?差不多两年后,我发现自己也在想同样的事情:在
服务中使用
GraphServiceClient
的代码示例在哪里?