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 呼叫不是一个干净的解决方案,您一定会感到一些痛苦。您的选择是用临时黑客修补问题,还是重构为更规范的方法。对不起坏消息:(