sidebarIdM実験室いろんなアイデンティティ管理系製品やサービスの実験の記録をしていきます。後は、関連するニュースなどを徒然と。先日のポストの続きです。Directory(AAD)でのログオンを行いました。Providerへの流用の可能性を考えるために、Implicitフローで使われるfragmentを使ってid_tokenを受け渡す場合の工夫について試してみます。※尚、現状AADではImplicitフローをサポートしているという表明があるわけではないので、今回紹介するのはあくまでImplicitもどきです。Clientではどのような流れでid_tokenが発行されるのか?、AADではどうなるのか?についてみておきたいと思います。15の日本語訳http://openid-foundation-japan.github.io/openid-connect-implicit-1_0.ja.html大まかな流れは、以下のようになっています。取得する.具体的には以下のような通信が行われます。&nonce=n-0S6_WzA2Mjresponse_typeにid_tokenおよびtokenを付けて要求を投げる必要がある(REQUIRED)、というのが仕様です。現状でAADはresponse_typeにtokenをサポートしていないので、id_tokenだけを要求することにします。前述の通り、AADではresponse_modeの初期値がform_postなので、Implicit(もどき)の場合はresponse_mode=fragmentをつける必要があります。結果、以下のようなリクエストになります。&nonce=zzzzz3~4End-Userの認証、同意取得この部分は仕様のスコープ外なので手段は問いません。AADではws-federationを使ってhttps://login.microsoftonline.comへ認証要求を投げ、ユーザ認証を行います。&id=認証が成功するとhttps://login.windows.net/{tenantid}/wsfederationに対してSAMLトークンがPOSTされ、認証結果およびユーザ情報が渡されます。5id_tokenをクライアントへ返すHTTP302でredirect_uriへ戻します。その際、フラグメント(#)にid_tokenなど要求されたトークンを付加します。&state=af0ifjsldkjAADの場合は、先ほどのリクエストでtokenを要求できませんでしたので、id_tokenのみが返ってきます。&session_state=zzzzz6返ってきたid_tokenを検証するid_tokenがフラグメントで返ってきますので、UserAgent(ブラウザ等)上でパラメータを解析してクライアントへ送ってあげる必要があります。通常はJavaScriptでlocation.hashを解析してクライアントへid_tokenなどをPOSTしてあげます。今回もredirect_uriに指定したページ(https://localhost:44307/Account/Fragment/)へのGETリクエストすると以下のようなJavaScriptを含むHTMLを返すようにしています。Middlewareが動いているASP.NETアプリケーション(https://localhost:44307)へPOSTされ、自動的にトークン検証~ユーザ情報の取り出しを行ってくれます。ここまでのフローをざっとシーケンスにしたものが以下の図です。Middlewareではフラグメントでわたってきたid_tokenをUserAgent側で解析してPOSTする部分が用意されていないので、その部分だけは作ってあげる必要があります。具体的にはViewを一つ用意して、そのエンドポイントに対するGETがあった場合に先のJavaScriptを含むHTMLを返すようにします。以下の手順で実装しました。Viewを追加します。先のシーケンスの中にも出てきたように、今回はエンドポイントの名前を「Fragment」としています。新規作成されたfragment.chtmlに先のJavaScriptを含むHTMLを記載します。Controllerにアクションを定義します。AccountController.csに以下のコードを追記します。View();}また、OWINの認証設定部分(Startup.Auth.cs)に以下の設定を入れます。});これで実行すると前回と同じような動きに見えますが、裏側ではImplicit(もどき)でid_tokenが受け渡されます。Connect対応について話をしました。遅ればせながらフォローアップをしていきたいと思います。当日の資料はこちらです。Connectセキュリティ・ミドルウェアを使ってASP.NETのMVC5のWebアプリケーションで接続(ログイン)してみる、ということをやってみます。Connect対応の特異点となっているresponse_modeパラメータの動きについても解説していきます。OPが対応しているresponse_mode="fragment"の場合に必要な工夫という2回でお伝えしていきます。Connectを使って接続する例についても解説していければと思います。基本的な設定と動作について確認していきます。中身のプロトコルの解説を細かくする前にまずは動きをつかんでもらうことが目的です。Studioを起動し、ASP.NET/MVC5のWebアプリケーションを新規に作成します。・NuGetを使いMicrosoft.Owin.Security.OpenIdConnectをインストールします。現状プレビュー版のパッケージなのでリリース前のパッケージを含めて、「openidconnect」で検索すると出てきます。・SSLを有効にします。これはAADに設定するアプリケーションにはHTTPSが必須なため必要な設定です。ソリューションエクスプローラでプロジェクトのプロパティを開き、[SSL有効]をTrueに設定します。結果、自動的にSSLのURLが生成されます。次に、メニューより[プロジェクト]を選び[プロパティ]を開き、WebメニューからプロジェクトのURLを先ほど割り当てられたSSLのURLを設定し、保存します。・AADの管理画面へアクセスしアプリケーションの新規作成を行います。以下の設定を行います。Studioで作成したアプリケーションのURL(HTTPS)アプリケーションID/URI:任意(テナント内で一意)作成が完了したら構成メニューより割り当てられたクライアントIDをコピーしておきます。ソリューションエクスプローラから、App_Start\Startup.Auth.csを開き、以下を追記します。}});以上で準備は完了です。MVC5のアプリケーションが起動しますので、右上のログインをクリックします。・ログイン画面に遷移するので、右側に表示される[OpenIdConnect]をクリックします。・AADのログイン画面に遷移するので組織のアカウントでログインします。・ASP.NETアプリケーションにアカウントが存在しないので関連付けを行います。ちなみにこのアカウントはAspNetUsersテーブルに格納されますので、サーバエクスプローラから確認・編集ができます。・ログインが完了し、ユーザ名が表示されます。以上がとりあえず動くところまで、の手順です。少ないコード量で実現できることがわかります。■内部での通信シーケンスの解説では、内部の動作について確認してみます。細かく解説すると非常に面倒なフローなので、ざっくり解説すると以下の様になっています。Connectのresponse_modeというパラメータで決まってくるのですが、この流れを見るとAAD/OWINではform_postというタイプを使っていることがわかります。この部分がAADの特徴的な部分となっているので後ほど解説します。以下が通信シーケンスの全体像です。Connectの仕様を見ると本パラメータは以下の様に定義されています。bodyで、Implicitフローではフラグメント(URLの後の#以下)でというのが標準的?です。先の通信シーケンスをみるとわかるようにAAD/OWINではid_tokenをJavaScriptで自動的にクライアントへPOSTするようなフォームを含むHTMLをUserAgentへ返すことで、id_tokenをクライアントへ渡しています。この方法(response_mode)をform_postと呼びます。現状、AADにおけるresponse_modeはこのデフォルトのform_postおよびfragment(Implicitで使われる)およびquery(GETパラメータで渡す)の3つがサポートされます。Connectのid_tokenならそこまで気を遣わなくても大丈夫、という考え方なのかも知れません。これは#idconでも話したように推測でしかないのですが、これまでASP.NETがサポートしてきたws-federationやSAML-Pなどのプロトコルと同じ動きをさせることでミドルウェアの実装を簡素化する、というのが真相なのかも知れません。OP(現状あまりresponse_mode自体をサポートしているOPが少なく、かつform_postをサポートしているところはほぼない)との相互接続に問題が起きやすいので、response_mode="fragment"で構成されたOPをASP.NET/OWINで使う場合にどうすれば良いのか、について次回解説したいと思います。よりアクセス解析を行っています。品質向上のみを目的とし、個人の特定などを目的とはしておりません。中で公開されることはあります。問い合わせ不明点等は管理人までご連絡ください。本プライバシーポリシーは予告なく変更/削除することがあります。プライバシーに関するトラブルについては一切の責任を負いかねますのでご了承ください。