我们正在构建一个显示月度获奖者(员工)照片的内部应用程序。我以为我们将使用Outlook REST API检索Outlook照片,而不是重新发明轮子。
经过几个小时的分析后发现,如果我们使用API,我们必须将用户引导至MS登录表单以获取权限。
我能够检索自己的照片,但必须通过MS登录页面登录。我查看了各种链接和答案,但找不到一种简单的方法(例如API),不需要最终用户明确登录以获取员工的图片。
问题:
我理解MS担心安全性并需要最终用户授予的许可但我可以以某种方式避免登录页面吗?
其他信息:
内部应用程序是部署在Azure中并连接到AD的ASP.NET MVC Web应用程序。因此,用户已使用AD凭证登录一次。当他们看到仪表板用户界面时,上个月就会显示胜利者照片(这是我希望在后台以编程方式获取员工照片的地方)。
以下是MS表示登录屏幕必不可少的快照:
阅读或尝试过以下内容:
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应用程序从Outlook获取用户照片(没有UI,可以由http非浏览器客户端调用)。这些都不允许我通过配置具有所需权限的应用程序来获取照片,但无需用户干预或凭据。
我正在考虑构建一个Web API应用程序,它将员工图像返回给所有调用的内部应用程序。由于这是一个在Azure中运行的应用程序,我想我可以给它所需的访问Azure AD& Outlook,所以它可以读取员工的outlook照片。由于以下方法都不适用于API应用程序,我可能必须复制文件夹中的所有员工图像并从此静态文件夹返回(不会与Outlook同步)。
我错过了什么吗?
适用于所有用户,但需要在Web请求中提供AD凭据,否则返回401(未授权)。
Exchange Web服务(EWS托管API和/或REST API):与#1相同,需要提供AD用户名和密码。
Outlook REST API:请参阅#4
Office 365 Unified API:
#3和#4 - 将向用户显示一个显示应用程序名称的登录屏幕。一旦他们登录,如果是他们第一次使用该应用程序,将向用户显示应用程序所需的应用程序权限列表,并要求允许或拒绝。假设他们允许所需的访问权限,浏览器将被重定向到初始请求中指定的重定向URI。
因此,最终所有选项都需要有效的AD凭据(API应用程序无法提供)或要求用户登录并提供权限(对于非HTTP浏览器客户端也是如此)。
答案 0 :(得分:1)
如果您的用户未登录,则您的应用程序本身必须有权从任何用户获取照片。引用Get Photo操作的文档:
必需范围使用以下范围之一获取照片 指定用户,可以是已登录用户:
<强> user.readbasic.all 强>
<强> user.read.all 强>
<强> user.readwrite.all 强>
您也可以使用 以下范围来获取具体登录的照片 用户:
user.read
user.readwrite
您的应用只需要一个粗体权限。允许它读取所有用户,并且可以使用其客户端ID和机密进行身份验证,而无需经过身份验证的用户。
答案 1 :(得分:0)
由于juunas提到我们可以使用client id, tenant id, secret
进行身份验证而无需经过身份验证的用户。有关如何注册AD App并将角色分配给应用程序的更多详细信息,请参阅document。之后,我们可以从Azure门户获取tenantId, appId, secretKey
。然后我们可以使用Microsoft.IdentityModel.Clients.ActiveDirectory SDK获取api身份验证令牌。
var subscriptionId = "Your subscrption";
var appId = "Registried Azure Application Id";
var secretKey = "Secret Key";
var tenantId = "tenant Id";
var context = new AuthenticationContext("https://login.windows.net/" + tenantId);
ClientCredential clientCredential = new ClientCredential(appId, secretKey );
var tokenResponse = context.AcquireTokenAsync("https://management.azure.com/", clientCredential).Result;
var accessToken = tokenResponse.AccessToken;