c# - 以编程方式检索 Outlook 照片,无需最终用户登录

标签 c# asp.net asp.net-mvc azure outlook

我们正在构建一个内部应用程序,显示每月获奖者(员工)的照片。我认为我们将使用 Outlook REST API 检索 Outlook 照片,而不是重新发明轮子。

经过几个小时的分析,我发现,如果我们使用 API,我们将必须将用户引导至 MS 登录表单以获取权限。

我能够检索自己的照片,但必须通过 MS 登录页面登录。我查看了各种链接和答案,但找不到一种不需要最终用户显式登录来获取员工照片的简单方法(例如 API)。

问题:

我知道 MS 担心安全性,需要最终用户授予权限,但我可以以某种方式避免登录页面吗?

其他信息:

内部应用程序是部署在 Azure 中并连接到 AD 的 ASP.NET MVC Web 应用程序。因此用户已经使用 AD 凭据登录过一次。当他们看到仪表板 UI 时,上面会显示上个月获奖者的照片(这是我希望在后台以编程方式获取员工照片的地方)。

这是微软表示登录屏幕必不可少的快照:

enter image description here

阅读或尝试以下内容:

How to get user's exchange/outlook/office365 photo?

https://graph.microsoft.io/en-us/docs/get-started/aspnetmvc

https://msdn.microsoft.com/office/office365/APi/photo-rest-operations

更新(经过一天的分析)

我现在已经尝试了所有可能的(基于研究)方法,通过 API 应用程序(无 UI,可以由 http 非浏览器客户端调用)从 Outlook 获取用户照片。这些都不允许我通过配置具有所需权限的应用程序来获取照片,但不需要用户干预或凭据。

我正在考虑构建一个 Web API 应用程序,它将员工图像返回到所有调用的内部应用程序。由于这是一个在 Azure 中运行的应用程序,我想我可以为其提供对 Azure AD 和 Outlook 的所需访问权限,以便它可以读取员工的 Outlook 照片。由于以下方法均不适用于 API 应用程序,因此我可能必须复制文件夹中的所有员工图像并从该静态文件夹返回(不会与 Outlook 同步)。

我错过了什么吗?

  1. Exchange Web 服务 (EWS):使用 GetUserPhoto 操作,如下所示:

https://www.outlook.com/ews/exchange.asmx/s/G[email protected]&size=HR240x240

适用于所有用户,但需要在 Web 请求中提供 AD 凭据,否则返回 401(未经授权)。

  • Exchange Web 服务(EWS 托管 API 和/或 REST API):与 #1 相同,需要提供 AD 用户名和密码。

  • Outlook REST API:请参阅#4

  • Office 365 统一 API:

  • #3 和 #4 - 用户将看到一个显示应用名称的登录屏幕。登录后,如果这是第一次使用该应用程序,用户将看到该应用程序所需的应用程序权限列表,并要求允许或拒绝。假设它们允许所需的访问,浏览器将被重定向到初始请求中指定的重定向 URI。

    因此,最终所有选项都需要有效的 AD 凭据(API 应用程序无法提供)或要求用户登录并提供权限(对于 http 非浏览器客户端来说也是不可能的)。

    最佳答案

    如果您的用户未登录,则您的应用本身必须有权获取任何用户的照片。引用获取照片操作的文档:

    Required scope Use one of the following scopes to get the photo of the specified user, who can be the signed-in user:

    user.readbasic.all

    user.read.all

    user.readwrite.all

    You can also use the following scope to get the photo of specifically the signed-in user:

    user.read

    user.readwrite

    您的应用只需要粗体权限之一。允许它读取所有用户,并且它可以使用其客户端 ID 和 key 进行身份验证,而无需经过身份验证的用户。

    关于c# - 以编程方式检索 Outlook 照片,无需最终用户登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41185314/

    相关文章:

    c# - 如何将 Polly 与 Flurl.Http 一起使用?

    c# - 从从未 Hook 的事件中解开委托(delegate)是否有任何问题?

    c# - 使用 jQuery .load() 加载用户控件

    c# - 将一些属性和一些逻辑混搭在一起

    asp.net - jQuery 限制 <script> 的范围

    具有 2FA 的 Asp.Net Identity - 记住 session 后不保留浏览器 cookie

    asp.net-mvc - 在 MVC4 中使用 MVC 区域来创建以下解决方案结构的正确用法是什么?

    sql-server - Entity Framework 6 数据库优先方法不从 SQL Server 创建所有表

    c# - 参数字典包含不可为空类型 'IDnumber' 的参数 'System.Int32' 的空条目

    c# - 使用当前的 Serilog ILogger 实例将消息格式化为字符串(但不打印它)