azure - 使用 Azure 应用服务身份验证将 Azure Function 作为 Multi-Tenancy 应用程序连接到 Microsoft Graph

标签 azure azure-active-directory microsoft-graph-api azure-functions

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

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

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

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

这可能吗?

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

谢谢, 斯图尔特

最佳答案

我已经想出了如何做到这一点。建议的解决方案仅从 Microsoft Graph 返回用户的详细信息,而不是收件箱计数。

  1. 创建函数和应用程序。
    1. 创建一个新的 Azure Functions 应用。
    2. 添加 JavaScript Web Hook 。
  2. 创建 Microsoft 应用程序注册 here
    1. 在应用程序注册中生成新密码并保存该密码。
    2. 生成 Web 平台并将重定向网址设置为 https://.azurewebsites.net/.auth/login/aad/callback。
    3. 添加任何所需的委派权限 (Mail.Read)。
  3. 为 Azure Function 应用设置 Azure 应用服务身份验证。
    1. 为 Azure Function 应用启用身份验证(平台功能 -> 身份验证/授权)。
    2. 将“请求未经身份验证时采取的操作”设置为“使用 Azure Active Directory 登录”。
    3. 将 Active Directory 身份验证设置设为“高级”。
      1. 将客户端 ID 设置为第 3 步中创建的应用程序 ID。
      2. 将客户端 key 设置为第 4 步中生成的密码。
      3. 将颁发者网址和允许的 token 受众留空。
  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. 将 package.json 文件添加到 wwwroot 文件夹并添加请求的依赖项。
    3. 将以下内容添加到您的 package.json 中:

    { "name": "你的函数名称", “版本”:“0.0.1”, “依赖项”:{ “请求”:“>=2.81.0” } }

  7. 使用控制台(左侧倒数第二个按钮)并运行:

npm 安装

  • 测试您的功能。

    1. 导航至您的函数。
    2. 系统应该提示您登录。<​​/li>
    3. 使用任何租户的任何 Active Directory 帐户。
    4. 系统还应该提示您表示同意。
    5. 之后,您应该会从响应中提供的 Microsoft Graph 中看到有关您登录的用户的信息。
  • 关于azure - 使用 Azure 应用服务身份验证将 Azure Function 作为 Multi-Tenancy 应用程序连接到 Microsoft Graph,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44720343/

    相关文章:

    azure - 将自定义声明 "samaccountname"添加到 Azure 广告中时出现问题

    database - 将数百个数据库迁移到 Azure 弹性数据库池

    azure-active-directory - 延迟更改带有证书的 Microsoft Graph 的 Azure AD 权限?

    Azure AD : Unable to issue tokens from this api version

    angular - 如何使用 loginRedirect 而不是 loginPopup?

    asp.net-mvc - 无法从 global.asax 检索 Azure 图形 token

    c# - 无法使用 GraphServiceClient 更新 Azure Active Directory B2C 用户 - ASP.NET MVC

    Azure 服务总线订阅客户端轮询间隔

    azure - 如何在 Azure 搜索 REST API 上使用 "id"删除特定文档?

    azure - Microsoft Azure OAuth2.0颁发的刷新 token 的过期时间是多少?