Office 365的OAuth2身份验证请求过程将链接转发到https://login.microsoftonline.com/login.srf

时间:2018-05-30 07:19:26

标签: c# azure oauth-2.0 office365

目前,我正在开发我的网络应用程序以使用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"

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

enter image description here

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

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

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

  1. 注册设置
  2. enter image description here

    1. 属性
    2. enter image description here

      1. 密钥
      2. enter image description here

        1. 重播网址
        2. enter image description here

2 个答案:

答案 0 :(得分:1)

要获得O365的授权并使用REST API,以下是一个供您参考的解决方案:

首先:获取安全令牌

通过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>  

邮递员的演示截图: enter image description here

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

enter image description here

第二:获取访问令牌

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

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

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

enter image description here

响应如下:

enter image description here

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

第三:获取请求摘要

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

enter image description here

响应如下:

enter image description here

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

然后我们可以使用SharePoint的REST API,我们只需要添加这个令牌和前两个cookie,如下图所示。

enter image description here

答案 1 :(得分:1)

似乎我所遵循的文章已经过时(2014年发布)并且不再有效。

最后,我已按照本文中的步骤解决了问题:https://developer.microsoft.com/en-us/graph/docs/concepts/auth_v2_user

在这里,我将简要解释一下我的变化:

首先,要注册应用,而不是使用https://portal.azure.com,我通过https://apps.dev.microsoft.com/注册了我的应用。不知何故,他们是不同的。

第二次,我将用于OAuth2流程的完整链接更改为:

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id=[Client ID]
&response_type=code
&redirect_uri=[your web app link after finishing login]
&response_mode=query
&scope=[scope of your app]

参数说明: enter image description here