Web アプリケーション内からクライアント マシン上のユーザーの ActiveDirectory 資格情報を取得することは可能ですか?
明確にするために、クライアントのイントラネットでホストされる Web アプリケーションを設計しています。
アプリケーションにアクセスするときに、アプリケーションのユーザーに資格情報の入力を求めないようにする必要があります。代わりに、クライアント マシンにログオンしているユーザーの資格情報を、ユーザーの操作なしで自動的に取得する必要があります。
Web アプリケーション内からクライアント マシン上のユーザーの ActiveDirectory 資格情報を取得することは可能ですか?
明確にするために、クライアントのイントラネットでホストされる Web アプリケーションを設計しています。
アプリケーションにアクセスするときに、アプリケーションのユーザーに資格情報の入力を求めないようにする必要があります。代わりに、クライアント マシンにログオンしているユーザーの資格情報を、ユーザーの操作なしで自動的に取得する必要があります。
絶対。これは、イントラネット アプリケーションで特に役立ちます。
環境を指定しなかったので、.NET であると仮定しますが、もちろんそれが唯一の方法ではありません。
Active Directory はLDAPを使用して簡単に照会できます。.NET を使用している場合は、このコード例または以下の例のようなことができます。SQL 環境内でも同様に実行できます。
認証を処理するために Windows だけが必要な場合は、たとえば、Windows 認証用に .NET Web アプリを設定できます。アプリケーションの IIS 内での匿名ログインをオフにしてください。完了したら、ユーザーの Windows ログオン名にアクセスし、それを使用してさらにセキュリティ チェックを行うことができます (たとえば、ADのグループ/ロール メンバーシップ)。
Enterprise Library のSecurity Application Blockなどを使用して、混乱全体を簡素化することもできます。
C# の短い例を次に示します (ここでVB.NET に変換します) 。
using System.DirectoryServices;
/// <summary>
/// Gets the email address, if defined, of a user from Active Directory.
/// </summary>
/// <param name="userid">The userid of the user in question. Make
/// sure the domain has been stripped first!</param>
/// <returns>A string containing the user's email address, or null
/// if one was not defined or found.</returns>
public static string GetEmail(string userid)
{
DirectorySearcher searcher;
SearchResult result;
string email;
// Check first if there is a slash in the userid
// If there is, domain has not been stripped
if (!userid.Contains("\\"))
{
searcher = new DirectorySearcher();
searcher.Filter = String.Format("(SAMAccountName={0})", userid);
searcher.PropertiesToLoad.Add("mail");
result = searcher.FindOne();
if (result != null)
{
email = result.Properties["mail"][0].ToString();
}
}
return email;
}
ドメイン コントローラを指定する必要はありません。DirectorySearcher の空/既定のコンストラクターを実行すると、自動的に検索が試行されます。実際、これが推奨される方法です。
Windows 統合認証、ユーザーは IE を使用する必要があり、サイトはユーザーの信頼済みサイトにある必要があります。これらが当てはまる場合、IE は Windows セキュリティ トークンを Web サイトに渡し、それで認証します。これは、イントラネット上の SharePoint で行っています。そうしないと、制限されているものにアクセスするのが面倒です。ドキュメントをクリックするたびにプロンプトが表示されます。
.NET にはもっと直接的な方法があるのかもしれませんが、PHP では Active Directory サーバーに LDAP サーバーとしてアクセスするだけです。
これを行うためにサーバーにどのような調整が必要かはわかりません。サーバーをセットアップしませんでした。クエリを実行するだけです。PHP の使用を推奨しているわけでもありません。LDAP を扱う方が簡単で、Active Directory に直接結び付けようとする方が簡単だと思います。
いいえ、もちろん違います。ランダムな Web アプリが AD のユーザー名とパスワードを取得できるという大混乱を想像できますか?
ここで、ユーザー名だけが必要な場合 -統合された Windows authを使用している場合、それは REMOTE_USER にあります。また、ドメイン(または信頼)を共有していると仮定すると、Windows認証はユーザーをサイトに自動ログインさせます。
編集: IWA はイントラネット シナリオで機能します。IE には既定でイントラネット サイトがイントラネット セキュリティ ゾーンに含まれているためです。また、システム管理者は GPO を使用して他の信頼できるサイトを設定できます。Firefoxは、 OperaやChromeと同様にNTLM もサポートしています。全体として、イントラネットをセットアップするのは悪い方法ではありません。
ただし、資格情報を取得しないことに注意してください。クライアントとトークンをネゴシエートします。これにより、IWA が安全に保たれます (上記のポイントに関連します)。