使用 Azure 应用服务身份验证将 Azure Function 作为多租户应用程序连接到 Microsoft Graph

Connect Azure Function to Microsoft Graph as a Multi-tenant Application using Azure App Service Authentication

我一直在努力弄清楚如何将 azure 函数连接到任何用户的 office 365 图表以查询他们的收件箱,但没有成功。我需要帮助以了解执行以下操作的正确方法:

当用户向 http 触发函数发出 http get 请求时,它应该:

  1. 提示用户登录其 Microsoft 工作帐户。
  2. 请求访问他们收件箱的权限。
  3. 查询他们的收件箱以获取未读邮件的计数。
  4. 回复未读消息数。

这应该适用于调用该函数的任何用户,无论他们正在访问哪个 Azure 活动目录实例。

这可能吗?

如果是这样,谁能解释一下如何配置 azure 函数来实现这一点?

谢谢, 斯图尔特

您应该能够在另一个 Whosebug 问题上找到所需的信息:

至于如何注册 AAD 多租户应用程序,您可以在此处找到更多信息:https://blog.mastykarz.nl/configuring-multi-tenant-authentication-azure-app-service-authentication-options/。主要技巧是转到“高级”选项卡并清除 Issuer URL 字段..

我已经知道怎么做了。建议的解决方案只是 returns 来自 Microsoft Graph 的用户详细信息,而不是收件箱计数。

  1. 创建函数和应用程序。
    1. 创建一个新的 azure 函数应用。
    2. 添加一个 javascript 网络挂钩。
  2. 创建 Microsoft 应用程序注册 here
    1. 在应用程序注册中生成新密码并保存密码。
    2. 生成Web平台,设置重定向url为https://.azurewebsites.net/.auth/login/aad/callback.
    3. 添加任何需要的委派权限(Mail.Read)。
  3. 为 Azure Function App 设置 Azure App Service 身份验证。
    1. 为 Azure Function App 打开身份验证(平台功能 -> Authentication/Authorization)。
    2. 将 "Action to take when request is not authenticated" 设置为 "Log in with Azure Active Directory"。
    3. 将 Active Directory 身份验证设置设置为 'Advanced'。
      1. 将客户端 ID 设置为在步骤 3 中创建的应用程序 ID。
      2. 将客户端密码设置为第 4 步中生成的密码。
      3. 将 Issuer Url 和 Allowed Token Audiences 留空。
  4. 将 Azure 函数授权级别设置为匿名(单击函数 -> 集成)。
  5. 将以下代码添加到您的函数中:

    var request = require('request');
    
    module.exports = function (context, req) {
        var parameters = {
            grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
            client_id: process.env.WEBSITE_AUTH_CLIENT_ID,
            client_secret: process.env.WEBSITE_AUTH_CLIENT_SECRET,
            assertion: req.headers['x-ms-token-aad-id-token'],
            resource: 'https://graph.microsoft.com',
            requested_token_use: 'on_behalf_of'
        };
        var tenant = req.headers['x-ms-client-principal-name'].replace(/.*@/, "");
        request.post('https://login.microsoftonline.com/'+tenant+'/oauth2/token', {form: parameters}, function (aadErr, aadResponse, aadMsg) {
            var msgJson = JSON.parse(aadMsg);
            request.get('https://graph.microsoft.com/v1.0/me/', {'auth': {'bearer': msgJson.access_token}}, function (err, response, msg) {
                context.res = {
                    body: msg
                };
                context.done();
            });
        });
    };
    
  6. 将 'request' npm 包添加到您的解决方案中。

    1. 转到https://yourfunctionname.scm.azurewebsites.net/dev/wwwroot/
    2. 在wwwroot文件夹中添加一个package.json文件,并添加对request的依赖。
    3. 将以下内容添加到您的 package.json:

    { "name": "yourfunctionname", "version": "0.0.1", "dependencies":{ "request": ">=2.81.0" } }

    1. 使用控制台(左下数第二个按钮)和运行:

    npm 安装

  7. 测试你的功能。

    1. 导航到您的函数。
    2. 系统会提示您登录。
    3. 使用来自任何租户的任何活动目录帐户。
    4. 系统还应提示您表示同意。
    5. 之后,您应该会在响应中看到来自 Microsoft Graph 的登录用户信息。