6

我已经构建的MVC应用程序类型存在固有的设计缺陷,我相信我不是第一个意识到的。MVC AD Azure Refresh令牌通过ADAL JavaScript Ajax和KnockoutJs

我有一种利用被引入到应用程序以下列方式

Developing ASP.NET Apps with Azure Active Directory

一旦为用户被认证和Home.cshtml负载,KnockoutJs用于执行的JavaScript AJAX AD天青认证的MVC 4应用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)

回答

8

您的设置的问题是,您使用的cookie进行验证AJAX调用。 Cookie并不适合这种情况,当您需要在域外拨打电话和/或cookie过期时,方法的局限性通常会显现出来。事实上,这是一种常见的方法,很大程度上是作为一个渐进的步骤,因为适当的SPA对auth的支持在一段时间内不可用,这并不是一个好方法。 你可以自由地坚持你目前的做法,但那会造成一些痛苦。没有建立从JS触发会话cookie更新的机制。尽管可以一起入侵,但我们没有这方面的示例 - 主要是因为它是一种黑客攻击:)基本案例看起来很简单,但只要您开始考虑所有可能的案例(如果您的应用会话过期,用户从Azure AD注销并使用其他帐户登录?)。最简单的方法是放弃混合方法。如果你想成为一个JS应用程序,你可以消除所有的服务器驱动的登录,并仍然保留做服务器端流程的能力(通过诸如https://github.com/AzureADSamples/WebAPI-OnBehalfOf-DotNet之类的赠款)。如果您不想要,甚至不需要转换为角度,请参阅https://github.com/AzureADSamples/SinglePageApp-jQuery-DotNet。 如果你想成为一个基于回发的应用,你可以放弃JS部分(虽然听起来很痛苦)。

TL; DR:通过cookie保护AJAX调用不是一个干净的解决方案,您肯定会感到一些痛苦。您的选择是通过专门的黑客修补问题或重构为更加规范的方法。对不起,我有一个坏消息:(

+0

我现在唯一的选择是使用一个隐藏的HTML IFrame来回发每20分钟,并使用客户端重定向到登录页面来处理刷新令牌错误 – puri

+0

我意识到这是几个月前,但是我现在遇到了同样的问题,你的解决方案是什么?你如何捕捉客户端的令牌错误?谢谢。 – Namrehs

相关问题