代码之家  ›  专栏  ›  技术社区  ›  Igby Largeman

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

  •  3
  • Igby Largeman  · 技术社区  · 8 年前

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

    更多详细信息

    在Azure中,我有一个仅应用程序类型的应用程序;我的意思是,我将使用 Client Credentials Flow 这意味着没有登录用户。

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

    据我所知,我可以使用管理员专用邮件。此的读取权限范围,但这使我的应用程序可以访问每个用户邮箱。我宁愿避免如此广泛的接触。

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

    我是个彻头彻尾的傻瓜,所以我希望这是有意义的。

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

    我不确定。一方面,大约有100个azure问题 softwareengineering ,但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 回复  |  直到 8 年前
        1
  •  4
  •   juunas    8 年前

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

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

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