【问题标题】:Processing meeting requests from azure logic app with azure functions使用 azure 函数处理来自 azure logic app 的会议请求
【发布时间】:2019-05-28 12:40:21
【问题描述】:

在花了几个小时的研究之后,我完全糊涂了。围绕 azure 函数和 azure 逻辑应用程序以及围绕 azure ad 的图形和身份验证内容发生了如此多的变化,因此很难找到合适的资源。

我想要实现的很简单:

  1. 当收到共享收件箱的新电子邮件时触发的 Azure 逻辑应用。
  2. 如果这些电子邮件是会议请求,并且它们被标记为私人或发送状态为“免费”,则应自动拒绝会议请求。
  3. 一条消息被发布到一个松弛频道。

预计第 2 步一切正常。不幸的是,没有默认连接器提供任何操作来阅读有关会议请求的更多详细信息,并且没有连接器操作来拒绝会议请求。因此,显而易见的方法是使用 azure 函数并使用 Microsoft Graph API 来做这些事情。

所以我总是失败的地方是: 如何在 Azure 函数中获取正确的 Auth 令牌以访问 Microsoft graph?

由于逻辑应用程序是非交互式执行的,我无法进行任何交互式登录,并且我不想在代码中硬编码任何凭据。

【问题讨论】:

  • 您应该使用managed identity 并将您的函数权限授予图表中您需要的任何内容
  • @LaurinSt 对于第 2 步,Status 是从标头发送的,对吗?
  • 嘿@thomas - 你能举个例子吗?我没有找到一个例子。
  • @HariHaran:我不确定我是否正确理解你的意思。
  • @LaurinSt 来自电子邮件正文有一个 Status 字段,因此您应该能够正确阅读正文

标签: microsoft-graph-api azure-functions azure-logic-apps


【解决方案1】:

1.在函数应用中打开微星

在您的函数应用中,导航到 Platform features,选择 Identity 并将 Status 切换到 On。点击Save

2.托管服务身份的权限和角色

授予服务主体权限以从我的 Azure AD 中获取一些目录数据,例如用户信息。以下 Azure AD 命令将我的服务主体添加到 AD 目录角色 Directory Readers

3.获取令牌

由于您已在 Azure 功能中开启 MSI,您可以前往 https://***.scm.azurewebsites.net 并单击 Environment 并获取 MSI_SECRET

public static async Task<HttpResponseMessage> GetToken(string resource, string apiversion)  {
    HttpClient client = new HttpClient();
    client.DefaultRequestHeaders.Add("Secret", Environment.GetEnvironmentVariable("MSI_SECRET"));
    return await client.GetAsync(String.Format("{0}/?resource={1}&api-version={2}", Environment.GetEnvironmentVariable("MSI_ENDPOINT"), resource, apiversion));
}

更多详情可以参考articleone

【讨论】:

  • 哇 - 谢谢 - 这是一个很好的方法。一个问题:如果我现在需要处理用户收件箱中的电子邮件,我需要设置什么权限?由于采用这种方法,我没有应用注册,因此无法定义范围。 MSI 是如何解决这个问题的?
  • 您可以将Owner 角色分配给您的服务主体。
  • 所有者角色是什么?收件箱?我不想让它成为域管理员或类似的东西。它只需要能够访问共享的收件箱。
  • 如果指定无约束,则应用仅限于对登录用户拥有的资源执行操作。例如,Mail.Read 授予对登录用户邮箱中邮件的只读权限。你可以参考这个article和这个SO thread
猜你喜欢
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多