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

使用Azure应用程序服务身份验证将Azure功能作为多租户应用程序连接到Microsoft Graph,azure,azure-active-directory,microsoft-graph-api,azure-functions,Azure,Azure Active Directory,Microsoft Graph Api,Azure Functions,我一直在研究如何将azure功能连接到任何用户的office 365图形,以查询他们的收件箱,但没有成功。我需要帮助了解执行以下操作的正确方法: 当用户向http触发函数发出http get请求时,它应该: 提示用户登录其Microsoft工作帐户 请求访问其收件箱的权限 查询他们的收件箱以获取未读邮件的计数 回复未读邮件数 这应该适用于调用该函数的任何用户,无论他们正在访问哪个azure active directory实例 这可能吗 如果是这样,有人能解释一下如何配置azure功能来实现这一

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

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

  • 提示用户登录其Microsoft工作帐户
  • 请求访问其收件箱的权限
  • 查询他们的收件箱以获取未读邮件的计数
  • 回复未读邮件数
  • 这应该适用于调用该函数的任何用户,无论他们正在访问哪个azure active directory实例

    这可能吗

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

    谢谢,
    Stewart

    您应该能够找到关于另一个StackOverflow问题的信息:


    关于如何注册AAD多租户应用程序,您可以在此处找到更多信息:。主要技巧是转到“高级”选项卡并清除“颁发者URL”字段。

    您应该能够找到有关此其他StackOverflow问题的信息:


    关于如何注册AAD多租户应用程序,您可以在此处找到更多信息:。主要的技巧是转到“高级”选项卡并清除“颁发者URL”字段。

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

  • 创建函数和应用程序。
  • 创建一个新的azure函数应用程序
  • 添加一个javascript web钩子
  • 创建Microsoft应用程序注册。
  • 在应用程序注册中生成新密码并保存密码
  • 生成Web平台并将重定向url设置为https://.azurewebsites.net/.auth/login/aad/callback.
  • 添加任何所需的委派权限(Mail.Read)
  • 为Azure功能应用程序设置Azure应用程序服务身份验证。
  • 启用Azure功能应用程序的身份验证(平台功能->身份验证/授权)
  • 将“请求未通过身份验证时要采取的操作”设置为“使用Azure Active Directory登录”
  • 将Active Directory身份验证设置设置为“高级”。
  • 将客户端ID设置为在步骤3中创建的应用程序ID
  • 将客户端密码设置为步骤4中生成的密码
  • 保留颁发者Url,并允许令牌访问量为空
  • 将Azure函数授权级别设置为匿名(单击函数->集成)
  • 向函数中添加以下代码:

    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();
            });
        });
    };
    
  • 将“请求”npm包添加到您的解决方案中

  • 将package.json文件添加到wwwroot文件夹,并向请求添加依赖项
  • 将以下内容添加到package.json中:
  • { “名称”:“yourfunctionname”, “版本”:“0.0.1”, “依赖项”:{ “请求”:“>=2.81.0” } }

  • 使用控制台(底部左侧第二个按钮)并运行:
  • npm安装

  • 测试你的功能

  • 导航到您的函数
  • 系统将提示您登录
  • 使用任何租户的任何active directory帐户
  • 还应提示您提供您的同意
  • 之后,您应该可以从响应中提供的Microsoft Graph中看到有关您作为登录用户的信息

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

  • 创建函数和应用程序。
  • 创建一个新的azure函数应用程序
  • 添加一个javascript web钩子
  • 创建Microsoft应用程序注册。
  • 在应用程序注册中生成新密码并保存密码
  • 生成Web平台并将重定向url设置为https://.azurewebsites.net/.auth/login/aad/callback.
  • 添加任何所需的委派权限(Mail.Read)
  • 为Azure功能应用程序设置Azure应用程序服务身份验证。
  • 启用Azure功能应用程序的身份验证(平台功能->身份验证/授权)
  • 将“请求未通过身份验证时要采取的操作”设置为“使用Azure Active Directory登录”
  • 将Active Directory身份验证设置设置为“高级”。
  • 将客户端ID设置为在步骤3中创建的应用程序ID
  • 将客户端密码设置为步骤4中生成的密码
  • 将颁发者Url和允许的令牌访问群体保留为空
  • 将Azure函数授权级别设置为匿名(单击函数->集成)
  • 向函数中添加以下代码:

    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();
            });
        });
    };
    
  • 将“请求”npm包添加到您的解决方案中

  • 将package.json文件添加到wwwroot文件夹,并向请求添加依赖项
  • 将以下内容添加到package.json中:
  • { “名称”:“yourfunctionname”, “版本”:“0.0.1”, “依赖项”:{ “请求”:“>=2.81.0” } }

  • 使用控制台(底部左侧第二个按钮)并运行:
  • npm安装

  • 测试您的功能

  • 导航到您的函数
  • 系统将提示您登录
  • 使用任何租户的任何active directory帐户
  • 还应提示您提供您的同意
  • 之后,您应该可以从响应中提供的Microsoft Graph中看到有关您作为登录用户的信息

  • 我已将azure功能的azure应用程序服务身份验证设置为多租户应用程序,并使用express设置对azure active directory进行身份验证。我可以作为同一租户中的用户成功登录