asp.net-mvc-4 – 通过ADAL JavaScript Ajax和KnockoutJs的MVC AD Azu

在我构建的MVC应用程序类型中存在固有的设计缺陷,我相信我不是第一个意识到的. 我有一个MVC 4应用程序,它使用以下列方式引入应用程序的AD Azure身份验证 Developing ASP.NET Apps with Azure Active Directory 一旦用户被认证并且Home.cshtml加载,KnockoutJs

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

我有一个MVC 4应用程序,它使用以下列方式引入应用程序的AD Azure身份验证

Developing ASP.NET Apps with Azure Active Directory

一旦用户被认证并且Home.cshtml加载,KnockoutJs用于执行JavaScript AJAX POST和GET请求以读取和写入数据.

所以不完全是单页应用程序,而是通过AJAX混合使用身份验证和服务资产以及读/写操作的传统回发.

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

观察到以下浏览器错误

XMLHttpRequest无法加载https://login.windows.net/xxx.
请求的资源上不存在“Access-Control-Allow-Origin”标头.
因此不允许原点’xxx’访问.

我已经研究过adal.js和以下帖子,但不确定adal.js是否是我的应用程序类型的解决方案
或者如何最好地融入它以使其适用于我的应用程序类型.

到目前为止我的理解:

我没有使用AngularJS.

我没有开始通过JavaScript进行身份验证,而我的身份验证不是JavaScript驱动的,无法从adal.js中受益.

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

我偶然发现了维托里奥·贝尔托奇(Vittorio Bertocci)的各种相关帖子,但都没有提到这种类型的MVC应用程序设计的特殊性.

ADAL,Windows Azure AD and Multi-Resource Refresh Tokens

WAAD doesn’t refresh access token from javascript

Combining ADAL.Net and ADAL.js

AngularJS + ADAL.JS set Resource ID (Audience)

解决方法

您的设置问题是您使用cookie来验证AJAX调用. Cookie实际上并不适合这种情况,当您需要在域外进行调用和/或Cookie过期时,通常会出现限制.事实上,这是一种常见的方法,主要是由于对auth的适当SPA支持在一段时间内不可用的事实而进化的步骤,并不能使其成为一种好的方法.

您可以自由地坚持当前的方法,但这会导致一些痛苦.没有建立从JS触发会话cookie更新的机制.虽然这可以被黑客攻击,但我们没有这样的样本 – 主要是因为它是一个黑客:)基本情况似乎很容易,但是一旦你开始考虑所有可能的情况(如果你的应用程序会话到期时会发生什么,用户是否已从Azure AD注销并使用其他帐户登录?).

最简单的方法是放弃混合方法.如果你想成为一个JS应用程序,你可以消除所有服务器驱动的登录,并且仍然保留服务器端流程的能力(通过onbehalf of grants,如
https://github.com/AzureADSamples/WebAPI-OnBehalfOf-DotNet).如果你不想,你甚至不需要转换成角度,见
https://github.com/AzureADSamples/SinglePageApp-jQuery-DotNet.

如果你想成为一个基于回发的应用程序,你可以删除JS部分(虽然这听起来很痛苦).

TL; DR:通过cookie保护AJAX呼叫不是一个干净的解决方案,你一定会感到有些痛苦.您的选择是在将问题与临时黑客修补,或者重构为更规范的方法之间.关于这些坏消息我很遗憾 :(

作者: dawei

【声明】:滨州站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

为您推荐

联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部