Azure 我是否可以向仅应用程序授予有限的邮箱访问权限?

Azure 我是否可以向仅应用程序授予有限的邮箱访问权限?,azure,office365,azure-active-directory,microsoft-graph-api,Azure,Office365,Azure Active Directory,Microsoft Graph Api,简而言之:我是否可以在仍然使用客户端凭据流(无登录用户)的情况下授予Azure应用程序对有限邮箱集的访问权限 更多细节 在Azure中,我有一个仅应用程序类型的应用程序;我的意思是,我将使用进行身份验证,这意味着不存在登录用户 一旦通过身份验证,我将获得一个令牌以访问Microsoft Graph。我想使用Graph访问有限的一组Office365邮箱 据我所知,我可以使用仅限管理员的Mail.Read权限范围来执行此操作,但这使我的应用程序可以访问每个用户邮箱。我宁愿避免如此广泛的接触 我认为

简而言之:我是否可以在仍然使用客户端凭据流(无登录用户)的情况下授予Azure应用程序对有限邮箱集的访问权限

更多细节

在Azure中,我有一个仅应用程序类型的应用程序;我的意思是,我将使用进行身份验证,这意味着不存在登录用户

一旦通过身份验证,我将获得一个令牌以访问Microsoft Graph。我想使用Graph访问有限的一组Office365邮箱

据我所知,我可以使用仅限管理员的Mail.Read权限范围来执行此操作,但这使我的应用程序可以访问每个用户邮箱。我宁愿避免如此广泛的接触

我认为,如果改用委派权限,我可以使用Mail.Read.Shared作用域,这将允许我的应用程序读取与已登录用户共享的邮箱,但我不能使用客户端凭据流,因为我需要登录用户,这是我试图避免的。这是一个不在用户上下文中逻辑运行的应用程序。(我要读取的邮箱都是共享的,它们不是用户邮箱)

我是一个彻头彻尾的蓝精灵,所以我希望这是有意义的

这个问题在正确的地方吗?

我不确定。一方面,有大约100个azure问题,但有超过54k的问题,这还不包括子标签

另一方面,我没有在这个问题中包括任何关于编程的内容,尽管这对我来说肯定是一个编程问题,因为我必须编写代码,通过Azure进行身份验证,获取令牌,然后访问Graph API,而这个问题的答案可能会影响我如何去做。FWIW,以下是我目前如何在C#中验证和获取令牌:

尽管我确实计划将其更改为使用证书而不是秘密


如果有更好的地方回答我的问题(无论是stackexchange还是其他),请务必让我知道。

应用程序权限始终是组织范围内的。对他们来说,好的方面是使用客户端信誉相对简单可靠。撤销它们需要删除角色分配或完全删除服务主体。但坏的一面是,您无法限制它可以访问的内容

通过授权,您可以创建一个小型web前端,允许用户登录并授予阅读邮件的权限。 然后,您的应用程序可以安全地存储用户的刷新令牌,并随时使用该令牌访问其邮件。 好的一面是,这将访问权限限制为只有那些明确授予权限的用户。 坏的一面是这需要更多的工作,而且不那么可靠,因为如果用户的密码发生更改(例如),刷新令牌就会被撤销。 并且,您必须确保在使用旧的刷新令牌获取令牌时存储了新的刷新令牌


TL;医生:这个问题没有“正确”的答案。这两种方法各有利弊,都不是完美的。如果你的应用程序暂时无法处理失去访问权限的问题,那么你必须使用应用程序权限。

是的,同意这个答案。如果您选择使用客户端凭据流,则需要接受此套装。谢谢。我担心我遗漏了什么,所以很高兴我的理解得到了确认。如果我改用授权码流,一旦我有了令牌/刷新令牌对,我是否可以继续无限期地获得新的令牌对(使用刷新令牌),而不必再次验证?似乎暗示我可以。是的,基本上是正确的。但是刷新令牌可能会被撤销,因此您需要为此做好准备。@juunas:ThanksOrganizations确实倾向于将用户帐户/收件箱专用于特定的主题或部门。因此,侵犯了“用户”是个人的概念。典型的理论与现实的对比。问题中描述的用例非常熟悉;我想知道这里是否需要一种完全不同的方法。
var authority = $"https://login.microsoftonline.com/{tenant}/v2.0";
var authContext = new AuthenticationContext(authority);
var clientCredential = new ClientCredential(clientId, secret);
var token = authContext.AcquireTokenAsync("https://graph.microsoft.com/", clientCredential).Result.AccessToken;