我们有一个控制台应用程序,希望在 service_account1 的上下文中按计划运行。
该应用程序需要使用Graph API访问 service_account2 的Outlook帐户并阅读传入的电子邮件。
我正在尝试找出访问 service_account2 邮箱的方式,而无需用户干预并跳过同意屏幕。
我看到的一个选择是,通过以 service_account2 身份登录并同意应用程序对邮箱的访问,从 / authorize 端点手动获取身份验证代码。这将为我提供身份验证代码,我可以使用它们以编程方式获取 access_token 和 refresh_token ,这将达到目的。
有没有一种方法可以以编程方式做到这一点,而无需进行初始手动操作?
答案 0 :(得分:1)
对于不希望用户显式登录的守护进程/控制台应用程序,可以使用客户端凭据授予。
您可以在Azure AD中为您的流程创建一个应用程序,然后使用clientid和client secret访问所需的资源。对于邮箱,您的资源类似于图api下的/ users / {userPrincipalName} / mailfolders / inbox / messages。
以下是来自守护程序app-https://github.com/Azure-Samples/active-directory-dotnet-daemon/blob/master/README.md
的客户端凭据授予流程示例具体为避免显式同意部分,请参阅此链接下的步骤9、10-https://github.com/Azure-Samples/active-directory-dotnet-daemon/blob/master/README.md#step-2--register-the-sample-with-your-azure-active-directory-tenant。
步骤将“ TodoListService”称为示例api,但在您的情况下,我想是图形。
为您的应用程序配置权限。就此而言, 设置菜单,选择“所需权限”部分,然后, 单击添加,然后选择一个API,然后在中输入TodoListService 文本框。然后,单击“选择权限”,然后选择“ TodoListAdmin”。 这将允许该客户端应用使用以下命令访问服务应用 TodoListAdmin角色。
在此阶段,权限分配正确,但客户端应用是 守护程序服务,因此它无法通过UI接受使用 服务应用程序。为避免这种情况,请点击“授予 权限”,将在管理员处接受该应用程序的同意 级别。
答案 1 :(得分:0)
最新答案,但可能会对某人有所帮助。我遇到过类似的情况,我想使用守护程序从共享邮箱中读取内容,但是我组织中的管理员不允许Mail.Read权限,因为它具有从所有邮箱中读取功能。我必须将应用程序限制为只有一个邮箱才能获得管理员的同意。
有一个选项可以将应用程序权限范围限制到特定邮箱。这样可以确保您不会从任何其他邮箱中读取内容,而仅允许您读取它们。我在守护程序中使用了客户端凭据流。
在此处查看文档-https://docs.microsoft.com/en-us/graph/auth-limit-mailbox-access