使用Microsoft Graph API创建“作为在线会议的活动”或仅创建onlineMeeting

时间:2020-06-24 12:54:00

标签: c# microsoft-graph-api microsoft-graph-teams

在特定租户下登录到我们的系统(IdentityServer作为Auth)的任何用户都应该能够将活动创建为在线会议(MS小组)。

我们遵循Build ASP.NET Core MVC apps with Microsoft GraphCreate and enable an event as an online meeting创建了一个应用,该应用对组织的 AD用户进行身份验证,并允许他将活动创建为在线会议。

我们能够成功实施它,并能够将事件创建为在线会议。

但是这里的确切情况是,在我们的Web应用程序中通过身份验证的任何用户(不是AD用户)都应该能够创建MS Teams会议活动,并与其他应该分享该信息的参与者共享参加会议。

我不确定如何实现这一目标。

修改

或者至少我该如何create onlineMeeting?我尝试使用Client credentials provider如下

IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
    .Create("<<App_Id>>")
    .WithTenantId("<<Tenant_Id>>")
    .WithClientSecret("<<Client_Secret>>")
    .Build();


ClientCredentialProvider authenticationProvider = new ClientCredentialProvider(confidentialClientApplication);

GraphServiceClient graphClient = new GraphServiceClient(authenticationProvider);

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

var meeting = graphClient.Me.OnlineMeetings
.Request()
.AddAsync(onlineMeeting).Result;

但它正在抛出

Code: Forbidden
Inner error:
    AdditionalData:
    request-id: <<some_id>>
    date: 2020-07-09T16:42:23
ClientRequestId: <<some_id>>

3 个答案:

答案 0 :(得分:3)

几天来我一直在处理您的问题,我想提一些其他答案附带的建议。但是除此之外,这是主要的挑战,系统需要知道谁有权执行操作。

因此IMO解决此问题的最佳选择是在AzureAD中创建访客登录,而不是您可以用来创建团队活动的登录。此外,您可以在访客用户登录后添加一个额外的步骤,以便访客应​​输入其姓名并将其用作参考。

答案 1 :(得分:1)

您需要执行以下两个步骤。

  1. 获取正确的令牌
  2. Create an event(但将网址更改为 https://graph.microsoft.com/v1.0/users/the_user@domain.com/events

困难的部分是获得正确的令牌,您有多种选择。

  1. Use the client credentials flow,这将迫使每个新租户的管理员为您的组织授权您的应用程序。然后,您可以使用用户信息中的租户请求该租户的令牌,并使用用户ID创建要发布到的正确URL。
  2. 使IdentityServer保存访问令牌并允许您访问它。在coonfiguration level,您可以访问令牌回调,还可以在其中保存Azure AD访问令牌。我认为您可以将其添加到参考令牌中,这样就不会每次都传输它,但是您的Web应用程序仍然可以访问它。
  3. 使用on-behalf-of流,这将要求您传递IdentityServer从Azure AD获取的Azure AD访问令牌令牌,以传递给您的应用程序。
  4. 只需从流中删除身份服务器,并使用Azure AD直接记录您的Web应用程序。这样,您将一直拥有正确的令牌。

编辑

在阅读完已编辑的问题之后,您想要的是一个网站,用户不必是Azure AD的成员,而只想访问一些新的在线会议?

最佳选择是创建一个共享邮箱,授权一个应用程序(使用Calendar.ReadWrite)。获取具有客户凭证的令牌,然后调用Create Event,然后从事件中提取会议URL(发布成功完成后,您将获得回执。

答案 2 :(得分:0)

要为“客户凭据”流程创建在线会议,我使用了以下内容:

 var confidentialClientApplication = ConfidentialClientApplicationBuilder
     .Create("my-app-client-id")
     .WithTenantId("my-aad-tenant-id")
     .WithClientSecret("my-client-secret")
     .Build();
    
 var authProvider = new ClientCredentialProvider(confidentialClientApplication);
    
 var graphClient = new GraphServiceClient(authProvider);
    
 var meetingGuid = Guid.NewGuid();
 var createMeetingResponse = await graphClient.Users["my-aad-user-object-id"].OnlineMeetings
     .CreateOrGet(meetingGuid.ToString())
     .Request()
     .PostAsync();

您的代码的问题在于,引用 graphClient.Me 会导致图表请求转到 https://graph.microsoft.com/v1.0/me/onlineMeetings,这不是您在“客户端凭据”流程中想要的。从此处找到的文档中查看此屏幕截图:https://docs.microsoft.com/en-us/graph/api/onlinemeeting-createorget?view=graph-rest-1.0&tabs=csharp

enter image description here

我必须在 Azure 门户中授予“应用程序”权限以允许我的应用程序访问在线会议 API,并且我必须创建一个客户端机密。我还必须按照本文创建策略并将其授予使用 Microsoft Teams PowerShell 的特定用户:

https://docs.microsoft.com/en-us/graph/cloud-communication-online-meeting-application-access-policy

对于不在您组织中的用户,您可以邀请他们作为来宾用户加入您的租户。

由于 Windows 远程管理中的设置,我在使用 Microsoft Teams Powershell 命令时遇到问题,我做了类似的事情来解决:

https://lonesysadmin.net/2017/08/10/fix-winrm-client-issues/