首页 > 解决方案 > Office 365 的 OAuth2 身份验证请求过程将链接转发到 https://login.microsoftonline.com/login.srf

问题描述

目前,我正在开发我的网络应用程序以使用 Office365 的 Rest API。为此,对于 OAuth2 身份验证和授权,我按照本文中的步骤操作: https ://blogs.msdn.microsoft.com/exchangedev/2014/03/25/using-oauth2-to-access-calendar -contact-and-mail-api-in-office-365-exchange-online/

但是,我被困在第二步,即第一次尝试在 Windows 页面上登录。这是我用于 OAuth2 过程的完整链接:

"https://login.windows.net/common/oauth2/authorize?client_id=[ClientId]&redirect_uri=http://localhost/MicrosoftAuthDemo/MicrosoftCallBack.ashx&response_type=code&resource=https://outlook.office365.com/&state=c9833f87-892a-4f94-9234-2de9832d1f49"

完成登录后,它没有显示同意页面并将 URL 重定向回我的 web: http://localhost/MicrosoftAuthDemo/MicrosoftCallBack.ashx,而是将 URL 转发到https://login.microsoftonline.com/login.srf,我不知道它是什么。该login.srf链接显示此页面:

在此处输入图像描述

出乎意料的是,它要求再次登录。但是,当我再次尝试登录时,它会再次将我转发到相同的链接:https://login.microsoftonline.com/login.srf.

有谁知道问题的根源是什么?

如果有人想知道我在 Azure 门户中的应用注册设置:

  1. 注册设置

在此处输入图像描述

  1. 特性

在此处输入图像描述

  1. 密钥

在此处输入图像描述

  1. 重播 URL

在此处输入图像描述

标签: c#azureoauth-2.0office365

解决方案


要对 O365 进行授权并使用 REST API,这里有一个解决方案供您参考:

第一:获取安全Token

通过 Http Post 方法访问 [ https://login.microsoftonline.com/extSTS.srf] 。http请求的内容如下。

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"  
  xmlns:a="http://www.w3.org/2005/08/addressing"  
  xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">  
<s:Header>  
<a:Action s:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue</a:Action>  
<a:ReplyTo>  
  <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>  
</a:ReplyTo>  
<a:To s:mustUnderstand="1">https://login.microsoftonline.com/extSTS.srf</a:To>  
<o:Security s:mustUnderstand="1"  
   xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">  
  <o:UsernameToken>  
    <o:Username>[username]</o:Username>  
    <o:Password>[password]</o:Password>  
  </o:UsernameToken>  
</o:Security>  
</s:Header>  
<s:Body>  
<t:RequestSecurityToken xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust">  
  <wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">  
    <a:EndpointReference>  
      <a:Address>[endpoint]</a:Address>  
    </a:EndpointReference>  
  </wsp:AppliesTo>  
  <t:KeyType>http://schemas.xmlsoap.org/ws/2005/05/identity/NoProofKey</t:KeyType>  
  <t:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</t:RequestType>  
  <t:TokenType>urn:oasis:names:tc:SAML:1.0:assertion</t:TokenType>  
</t:RequestSecurityToken>  
</s:Body>  
</s:Envelope>  

Postman 中的演示截图: 在此处输入图像描述

并且响应内容将包含一个安全令牌,如下所示,我们可以使用此安全令牌和相关的 REST API 来获取您的 O365 应用程序的访问令牌,例如 SharePoint、Outlook 等。

在此处输入图像描述

二:获取Access Token

在这里,我将向您展示如何使用安全令牌和 SharePoint Rest API 在线获取 SharePoint 的访问令牌。

只要您使用相应的 REST API,在其他 O365 应用程序中也可以使用。

通过 http Post 方法访问 [ https://yourdomain.sharepoint.com/_forms/default.aspx?wa=wsignin1.0] 。请求的内容是我们上面得到的安全令牌,如下所示。

在此处输入图像描述

响应如下:

在此处输入图像描述

我们可以看到响应头中有两个cookie,rtFa和FedAuth,这两个cookie需要在后续请求中添加到请求中。

第三:获取请求摘要

使用我们上面得到的两个 cookie 通过 http Post 方法访问 [ https://yourdomain.sharepoint.com/_api/contextinfo] 。

在此处输入图像描述

响应如下:

在此处输入图像描述

这是我们想要的最终代币!

然后我们就可以使用SharePoint的REST API了,我们只需要加上这个token和前面的两个cookie,如下图所示。

在此处输入图像描述


推荐阅读