C# 无法使用GraphServiceClient创建具有应用程序标识的联机会议
我使用Azure AD中的应用程序标识,并授予读写权限,我还运行了Grant CsApplicationAccessPolicy,以便应用程序标识有权代表Azure AD中的真实用户标识创建在线会议 我知道我的设置与graph api中的get user一起工作。但是,在运行以下操作后,我遇到了错误:C# 无法使用GraphServiceClient创建具有应用程序标识的联机会议,c#,azure,microsoft-graph-api,microsoft-graph-teams,C#,Azure,Microsoft Graph Api,Microsoft Graph Teams,我使用Azure AD中的应用程序标识,并授予读写权限,我还运行了Grant CsApplicationAccessPolicy,以便应用程序标识有权代表Azure AD中的真实用户标识创建在线会议 我知道我的设置与graph api中的get user一起工作。但是,在运行以下操作后,我遇到了错误: var confidentialClient = ConfidentialClientApplicationBuilder .Create(
var confidentialClient = ConfidentialClientApplicationBuilder
.Create(clientId)
.WithAuthority($"https://login.microsoftonline.com/{tenantId}/v2.0")
.WithClientSecret(clientSecret)
.Build();
GraphServiceClient graphServiceClient =
new GraphServiceClient("https://graph.microsoft.com/beta", new DelegateAuthenticationProvider(async (requestMessage) =>
{
var authResult = await confidentialClient
.AcquireTokenForClient(scopes)
.ExecuteAsync();
requestMessage.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
})
);
var onlineMeeting = new OnlineMeeting
{
StartDateTime = DateTimeOffset.Parse("2020-12-25T21:30:34.2444915+00:00"),
EndDateTime = DateTimeOffset.Parse("2020-12-25T22:00:34.2464912+00:00"),
Subject = "User Token Meeting 1"
};
var meetingInstance = await graphServiceClient.Me.OnlineMeetings
.Request()
.AddAsync(onlineMeeting);
错误消息如下所示,为什么会说在AAD中按用户id查找用户失败
状态:未找到(404)
操作ID:8d06ff01-1dc3-49d1-9ced-9db6a919b162
客户关联ID:53b4478e-ba86-48ca-bb5b-25e5ef50c187
服务器错误:在AAD中按用户id查找用户失败
客户端异常:HTTP请求的处理导致异常。有关详细信息,请参阅此异常的“response”属性返回的HTTP响应
内部错误:
其他数据:
日期:2020-12-16T21:08:31
请求id:d60858cf-5ef5-4a0d-8d67-181f80ed6c35
客户请求id:d60858cf-5ef5-4a0d-8d67-181f80ed6c35
客户问题ID:d60858cf-5ef5-4a0d-8d67-181f80ed6c35
位于Microsoft.Graph.HttpProvider.SendAsync(HttpRequestMessage请求、HttpCompletionOption completionOption、CancellationToken CancellationToken)
位于Microsoft.Graph.BaseRequest.SendRequestAsync(对象serializableObject、CancellationToken CancellationToken、HttpCompletionOption completionOption)
在Microsoft.Graph.BaseRequest.SendAsync[T](对象serializableObject,CancellationToken CancellationToken,HttpCompletionOption completionOption)
在D:\VSTS\MSTeam\MSTeam\MSTeam\MSTeam\Program.cs中的MSTeam.Program.Main(字符串[]args)处:第62行是正确的
基于此:
使用应用程序令牌时请求:POST/users/{userId}/onlineMeetings
因此,您应该在此处使用graphServiceClient.Users[“{userId}”].OnlineMeetings
而不是graphServiceClient.Me.OnlineMeetings
userId
是用户的对象ID。当您选择时,您需要将策略授予用户:
Grant-CsApplicationAccessPolicy -PolicyName Test-policy -Identity "ddb80e06-92f3-4978-bc22-a0eee85e6a9e"
ddb80e06-92f3-4978-bc22-a0eee85e6a9e
正是userId
我的代码供您参考:
// Configure the MSAL client as a confidential client
var confidentialClient = ConfidentialClientApplicationBuilder
.Create("{client_id}")
.WithTenantId("{tenant_id}")
.WithClientSecret("{client_secret}")
.Build();
ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClient);
GraphServiceClient graphServiceClient = new GraphServiceClient(authProvider);
var onlineMeeting = new OnlineMeeting
{
StartDateTime = DateTimeOffset.Parse("2021-01-12T21:30:34.2444915+00:00"),
EndDateTime = DateTimeOffset.Parse("2021-01-12T22:00:34.2464912+00:00"),
Subject = "User Token Meeting123"
};
var meeting = await graphServiceClient.Users["{userId}"].OnlineMeetings
.Request()
.AddAsync(onlineMeeting);
当您尝试使用应用程序标识时,那么为什么要将其称为“我”,这表示委派标识。您应该使用“”api调用,它将对您起作用。我应该在其中输入什么用户id?我认为当我创建graphServiceClient时,我已经传递了应用程序标识的客户机id和客户机机密,这样它就可以从应用程序标识中知道它。我已经在上面更新了如何实例化graph客户端。如果我的答案对您有帮助,您可以接受它作为答案。这可能对其他社区成员有益。谢谢你,谢谢你,很有效!