6

私が構築したMVCアプリケーションのタイプには固有の設計上の欠陥があり、私は実現するのが初めてではないと信じています。MVC AD Azureリフレッシュトークン(ADAL JavaScript AjaxとKnockoutJs)

私はユーザーが認証およびHome.cshtmlロードされるとしたら、KnockoutJsはJavaScript AJAXを実行するために使用される

Developing ASP.NET Apps with Azure Active Directory

次の方法でアプリケーションに導入されたAD Azureの認証を利用して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経由で認証を開始しません。私の認証は、adal.jsの恩恵を受けるためにJavaScriptではありません。

認証はサーバー側で行われ、その後の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

セットアップの問題は、あなたがAJAX呼び出しを認証するためにクッキーを使用していることです。クッキーはそれにはあまり適していません。通常、ドメインの外に電話をかける必要があるときやクッキーの有効期限が切れたときに、このアプローチの限界が現れます。一般的には、認証のための適切なSPAサポートがしばらく利用できなかったという事実のために進化のステップであるという共通のアプローチであるという事実は、それを良いアプローチにしていません。 あなたは現在の方法を自由に使うことができますが、それは痛みの原因になります。 JSからセッションCookieを更新するための確立されたメカニズムはありません。それは一緒にハッキングすることができますが、そのためのサンプルはありません - 主にハックだからです:)基本的なケースは十分に簡単ですが、すべての可能なケースを考慮するようになるとすぐに(アプリケーションセッションが終了した場合、ユーザーはAzure ADからログアウトし、別のアカウントでサインインしましたか?)。 最も簡単なアプローチは、ハイブリッドアプローチを放棄することです。 JSアプリになりたい場合は、サーバ側のログインをすべて削除して、サーバ側のフローをそのまま維持することができます(https://github.com/AzureADSamples/WebAPI-OnBehalfOf-DotNetのような許可のonbehalf経由)。あなたがしたくない場合は、角度に変換する必要もありません。https://github.com/AzureADSamples/SinglePageApp-jQuery-DotNetを参照してください。 ポストバックベースのアプリケーションにしたい場合は、JSの部分を削除することができます(ただし、痛い)。

TL;クッキーによるAJAXコールの保護は、クリーンな解決策ではなく、あなたは痛みを感じるようになります。あなたの選択肢は、アドホックハッキングの問題にパッチを当てることです。リファクタリングはより正式なアプローチに向かっています。申し訳ありませんが悪いニュース:(

+0

今私の唯一のオプションは、ログインページへのクライアント側のリダイレクトを使用して、20分ごとにポストバックし、リフレッシュトークンエラーを処理するために非表示のHTML IFrameを使用することです。 – puri

+0

これは数ヶ月ですしかし、私は今この同じ問題を経験しています。あなたの解決策は何ですか?どのようにクライアント側でトークンエラーをキャッチしていますか?ありがとう。 – Namrehs

関連する問題