この質問をする前に、ウェブを検索するために最善を尽くしました。 stackoverflowで同様の質問を見てきましたが、長い間満足のいく回答がありませんでした。これは、この繰り返し発生する質問に答えてもらうもう1つの試みです。
問題
イントラネットユーザーには「Windows Auth」を使用し、インターネットユーザーには「Forms Auth」を使用するASP.NET MVC 5 Webサイトを構築する方法ASP.NET Identityを使用してこれを実現したいと思います。さらに、承認にActive Directoryグループを使用したくありません。イントラネットユーザーの場合、Active Directoryを使用してユーザーを認証し、ASP.NET IDにフォールバックして、ロールと他のプロファイルデータを管理します。
エンドユーザーに認証方法を選択するように依頼しないといいでしょう。 Webアプリはイントラネットユーザーにシームレスにログインする必要があります。ログイン画面があることさえ知らないはずです。同様に、インターネットユーザーはドメイン資格情報の入力を求められるべきではありません。フォームベースのログイン画面がすぐに表示されます。
これを解決するための推奨される方法はありますか?または、次のいずれかが適切な解決策である場合、コメントできますか?
http://world.episerver.com/blogs/Dan-Matthews/Dates/2014/8/Mixing-Forms-and-Windows-Authentication/
https://github.com/MohammadYounes/MVC5-MixedAuth
参考までに2004年の記事ですが、今は役に立たない可能性があります。 https://msdn.Microsoft.com/en-us/library/ms972958.aspx
IIS構成
匿名認証ステータスを有効にするIISサイト全体およびルートディレクトリ下の一部のフォルダー(たとえば、/ WindowsLogin)のWindows認証。このフォルダーにaspxファイルを配置します(WebFormsの場合)プロジェクト)またはApiControllerを作成します(MVCプロジェクト用)。
サイトのセットアップ
ログインページに「Windows/ActiveDirectoryアカウントでログイン」ボタンを追加します(Twitter、Facebook、Gmailなどでログインボタンを追加するのが一般的な方法と同様の方法で)。ユーザーがこのボタンを押すと、/ WindowsLoginフォルダー内のページまたはコントローラーにリダイレクトされ、Windows認証が必要になります。サイトがシングルサインオン機能を使用する場合、そのページまたはコントローラーでそれを見つけます。それ以外の場合は、Windowsユーザーのセッションをそこに保存します。ユーザーがそのページまたはコントローラーにアクセスした場合、それらは既にWindowsユーザーとして認証されていました。
考えられる方法の1つは、IISで2つのサイトを作成することですが、サイトのソースが配置されている同じターゲットフォルダーを持ちます。最初のサイトは、Windows認証モードが有効で80ポートにバインドされている内部ユーザー向けであり、2番目のサイトは、匿名モードが有効で8080ポートにバインドされている外部ユーザー向けです。次に、ファイアウォールでNATを構成する必要があります。ローカルネットワークまたはVPN内からのすべての要求は、ポート80のローカルIISサーバーにリダイレクトされ、インターネットからのすべての要求は、 IISサーバーのポート8080にリダイレクトされます。
この用語は混合モード認証です。これを複数回行いました。メインサイトを微調整するだけです。これが私がそれをやった方法です。
メインのMVCサイトはそのままにしておきますが、Windows Authの下で匿名として実行します。
内部サイト
リダイレクトURLサイトの作成:このサイトをWindow Authとして設定し、Active DirectoryからユーザーIDを取得できるようにします。ユーザーにこのURLを提供するか、ユーザーがイントラネットをクリックするリンクにします。次に、このサイトはMVCサイトを呼び出し、ユーザー資格情報(ログインID)を渡します。
a。これは、URLの暗号化された文字列またはCookieの暗号化された値を介して実行できます。有効期限の日付/時刻値で暗号化することもできます。
b。 (フォーム認証から言えば)そのユーザーIDでフォーム認証チケットを作成します。他のログインロジックを実行します。できた.
外部サイト-変更は必要ありません。ユーザーにそのままログインさせます。
私は以前の仕事でこのことの概念実証を行ったので、詳細は曖昧であり、参照するコードはありません...
要件は次のとおりです。
私が思いついたソリューションの核となるアイデアは、Active Directoryグループポリシーを使用してカスタム文字列をhttp要求ヘッダーユーザーエージェントに追加することでした。コンテンツは重要ではなく、実際には長いランダムな文字列を使用しました。
https://technet.Microsoft.com/en-us/library/cc770379.aspx
次に、サイトのランディングページがこれをチェックし、見つかった場合、Windows認証を使用してADアカウントをチェックした仮想ディレクトリにリダイレクトし、ASP.NET認証トークンを入力して、ホームページにリダイレクトします。
カスタムヘッダーがない場合は、通常のログインフォームが表示されます。
他の唯一のことは、ドメインユーザーが非Windowsデバイス(iPad)からサイトにアクセスした場合、通常のログイン詳細を使用できるように、ADメール/パスワードチェックを通常のログインフォームに追加することでした。
1つのURLからフォームとAD認証を処理したいですか?私は、thinktecture(クレームベースの認証)をWIFのフレームワークとして使用し、さまざまな形式の認証をマーシャリングしました。ただし、あるURLからの場合、ユーザーをADまたはFormsベースに関連付けるログイン時のロジックを処理する必要がありました。より最近のプロジェクトでは、これはユーザーアカウントを作成したときにユーザー管理で処理されました(フォーム認証のADに関連付けられていました)。次に、ユーザーがログインすると、ログインの一部としてADドメイン名の前に付けられます。これを実装する方法はいくつかありますが、これは私が使用したものの1つにすぎません。例では、ドメインを要求する代わりに、ユーザー名を使用し、ユーザー名のADまたはフォームベースのフラグを確認し、それに応じて認証を処理します。
[〜#〜] edit [〜#〜]質問を読み直す際の更新です。インターネットユーザーとイントラネットユーザーは同じですか?その場合は、全面的にフォームベースの認証を行い、ADとは無関係に製品DBのユーザーを管理する必要があります。同じであれば、ドメイン名をユーザー名の前に置いてログインできます。 ADのみに依存する場合。
Webサイトのコードをサーバーに配置し、2つの別々のWebサイトにロボコピーして、web.configを構成することで認証の変更を処理するだけです。 (1つは匿名でセットアップされ、もう1つはWindows認証でセットアップされます。)
他の方法ほどおしゃれではありませんが、比較的簡単です。 2つのサイトがありますが、コンテンツ(web.configを除く)は同一です。