MVC AD Azure 刷新令牌通过 ADAL JavaScript Ajax 和 KnockoutJs
MVC AD Azure Refresh Token via ADAL JavaScript Ajax and KnockoutJs
我构建的 MVC 应用程序类型存在固有的设计缺陷,我相信我不是第一个意识到的。
我有一个 MVC 4 应用程序,它使用以下列方式引入应用程序的 AD Azure 身份验证
Developing ASP.NET Apps with Azure Active Directory
一旦用户通过身份验证并 Home.cshtml
加载,KnockoutJs 用于执行 JavaScript AJAX POST 和 GET 请求以读取和写入数据。
因此不完全是单页应用程序,而是通过 AJAX.
进行身份验证和服务资产以及 Read/Write 操作的传统回发的混合体
在 AJAX 请求期间,身份验证令牌过期并且 AD 无法通过 JavaScript 刷新令牌。
观察到以下浏览器错误
XMLHttpRequest 无法加载 https://login.windows.net/xxx。
请求的资源上不存在 'Access-Control-Allow-Origin' header。
因此不允许来源 'xxx' 访问。
我研究了 adal.js 和以下帖子,但不确定 adal.js 是否适合我的申请类型
或者如何最好地合并它以使其与我的应用程序类型一起工作。
目前我的理解:
我没有使用 AngularJS。
我一开始并不是通过 JavaScript 进行身份验证的,而且我的身份验证并不是 JavaScript 驱动的,以便能够从 adal.js 中受益。
身份验证完成server-side,后续的 OAuth2 刷新令牌机制需要完整的页面回发。
我偶然发现了 Vittorio Bertocci 的各种相关帖子,但 none 解决了此类 MVC 应用程序设计的特殊性。
ADAL, Windows Azure AD and Multi-Resource Refresh Tokens
WAAD doesn't refresh access token from javascript
AngularJS + ADAL.JS set Resource ID (Audience)
您设置的问题是您使用 cookie 来验证 AJAX 呼叫。 Cookie 不太适合这种情况,当您需要在 cookie 过期时在您的域外进行调用 and/or 时,这种方法的局限性通常会显现出来。事实上,它是一种常见的方法,主要是由于一段时间内没有对 auth 提供适当的 SPA 支持这一事实而作为一个进化步骤,但这并不是一个好的方法。
您可以自由地坚持当前的方法,但这会带来一些痛苦。没有确定的机制来触发 JS 的会话 cookie 更新。尽管可以一起破解,但我们没有相关示例 - 主要是因为它是破解 :) 基本情况似乎很简单,但是一旦您开始考虑所有可能的情况(如果您的应用程序会话过期会发生什么,用户退出 Azure AD 并使用其他帐户登录?)。
最万无一失的方法是放弃混合方法。如果你想成为一个 JS 应用程序,你可以消除所有服务器驱动的登录,并仍然保留执行服务器端流程的能力(通过代表授权,如 https://github.com/AzureADSamples/WebAPI-OnBehalfOf-DotNet). You don;t even need to convert to angular if you don't want to, see https://github.com/AzureADSamples/SinglePageApp-jQuery-DotNet。
如果你想成为一个基于回发的应用程序,你可以放弃 JS 部分(虽然这听起来很痛苦)。
TL;DR:通过 cookie 保护 AJAX 呼叫不是一个干净的解决方案,您一定会感到一些痛苦。您的选择是用临时黑客修补问题,还是重构为更规范的方法。对不起坏消息:(
我构建的 MVC 应用程序类型存在固有的设计缺陷,我相信我不是第一个意识到的。
我有一个 MVC 4 应用程序,它使用以下列方式引入应用程序的 AD Azure 身份验证
Developing ASP.NET Apps with Azure Active Directory
一旦用户通过身份验证并 Home.cshtml
加载,KnockoutJs 用于执行 JavaScript AJAX POST 和 GET 请求以读取和写入数据。
因此不完全是单页应用程序,而是通过 AJAX.
进行身份验证和服务资产以及 Read/Write 操作的传统回发的混合体在 AJAX 请求期间,身份验证令牌过期并且 AD 无法通过 JavaScript 刷新令牌。
观察到以下浏览器错误
XMLHttpRequest 无法加载 https://login.windows.net/xxx。 请求的资源上不存在 'Access-Control-Allow-Origin' header。 因此不允许来源 'xxx' 访问。
我研究了 adal.js 和以下帖子,但不确定 adal.js 是否适合我的申请类型 或者如何最好地合并它以使其与我的应用程序类型一起工作。
目前我的理解:
我没有使用 AngularJS。
我一开始并不是通过 JavaScript 进行身份验证的,而且我的身份验证并不是 JavaScript 驱动的,以便能够从 adal.js 中受益。
身份验证完成server-side,后续的 OAuth2 刷新令牌机制需要完整的页面回发。
我偶然发现了 Vittorio Bertocci 的各种相关帖子,但 none 解决了此类 MVC 应用程序设计的特殊性。
ADAL, Windows Azure AD and Multi-Resource Refresh Tokens
WAAD doesn't refresh access token from javascript
AngularJS + ADAL.JS set Resource ID (Audience)
您设置的问题是您使用 cookie 来验证 AJAX 呼叫。 Cookie 不太适合这种情况,当您需要在 cookie 过期时在您的域外进行调用 and/or 时,这种方法的局限性通常会显现出来。事实上,它是一种常见的方法,主要是由于一段时间内没有对 auth 提供适当的 SPA 支持这一事实而作为一个进化步骤,但这并不是一个好的方法。 您可以自由地坚持当前的方法,但这会带来一些痛苦。没有确定的机制来触发 JS 的会话 cookie 更新。尽管可以一起破解,但我们没有相关示例 - 主要是因为它是破解 :) 基本情况似乎很简单,但是一旦您开始考虑所有可能的情况(如果您的应用程序会话过期会发生什么,用户退出 Azure AD 并使用其他帐户登录?)。 最万无一失的方法是放弃混合方法。如果你想成为一个 JS 应用程序,你可以消除所有服务器驱动的登录,并仍然保留执行服务器端流程的能力(通过代表授权,如 https://github.com/AzureADSamples/WebAPI-OnBehalfOf-DotNet). You don;t even need to convert to angular if you don't want to, see https://github.com/AzureADSamples/SinglePageApp-jQuery-DotNet。 如果你想成为一个基于回发的应用程序,你可以放弃 JS 部分(虽然这听起来很痛苦)。
TL;DR:通过 cookie 保护 AJAX 呼叫不是一个干净的解决方案,您一定会感到一些痛苦。您的选择是用临时黑客修补问题,还是重构为更规范的方法。对不起坏消息:(