トップ回答者
ASP.NET~Classic ASP間の認証情報の受け渡しについて

質問
-
お世話になります。
現在、Windows Server2008(IIS7)上で稼働するClassic ASPアプリケーションに対し、
サイト全体をフォーム認証で保護する構成を検討しております。
フォーム認証はASP.NETを利用し、統合パイプラインモードで動作させた場合
認証チケット発行後のClassic ASP側に認証情報(Request.ServerVariables("AUTH_USER"))が
渡るのか確認したところ、Classic ASP側でRequest.ServerVariables("AUTH_USER")に値が入っていることを確認しました。
これは、当方にとっては意外な結果で、セッション情報は双方の間で共有されないし、
現にASP.NET側で設定したセッション変数にはアクセスできないことも確認しました。
この挙動について、詳細を述べている文献等ありますでしょうか?
なお、今回のフォーム認証の構成方法は以下のURLを参考にしました。
http://technet.microsoft.com/ja-jp/library/ff454025.aspx
回答
-
認証チケット発行後のClassic ASP側に認証情報(Request.ServerVariables("AUTH_USER"))が
渡るのか確認したところ、Classic ASP側でRequest.ServerVariables("AUTH_USER")に値が入っていることを確認しました。
これは、当方にとっては意外な結果で、セッション情報は双方の間で共有されないし、
現にASP.NET側で設定したセッション変数にはアクセスできないことも確認しました。
セッションは共有していないのになぜ認証情報は共通に使えているのか、という疑問という理解でいいですか?
そうと仮定して、簡単に言えば、ASP.NETでは、認証とセッションは完全に独立した概念で、まったく別の仕組みで動いているため、ASP.NETとClassic ASP間ではセッションは共有できなくとも、認証の結果を共有することはできる、というイメージですね。
なので、認証結果は共有できますが、ASP.NETフォーム認証にかかわる機能がClassic ASPから直接使えるわけではありません。
※セッションと認証を同一の仕組みでとらえていると分かりにくいかもしれません。
--追記
IIS7からの統合パイプラインモードによって、以前はASP.NETでしか使えなかったフォーム認証などの仕組み(の結果)を、Classic ASPからも利用できるようになりました。
IIS6以前ではこの機能がないので、SurferOnWwwさんが示しているサイトのようなトリックが必要ということです。
-
この挙動について、詳細を述べている文献等ありますでしょうか?
直接の情報ではないのですが、参考にされたページの関連ページで、それにかかわる記述があります。
ASP.NET 1.1 から Windows Vista および Windows Server 2008 の IIS 7 へのアップグレード
http://technet.microsoft.com/ja-jp/library/ff454035.aspx「フォーム認証での Windows ID が異なる」のところ
--------------
統合モードでは認証が単一の段階で実行されるので、この動作になっています。これに対して、クラシック モードでは、匿名アクセスを使用して IIS 7 で最初に認証が行われてから、フォーム認証を使用して ASP.NET で認証が行われます。このように、認証の結果は常に単一のユーザー、つまりフォーム認証ユーザーになります。フォーム認証ユーザーの資格情報が IIS 7 と ASP.NET の間で同期されるので、AUTH_USER/LOGON_USER は、これと同じユーザーを返します。
--------------
この記載自体は、ASP.NETでの統合パイプラインモードとクラシックモード の違いについて述べたものですが、統合モードでは「フォーム認証ユーザーの資格情報が IIS 7 と ASP.NET の間で同期されるので、AUTH_USER/LOGON_USER は、これと同じユーザーを返します。」という部分が重要になります。
つまり、フォーム認証の認証結果が、IISでの認証状態として同期されるため、IISで認証済みという状態と同じ動作となる→クラシックASPでも普通に認証済み状態(ユーザIDが取れる)となる。
すべての返信
-
Classic APS ほとんど知らない自分がレスするのもなんですが・・・
> これは、当方にとっては意外な結果で、セッション情報は双方の間で共有されないし、
> 現にASP.NET側で設定したセッション変数にはアクセスできないことも確認しました。Classic ASP と ASP.NET 間では、何もしないでセッションが共有できることはなさそうですが、以下のような方法はあるそうです。(これが質問者さんの環境で実現可能かどうかは分かりませんが)
How to Share Session State Between Classic ASP and ASP.NET (ASP.NET Technical Articles)
http://msdn.microsoft.com/ja-jp/library/aa479313.aspxただ、もっと重要なこととして、たとえセッションは共有できても、認証チケットは共有できない(セッションクッキーと認証クッキーは別物)ということがあります。
下記のような、統合のためのトリックがあるそうです。これも質問者さんの環境で実現できるかは分かりませんが、検討されてはいかがですか?
Tip/Trick: Integrating ASP.NET Security with Classic ASP and Non-ASP.NET URLs
http://weblogs.asp.net/scottgu/tip-trick-integrating-asp-net-security-with-classic-asp-and-non-asp-net-urls的外れだったら失礼しました。
【追伸】
> この挙動について、詳細を述べている文献等ありますでしょうか?
上記の件ですが、上に紹介した記事の後者の方に含まれる説明(以下に一部抜粋)でお役に立つでしょうか?
"Since the above page is a classic ASP file, I obviously don't have a "User.Identity.Name" property that I can use to identify the logged in user like I would in an ASP.NET page. However, I can retrieve the "AUTH_USER" ServerVariable value within classic ASP to obtain the username (ASP.NET automatically populates this before delegating the processing back to the classic ASP ISAPI). "
- 編集済み SurferOnWww 2014年11月12日 14:09 追伸追加
- 回答の候補に設定 佐伯玲 2014年11月13日 0:13
- 回答としてマーク 佐伯玲 2014年11月26日 5:32
- 回答としてマークされていない kotomina 2014年11月26日 6:18
-
認証チケット発行後のClassic ASP側に認証情報(Request.ServerVariables("AUTH_USER"))が
渡るのか確認したところ、Classic ASP側でRequest.ServerVariables("AUTH_USER")に値が入っていることを確認しました。
これは、当方にとっては意外な結果で、セッション情報は双方の間で共有されないし、
現にASP.NET側で設定したセッション変数にはアクセスできないことも確認しました。
セッションは共有していないのになぜ認証情報は共通に使えているのか、という疑問という理解でいいですか?
そうと仮定して、簡単に言えば、ASP.NETでは、認証とセッションは完全に独立した概念で、まったく別の仕組みで動いているため、ASP.NETとClassic ASP間ではセッションは共有できなくとも、認証の結果を共有することはできる、というイメージですね。
なので、認証結果は共有できますが、ASP.NETフォーム認証にかかわる機能がClassic ASPから直接使えるわけではありません。
※セッションと認証を同一の仕組みでとらえていると分かりにくいかもしれません。
--追記
IIS7からの統合パイプラインモードによって、以前はASP.NETでしか使えなかったフォーム認証などの仕組み(の結果)を、Classic ASPからも利用できるようになりました。
IIS6以前ではこの機能がないので、SurferOnWwwさんが示しているサイトのようなトリックが必要ということです。
-
この挙動について、詳細を述べている文献等ありますでしょうか?
直接の情報ではないのですが、参考にされたページの関連ページで、それにかかわる記述があります。
ASP.NET 1.1 から Windows Vista および Windows Server 2008 の IIS 7 へのアップグレード
http://technet.microsoft.com/ja-jp/library/ff454035.aspx「フォーム認証での Windows ID が異なる」のところ
--------------
統合モードでは認証が単一の段階で実行されるので、この動作になっています。これに対して、クラシック モードでは、匿名アクセスを使用して IIS 7 で最初に認証が行われてから、フォーム認証を使用して ASP.NET で認証が行われます。このように、認証の結果は常に単一のユーザー、つまりフォーム認証ユーザーになります。フォーム認証ユーザーの資格情報が IIS 7 と ASP.NET の間で同期されるので、AUTH_USER/LOGON_USER は、これと同じユーザーを返します。
--------------
この記載自体は、ASP.NETでの統合パイプラインモードとクラシックモード の違いについて述べたものですが、統合モードでは「フォーム認証ユーザーの資格情報が IIS 7 と ASP.NET の間で同期されるので、AUTH_USER/LOGON_USER は、これと同じユーザーを返します。」という部分が重要になります。
つまり、フォーム認証の認証結果が、IISでの認証状態として同期されるため、IISで認証済みという状態と同じ動作となる→クラシックASPでも普通に認証済み状態(ユーザIDが取れる)となる。
-
> 認証を得るとIIS上で資格情報を獲得し、ASP.NETとIISで資格情報が同期される仕組みがIIS7から追加された、
> という感覚でしょうか。理解が違うのでは?
IIS6 でも IIS7 でも、先の私のレスで紹介した記事(2 つあるうちの後者の方。それはもともと IIS6 の記事です)の "I can retrieve the "AUTH_USER" ServerVariable value within classic ASP to obtain the username (ASP.NET automatically populates this before delegating the processing back to the classic ASP ISAPI). " という点は同じです。
詳しく書くと、(1) まず、ASP.NET のフォーム認証機能がユーザー認証を行う、(2) 認証後、ASP.NET が "AUTH_USER" ServerVariable に認証済みユーザー名を設定する(IIS ではなくて ASP.NET の機能)、(3) Classic ASP ISAPI に制御が渡る、(4) それゆえ、(ASP.NET と同じアプリケーションにある)Classic ASP 側で "AUTH_USER" ServerVariable から認証済みユーザー名が取得できる・・・と言っています。
- 編集済み SurferOnWww 2014年11月27日 0:54 一部追記