Asp.net mvc 4 通过ADAL JavaScript Ajax和KnockoutJs的MVC AD Azure刷新令牌

Asp.net mvc 4 通过ADAL JavaScript Ajax和KnockoutJs的MVC AD Azure刷新令牌,asp.net-mvc-4,knockout.js,azure-web-app-service,azure-active-directory,adal.js,Asp.net Mvc 4,Knockout.js,Azure Web App Service,Azure Active Directory,Adal.js,我构建的MVC应用程序类型存在固有的设计缺陷,我相信我不是第一个意识到这一点的人 我有一个MVC4应用程序,它使用AD Azure身份验证,该身份验证通过以下方式引入到应用程序中 一旦用户通过身份验证并加载Home.cshtml后,将使用KnockoutJs执行JavaScript AJAX POST并获取读取和写入数据的请求 因此,不完全是一个单页应用程序,而是用于身份验证和服务资产以及通过AJAX进行读/写操作的传统回发的混合 在AJAX请求期间,身份验证令牌过期,AD无法通过JavaSc

我构建的MVC应用程序类型存在固有的设计缺陷,我相信我不是第一个意识到这一点的人

我有一个MVC4应用程序,它使用AD Azure身份验证,该身份验证通过以下方式引入到应用程序中

一旦用户通过身份验证并加载
Home.cshtml
后,将使用KnockoutJs执行JavaScript AJAX POST并获取读取和写入数据的请求

因此,不完全是一个单页应用程序,而是用于身份验证和服务资产以及通过AJAX进行读/写操作的传统回发的混合

在AJAX请求期间,身份验证令牌过期,AD无法通过JavaScript刷新令牌

观察到以下浏览器错误

无法加载XMLHttpRequest。 请求的资源上不存在“Access Control Allow Origin”标头。 因此,不允许访问源“xxx”

我已经研究了adal.js和下面的文章,但不确定adal.js是否是我这类应用程序的解决方案 或者如何最好地将其与我的应用程序类型结合起来

到目前为止,我的理解是:

我没有使用AngularJS

我一开始并不是通过JavaScript进行身份验证,我的身份验证不是由JavaScript驱动的,因此无法从adal.js中获益

身份验证是在服务器端完成的,后续的OAuth2刷新令牌机制需要整页回发

我偶然发现了Vittorio Bertocci的各种相关文章,但没有一篇涉及这种MVC应用程序设计的特殊性


设置中的问题是,您正在使用cookie验证AJAX调用。cookie并不是很适合这样做,当您需要在域外进行调用和/或cookie过期时,通常会出现这种方法的限制。事实上,这是一种常见的方法,很大程度上是一种进化步骤,因为一段时间内没有对auth提供适当的SPA支持,这并不意味着它是一种好方法。 你可以自由地坚持你目前的方法,但这会带来一些痛苦。没有建立从JS触发会话cookie续订的机制。虽然这可以一起被黑客攻击,但我们没有这方面的样本——主要是因为这是一个黑客攻击:)基本情况似乎很简单,但只要你开始考虑所有可能的情况(如果你的应用程序会话过期,用户注销Azure广告并使用其他帐户登录会发生什么情况?)。 最简单的方法是放弃混合方法。如果你想成为一个JS应用程序,你可以取消所有服务器驱动的登录,这样做,仍然可以保留做服务器端流的能力(通过代表授权,如)。你不知道;如果你不想,你甚至不需要转换成角度,请看。 如果你想成为一个基于回发的应用程序,你可以放弃JS部分(尽管这听起来很痛苦)


TL;DR:通过cookies保护AJAX调用不是一个干净的解决方案,您一定会感到一些痛苦。您的选择是使用临时黑客修补问题,还是采用更规范的方法进行重构。对坏消息感到抱歉:(

我现在唯一的选择是使用隐藏的HTML IFrame每20分钟回发一次,并使用客户端重定向到登录页面来处理刷新令牌错误。我知道这已经有几个月了,但我现在遇到了同样的问题。您的解决方案是什么?如何在客户端捕获令牌错误?谢谢。