web-dev-qa-db-ja.com

フォーム認証とWindows認証の混合

フォーム認証を使用するように設計された(ASP.NET 3.5)イントラネットアプリケーションがあります(既定のaspnetメンバーシップシステムと共に)。また、主キーをaspnet_usersテーブルと共有する別のテーブルにユーザーに関する追加情報を保存します。

ドメインの一部であるユーザーの場合、ドメインアカウント名をセカンダリユーザーテーブルに保存し、ドメインアカウント名がテーブルに保存されている名前と一致するユーザーに自動的にログインします。

利用可能なガイドを読みました-それらはすべて2年以上前のものであり、ドメインアカウント名を抽出できる別のログインページでWindows認証をアクティブにできると想定しています。ただし、IIS7ではこれは不可能です(全体の認証方法はすべてのページに適用され、選択的に無効にすることはできず、両方の認証方法を同じページに適用することはできません)。

IISを取得し、リクエストしているユーザーのWindowsドメインアカウント名を渡す方法はありますか?ドメイン名だけで、適切なAD認証は必要ありません。

48
dr_draik

実際、あなたはそれをすることができます。 @dr_draikには少し遅れましたが、これはGoogleの結果に現れたので、知識を共有すると思いました。

クラシックモードの場合-Windows認証とフォーム認証の両方を有効にします。両方を同時に実行できないという警告が表示されますが、 無視 を実行できます。次に、コードのようなさまざまなプロパティを探索します。

HttpContext.Current.Request.ServerVariables["LOGON_USER"]

そしてそこからユーザー名を釣ります。

統合モードの場合- 4021905 IIS7チャレンジベース認証とログインリダイレクトベース認証は同時に使用できません は、 IIS 7.0フォーム認証とWindows認証による2レベル認証 につながります=これは、さまざまなページの認証を選択的に変更できるモジュールです。

47
Dan F

IIS7では、常に2つの個別のアプリケーションをセットアップできます。 Windows認証を有効にします。もう1つは、フォーム認証を備えたメインアプリです。ユーザーがWindows認証アプリにアクセスすると、ページで資格情報を取得し、フォーム認証アプリに渡すことができます。

4
David

(情報の完全性のための詳細)

私はしばらく前に会議で.Netセキュリティ担当者にこの質問をしました。彼の返答は、技術的には可能であるということでしたが、彼はそれを見たことはありませんでした(そして、私がそれをやればうまくいくかどうかを彼に知らせるために!) 。

彼は、独自のISAPIフィルターを作成し、それをIISにインストールすることでそれができる方法を提案しました。 ISAPIフィルターは要求をインターセプトし、基本的に、統合認証を使用するときにIISが行うジョブを実行しますが、これが存在しない場合はフォームの使用にフォールバックします。ただし、これはIIS6用であるため、IIS7では異なる場合があります。

これは技術的には可能かもしれませんが、このルートはお勧めしませんちょっとしたハックのように感じます。そして、あなた自身のセキュリティをロールすることは決して良いアイデアではありません(あなたがreally何をしているのか知っている)。

4
adrianbanks

アプリへの匿名アクセスを許可してフォームを使用するように構成を設定することにより、認証を混合する方法に関する記事がたくさんあります。次に、IIS設定が匿名を拒否し、統合認証を使用するように設定された統合認証のページを作成する必要があります。そこでは、requetsのServerVariablesコレクションの "Logon_User"最後に、統合認証のためにユーザーにサイレントサインインするには、短いホスト名を使用する必要があるため、フォーム認証部分がFQDNを介してインターネットに公開される場合、短いホストページへのリダイレクトが必要になります。 IIS 2つの仮想ディレクトリで1つのアプリケーションのみで実現します。

1
dexter

特別なアドオンを使用しないソリューションを見つけました。それはトリッキーであり、ここで参照されているすべてのページの要素を一緒に組み合わせることが含まれていました。私はそれについて投稿しました: http://low-bandwidth.blogspot.com.au/2014/11/iis7-mixed-windows-and-forms.html

本質的に、フォーム、ウィンドウ、および非認証を有効にする必要があります。ログイン画面はフォームベースである必要があり、Windowsログインをトリガーするボタンを含む必要があります。これにより、HTTP 401応答チャレンジが発行され、成功するとフォームベースのログインチケットが作成されます。

問題はかなり複雑で、投稿では原則とソリューションを詳細に説明します。

1
Ben McIntyre

残念ながら、あなたがやろうとしていることはサポートされていません。 ASP.NETがWindowsユーザー名を知るためには、Windows認証を使用する必要があります。

ユーザー名情報を別のページに転送するだけの別のサイト/仮想ディレクトリを設定できます。しかし、非Windows認証ユーザーがログインしようとするとどうなりますか?

0
Bryan

私はあなたが試すことができるものを持っています-それが機能するかどうかはわかりません。

過去にRequest.ServerVariables["LOGON_USER"]を使用しましたが、明らかにこれが空でない値を返すためには、匿名アクセスを無効にする必要があります。

この記事を参照してください: http://support.Microsoft.com/default.aspx/kb/306359

IIS側で匿名アクセスを維持し、フォーム認証を行うことをお勧めしますが、次のように匿名ユーザーを拒否します。

<authorization>
   <deny users = "?" /> <!-- This denies access to the Anonymous user -->
   <allow users ="*" /> <!-- This allows access to all users -->
</authorization>
0
Krip