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

时间:2018-03-29 05:27:33

标签: azure office365 azure-active-directory microsoft-graph

简而言之:我是否可以在使用客户端凭据流(未登录用户)的同时授予Azure应用程序访问一组有限邮箱的权限?

更多细节

在Azure中,我有一个仅限应用程序的应用程序;我的意思是我将使用Client Credentials Flow对其进行身份验证,这意味着没有登录用户。

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

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

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

我是一个完整的Azure noob,所以我希望这是有道理的。

这个问题是否在正确的位置?

我不确定。一方面,softwareengineering中有大约100个azure问题,但SO上有超过54k,并且不包括子标记。

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

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;

虽然我打算将其改为使用证书而不是秘密。

如果我的问题有更好的地方(无论是stackexchange还是其他),请告诉我。

1 个答案:

答案 0 :(得分:3)

应用程序权限始终是组织范围的。对他们来说好处是使用Client Creds相对简单可靠。撤消它们将需要删除角色分配或完全删除服务主体。但不好的一面是你无法限制它可以访问的内容。

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

TL; DR:没有"对"回答这个问题。这两种方法都有利有弊,也不完美。如果您的应用暂时无法处理失去的访问权限,那么您必须使用应用权限。