ASP.NET アプリケーションからログインしている Windows ドメイン アカウントを取得するにはどうすればよいですか?
質問
独自のユーザー、ロール、権限データベースを管理する ASP.NET アプリケーションがあり、最近 Windows ドメイン アカウントを保持するフィールドを User テーブルに追加しました。
ユーザーがそうする必要がないようにしたい 物理的に アプリケーションにログインしますが、現在ログインしている Windows ドメイン アカウント DOMAIN\username に基づいて自動的にログインされます。Windows ドメイン アカウントを独自の User テーブルに対して認証したいと考えています。
これは Windows フォームで行うのは簡単ですが、Web フォームで行うことは可能でしょうか?
ユーザーに Windows のチャレンジ画面が表示されるのではなく、システムがログインを処理するようにしたいのです。
説明:独自のカスタム Principal オブジェクトを使用しています。
説明:違いがあるかどうかはわかりませんが、IIS7を使用しています。
解決
私は数年前にあなたがやりたいこととほぼ同じことをしました。コードを見つけようとしていますが、前の仕事で使用したものなのでコードは家にあります。
使ってたけど覚えてる この記事 私の出発点として。LDAP プロバイダーをセットアップして、実際にユーザーと LDAP のチェックを実行できるようにします。LDAP アプローチを試す場合に確認しなければならないことが 1 つあります。LDAP をセットアップする設定ファイルで、LDAP がすべて大文字であることを確認してください。そうでない場合は解決されません。
他のヒント
この種の統合はサーバー レベルで行われ、ユーザーがログインしていないかどうかを判断するのは IIS です。そして、認証プロンプトをユーザーに送り返すのは IIS であり、ブラウザーはそれに反応します。
ドメイン ログインを使用したい場合、これを行う方法は 1 つだけです。 統合 Windows 認証. 。これは、IIS サーバーもドメインの一部であり、ユーザーがプロキシ経由ではなく、同じくドメインの一部であるマシンから (ユーザーが適切にログインしている状態で) マシンに直接アクセスしている場合にのみ機能します。
ただし、カスタム プリンシパル オブジェクトは楽しみやゲームを生み出す可能性があります。このタイプの認証は WindowsPrincipal と WindowsIdentity になります。User オブジェクト経由でアクセスできます (「 方法:ASP.NET 2.0 で Windows 認証を使用する)
カスタム ロールのためにカスタム プリンシパルが必要だと思いますか?二人をうまく演奏させることができるとは思えません。カスタムを作成できます ロールプロバイダー これはデータストアを参照するか、あなたが参照できるものを参照します アダム, 、AD の拡張機能で、プログラムごとに役割を提供し、優れた管理ツールが付属しています。
using System.Security.Principal;
...
WindowsPrincipal wp = (WindowsPrincipal)HttpContext.Current.User;
現在のドメイン ユーザーを取得します。もちろん、IIS が Windows 認証を処理できるように設定されていることを確認する必要があります。
これは役立つかもしれません:
WindowsIdentity myIdentity = WindowsIdentity.GetCurrent();
WindowsPrincipal myPrincipal = new WindowsPrincipal(myIdentity);
string name = myPrincipal.Identity.Name;
string authType = myPrincipal.Identity.AuthenticationType;
string isAuth = myPrincipal.Identity.IsAuthenticated.ToString();
string identName = myIdentity.Name;
string identType = myIdentity.AuthenticationType;
string identIsAuth = myIdentity.IsAuthenticated.ToString();
string iSAnon = myIdentity.IsAnonymous.ToString();
string isG = myIdentity.IsGuest.ToString();
string isSys = myIdentity.IsSystem.ToString();
string token = myIdentity.Token.ToString();
免責事項:Technet の記事からこれを入手しましたが、リンクが見つかりません。
使用できます System.Threading.Thread.CurrentPrincipal
.
Request.ServerVariables["REMOTE_USER"]
これはあなたのセットアップでは検証されていませんが、しばらく前にこれを使用したことを覚えています。
Request.ServerVariables("LOGON_USER") を試してください。
このディレクトリが匿名ユーザーを許可しないようにディレクトリ セキュリティ オプションが設定されている場合、サーファーがこのページにアクセスすると、ユーザー名とパスワードを求める標準のモーダル ダイアログが表示されます。Request.ServerVariables("LOGON_USER") はそのユーザーを返します。
ただし、独自のカスタム セキュリティ オブジェクトを使用しているため、これはおそらく機能しません。このログオン ボックスを回避する方法、または NT 資格情報を要求される前にサイトに渡す方法を理解できれば、準備は完了です。
なりすましについて考えたことはありますか?ユーザーの NT ログオン資格情報をカスタム セキュリティ オブジェクトに保存し、必要に応じてコードを介してユーザーを偽装することができます。
http://msdn.microsoft.com/en-us/library/aa292118(VS.71).aspx