我目前正在开发一个 ASP.NET Web API,它将支持创建 Teams 会议和检索连接 URL。我遵循了微软的文档,但它似乎不完整,并且我遇到了很多错误。
我在 Azure 中添加了具有 API 权限的应用程序注册
OnlineMeetings.ReadWrite.All
。我应该能够在不使用通用帐户的情况下同时创建多个链接。我只是想授权我的资源创建会议。
var tenantId = "...";
var clientId = "...";
var clientSecret = "...";
var options = new TokenCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
};
var clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret, options);
var graphClient = new GraphServiceClient(clientSecretCredential);
var requestBody = new Microsoft.Graph.Users.Item.OnlineMeetings.CreateOrGet.CreateOrGetPostRequestBody
{
StartDateTime = DateTimeOffset.Parse("2024-02-20T14:30:00.2444915-07:00"),
EndDateTime = DateTimeOffset.Parse("2024-02-20T15:00:00.2464912-07:00"),
Subject = "Test meeting from graph API",
Participants = new MeetingParticipants
{
Organizer = new MeetingParticipantInfo
{
Identity = new IdentitySet
{
User = new Identity
{
Id = "[email protected]"
}
},
Upn = "[email protected]"
},
Attendees = new List<MeetingParticipantInfo>
{
new MeetingParticipantInfo
{
Identity = new IdentitySet
{
User = new Identity
{
Id = "[email protected]"
}
},
Upn = "[email protected]"
}
}
}
};
var result = await graphClient.Users["[email protected]"].OnlineMeetings.CreateOrGet.PostAsync(requestBody);
return result.JoinWebUrl;
使用 Azure 中的指定凭据执行此代码时,我收到此错误:
Microsoft.Graph.Models.ODataErrors.ODataError
带有 http 404 错误代码
这个异常最初是在这个调用堆栈上抛出的:
Library.Http.HttpClientRequestAdapter.ThrowIfFailedResponse(System.Net.Http.HttpResponseMessage,System.Collections.Generic.Dictionary
>,System.Diagnostics.Activity,System.Threading.CancellationToken)
Library.Http.HttpClientRequestAdapter.SendAsync(Library.Abstractions.RequestInformation,Library.Abstractions.Serialization.ParsableFactory,System.Collections.Generic.Dictionary>,System.Threading.CancellationToken)
Library.Http.HttpClientRequestAdapter.SendAsync(Library.Abstractions.RequestInformation,Library.Abstractions.Serialization.ParsableFactory,System.Collections.Generic.Dictionary>,System.Threading.CancellationToken)
CreateOrGetRequestBuilder.cs 中的 Users.Item.OnlineMeetings.CreateOrGet.CreateOrGetRequestBuilder.PostAsync(Users.Item.OnlineMeetings.CreateOrGet.CreateOrGetPostRequestBody, System.Action>, System.Threading.CancellationToken)
MeetingGeneratorService.cs 中的 App.Services.MeetingGeneratorService.CreateMeeting(App.Dto.v2.MeetingDto)
根据您的代码
graphClient.Users["[email protected]"].OnlineMeetings
,您似乎正在尝试使用此API来创建团队会议。然后我们看API文档中的权限信息,它表明不支持Application
类型的权限,这意味着我们无法使用客户端凭证流程生成访问令牌(需要应用程序类型的权限)然后调用这个API。但是,我们可以看到您在代码中使用客户端凭证流 -> var clientSecretCredential = new ClientSecretCredential
作为解决方法,我们可以使用日历事件 API 创建支持应用程序类型权限的在线会议。需要设置
IsOnlineMeeting = true
并添加应用程序类型权限Calendars.ReadWrite
。我之前做过测试证明这个API可以解决你的问题。代码片段应如下所示。
// Code snippets are only available for the latest version. Current version is 5.x
using Microsoft.Graph.Models;
using Microsoft.Graph;
using Azure.Identity;
var requestBody = new Event
{
Subject = "Let's go for lunch",
Body = new ItemBody
{
ContentType = BodyType.Html,
Content = "Does next month work for you?",
},
Start = new DateTimeTimeZone
{
DateTime = "2019-03-10T12:00:00",
TimeZone = "Pacific Standard Time",
},
End = new DateTimeTimeZone
{
DateTime = "2019-03-10T14:00:00",
TimeZone = "Pacific Standard Time",
},
Location = new Location
{
DisplayName = "Harry's Bar",
},
Attendees = new List<Attendee>
{
new Attendee
{
EmailAddress = new EmailAddress
{
Address = "[email protected]",
Name = "Adele Vance",
},
Type = AttendeeType.Required,
},
},
IsOnlineMeeting = true,
OnlineMeetingProvider = OnlineMeetingProviderType.TeamsForBusiness,
};
var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "tenantId";
var clientId = "clientId";
var clientSecret = "clientSecret";
var clientSecretCredential = new ClientSecretCredential(
tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);
var result = await graphClient.Users["{user_id}"].Events.PostAsync(requestBody);