c# - 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 门户中的应用注册设置:
- 注册设置
- 特性
- 密钥
- 重播 URL
解决方案
要对 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>
并且响应内容将包含一个安全令牌,如下所示,我们可以使用此安全令牌和相关的 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,如下图所示。
推荐阅读
- ldap - 当用户在另一个网站上使用 ldap 进行身份验证时,如何使用 ldap 对一个网站进行身份验证
- python-3.x - 无法将 Dataframe 对象转换为日期时间
- python - 使用邻域和对 3D 数组进行二次采样
- flutter - 在用户拖动时实现垂直平移小部件的有效方法
- firebase - 在firebase项目中,我可以从实时数据库更新firestore数据库中的值吗
- ssl - 为 SSL / TLS 配置 Proton 引发 openssl 错误版本号和 gRPC 客户端错误
- python - 裁剪图像四
- c# - 在应用程序级别打开受密码保护的文档添加
- ios - 在文本中添加无限行(SwiftUI)
- java - 如何停止导致使用父类序列化程序的@JsonProperty?