AAD 中按用户 ID 查找用户失败

User lookup by user id failed in AAD

我正在尝试在 .NET 核心应用程序中使用 Microsoft.Graph.Beta SDK 创建 MS Teams 会议。我正在使用以下代码创建会议。

 static void Main(string[] args)
        {
            var clientId = "<Enter you Client ID here>";
            var tenantId = "<Enter your tenand ID here>";
            var clientSecret = "<Enter your client secret here>";
            var scopes = new string[] { "https://graph.microsoft.com/.default" };

            ///The client credential flow enables service applications to run without user interaction. 
            ///Access is based on the identity of the application.
            IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
            .Create(clientId)
            .WithTenantId(tenantId)
            .WithClientSecret(clientSecret)
            .Build();

            ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication);



            var onlinemeeting = CreateTeamsMeeting(authProvider).GetAwaiter().GetResult();


            Console.ReadLine();
        }


        public static async Task<OnlineMeeting> CreateTeamsMeeting(IAuthenticationProvider authProvider)
        {
            GraphServiceClient graphClient = new GraphServiceClient(authProvider);

            var onlineMeeting = new OnlineMeeting
            {
                StartDateTime = DateTimeOffset.Parse("2020-11-12T21:30:34.2444915+00:00"),
                EndDateTime = DateTimeOffset.Parse("2020-11-12T22:00:34.2464912+00:00"),
                Subject = "User Token Meeting",
            };

            return await graphClient.Me.OnlineMeetings
                .Request()
                .AddAsync(onlineMeeting);
        }

但是,在 运行 上面的代码中,我收到以下错误。

Server error: User lookup by user id failed in AAD. Client exception: Processing of the HTTP request resulted in an exception. Please see the HTTP response returned by the 'Response' property of this exception for details.

Inner error: AdditionalData: date: 2020-11-09T12:19:53 request-id: 02cd2168-d0d8-437a-9eee-117f1924a387 client-request-id: 02cd2168-d0d8-437a-9eee-117f1924a387 ClientRequestId: 02cd2168-d0d8-437a-9eee-117f1924a387

我们如何解决这个错误?

您已获得令牌作为应用程序,带有客户端凭据流。 这没有意义:

graphClient.Me.

“我”是谁? 通常,这是代表应用程序进行 API 调用的用户。 但是因为你获取了应用程序的令牌,所以没有用户。

您需要:

  1. 以用户身份获取令牌(不要使用客户端凭据)
  2. 使用不依赖于用户身份的 API(不确定 Teams 是否有)

@juusnas 的回答是正确的。我只是把我的评论整理在这里,方便大家参考。

您正在使用基于 Client credentials provider 的客户端凭据流。所以你应该使用 graphClient.Users["{user id/upn}"].OnlineMeetings.Request().AddAsync(onlineMeeting) 而不是 graphClient.Me.OnlineMeetings.Request().AddAsync(onlineMeeting).

而如果你想实现作为用户获取令牌,你应该选择Authorization code provider or Username/password provider。然后你可以继续使用 graphClient.Me.OnlineMeetings.Request().AddAsync(onlineMeeting).

权限错误,您需要在您的应用程序注册中添加应用权限(不是委托权限)OnlineMeetings.ReadWrite.All

并根据重要提示here, you also must create an application access policy允许应用程序代表用户访问在线会议。