トップ回答者
Form認証でのWindowsにログオンしているアカウントを取得する方法

質問
-
現在、クライアントユーザーのPCにログオンしているユーザー名を取得してデータベースへログを出力したいと考えています。
実装したコードだとIISを実行しているユーザー名しか取れないことが判明して色々試したのですがローカルのユーザー名が
取得できませんでした。
ローカルユーザー名は取得できないものですか?それとも取得できますか?取得できる場合はどのようにすれば取得できる
のでしょうか?教えてください。
環境:IIS6.0(Form認証を使用するため匿名アクセス)
SQL Server 2008
.Net FrameWork 2.0
WebサーバーとDBサーバーはそれぞれ別のPC(サーバー)で稼働しています。
回答
-
※回答じゃないかもしれません。
- 他人がログオンしているPCを使ってシステムにログオンしてくる人がいるのでクライアントPCにログオンしているユーザー名を取得したい(システムにログオンしてくるユーザーは把握できる)
- 自分がログオンしているPCを使って他人のIDでログオンしてくるユーザーを把握したい(不正に他人のIDを利用している)
クライアントPCにログオンしているユーザーと同じユーザーでシステムにログオンしているかを知りたいので『PCにログインしているユーザー名』が取得したかったんです。これってやりすぎですか?
クラサバ(C/S)アプリケーションじゃないと難しい気がします。そもそも Web アプリケーションはクライアントを意識せずに動くシステムだと思っています。どうしても Web のみでやりたいのであれば Silverlight とか AxtiveX を駆使すればできるかもしれません。まあ、ユーザーを徹底して管理したいという意味で統合 Windows 認証があるのですが…。
結論としてはIISをWindows認証にしないとクライアントPCにログインしているユーザー名は取得できないので無理って事ですよね。ここまでやろうとすると裏ワザ的なやり方になってしまうという理解で大丈夫でしょうか?
答えじゃなくて補足なのですが、ここまでの話だと 統合 Windows 認証にすればログインユーザーを完全に把握できるような流れになっていますが、これはあくまでも PC にログインするユーザーがすべてドメインユーザーであることが前提です。ドメインユーザー以外で Web にアクセスすると認証画面が表示されるのでそこで他人のユーザー名とパスワードを入れてしまえば他人に成り済ますことができます。ドメインユーザーでもアクセス権限のあるページを開こうとするやはり認証画面が表示されるので成りすましは可能です。そこの認識は注意したほうがいいと思います。
ADで管理しているPCであれば Web でどうこうするよりもポリシー設定とか監視ツール入れたほうが楽なような気がしないでもないような…。
おのでら (http://sorceryforce.com/)
-
> PCにログインするユーザーの一部に複数名で使いまわすIDがあり、
> こういう人でもシステムでは個別に管理する事になっています。デバイス CAL を利用しているなどの理由で、ドメインユーザー
アカウントを複数名で使いまわしているのでしょうか?その状況で、Web にログインするユーザーは個人個人を特定した
いので、Web アプリを Forms 認証にして、各ユーザーに専用の
ID と Password 与えているということでしょうか? であれば、
ここで Windows 認証という選択肢はなくなりますね。上記の状況では、クライアントがアカウント情報を送信しない限
り、サーバー側で『PCにログインしているユーザー名』を取得す
る手段はありません。自分が知る限り、少なくとも ASP.NET に
はアカウント情報を送信するような機能はありません。解決策は、ユーザー CAL に変更して個人個人に専用のドメイン
ユーザーアカウントを与え、Web アプリを統合 Windows 認証に
するぐらいしか思いつきませんが、それは NG なんですよね。- 回答としてマーク echodev 2012年4月18日 5:43
すべての返信
-
> やっぱりForm認証では取得できないのでしょうか?
おのでらさんがレスされている通り、クライアント側からユーザー
情報を送信しない限り、サーバー側でユーザー名を取得する手段は
ありません。どうしても Forms 認証を使う必要があるなら、Forms 認証のユー
ザー名とドメインユーザー名を同じにしておいてはいかがですか。または、Froms 認証のユーザー情報に Active Directory の資格情
報ストアを使用して認証を行うという手もあります。セキュリティ保護された ASP.NET アプリケーションの構築 :
認証、認定、および通信のセキュリティ保護 Active Directory
でフォーム認証を使用する方法
http://msdn.microsoft.com/ja-jp/library/cc465526.aspxASP.NET からの Active Directory ドメイン サービス認証
http://msdn.microsoft.com/ja-jp/library/ms180890%28v=VS.90%29.aspx「ダメだと思った理由」というのが当方よく理解できていませんが、
上記ではその理由に該当してやはりダメなのでしょうか。 -
どちらかというと、ドメインユーザがきちんとユーザとして運用できてないのであえてForm認証を使っているという雰囲気ですので、ADから認証情報を取得とかではダメなのでしょうね、なんとなくですが。
ちゃんとユーザ運用しようよというのが本筋であるとは思うのですが。
無理矢理な手法としては、IISでは統合Windows認証を有効にしておいて、Form認証の仕組みと併用するというやり方もできるかもしれません。
ASP.NET側の設定でWindows認証にしないと、統合Windows認証のユーザは取れないかな?
そうであっても、設定はWindows認証にしておいて、手動でForm認証を実行するような感じでできそうな気はします。ただしあくまで強引なやり方ですので、あまりお勧めできるわけではないです。
-
追加で、How To: ASP.NET 2.0 で Active Directory とともにフォーム認証を使用する方法。SurferOnWwwさんの挙げられた1つ目のリンクは執筆日から判断してASP.NET 1.0向けなようです。
-
回答ありがとうございます。
やっぱりIISをWindows認証にしないと難しそうですね。ただ、Windows認証にするとして制御が難しそうですが。
あと、ADにアクセスする方法があることはとても参考になりました。(前に書いた通り、Windowsユーザーを複数名で使いまわす場合があるので、システムにログインするユーザーとADに登録されているユーザーは1対1にならないので難しいところがあります。)
それと説明が不足していたんですが(うまく書けなくてすいません)、最初に書いた『PCにログインしているユーザー名』という事なんですが、それを知りたい目的があります。
- 他人がログオンしているPCを使ってシステムにログオンしてくる人がいるのでクライアントPCにログオンしているユーザー名を取得したい(システムにログオンしてくるユーザーは把握できる)
- 自分がログオンしているPCを使って他人のIDでログオンしてくるユーザーを把握したい(不正に他人のIDを利用している)
クライアントPCにログオンしているユーザーと同じユーザーでシステムにログオンしているかを知りたいので『PCにログインしているユーザー名』が取得したかったんです。これってやりすぎですか?
結論としてはIISをWindows認証にしないとクライアントPCにログインしているユーザー名は取得できないので無理って事ですよね。ここまでやろうとすると裏ワザ的なやり方になってしまうという理解で大丈夫でしょうか?
-
※回答じゃないかもしれません。
- 他人がログオンしているPCを使ってシステムにログオンしてくる人がいるのでクライアントPCにログオンしているユーザー名を取得したい(システムにログオンしてくるユーザーは把握できる)
- 自分がログオンしているPCを使って他人のIDでログオンしてくるユーザーを把握したい(不正に他人のIDを利用している)
クライアントPCにログオンしているユーザーと同じユーザーでシステムにログオンしているかを知りたいので『PCにログインしているユーザー名』が取得したかったんです。これってやりすぎですか?
クラサバ(C/S)アプリケーションじゃないと難しい気がします。そもそも Web アプリケーションはクライアントを意識せずに動くシステムだと思っています。どうしても Web のみでやりたいのであれば Silverlight とか AxtiveX を駆使すればできるかもしれません。まあ、ユーザーを徹底して管理したいという意味で統合 Windows 認証があるのですが…。
結論としてはIISをWindows認証にしないとクライアントPCにログインしているユーザー名は取得できないので無理って事ですよね。ここまでやろうとすると裏ワザ的なやり方になってしまうという理解で大丈夫でしょうか?
答えじゃなくて補足なのですが、ここまでの話だと 統合 Windows 認証にすればログインユーザーを完全に把握できるような流れになっていますが、これはあくまでも PC にログインするユーザーがすべてドメインユーザーであることが前提です。ドメインユーザー以外で Web にアクセスすると認証画面が表示されるのでそこで他人のユーザー名とパスワードを入れてしまえば他人に成り済ますことができます。ドメインユーザーでもアクセス権限のあるページを開こうとするやはり認証画面が表示されるので成りすましは可能です。そこの認識は注意したほうがいいと思います。
ADで管理しているPCであれば Web でどうこうするよりもポリシー設定とか監視ツール入れたほうが楽なような気がしないでもないような…。
おのでら (http://sorceryforce.com/)
-
> クライアントPCにログオンしているユーザーと同じユーザー
> でシステムにログオンしているかを知りたいので『PCにログ
> インしているユーザー名』が取得したかったんです。すべてのユーザーは、Active Directory ドメインサービス環境
下で、ドメインユーザーアカウントを使ってドメインにログイ
ンしているのですよね。また、上記で言う「システム」とは、ドメインではなくて、Web
サーバーのことですよね。それで、Web サーバーの認証方式が Forms 認証なので、Web サ
ーバーでは『PCにログインしているユーザー名』(即ち、Web に
ログインしてくるユーザーのドメインユーザーアカウント名)を
取得できないので困っているということですか?であれば、統合 Windows 認証を使ってシングルサインオンにす
れば、「クライアントPCにログオンしているユーザー」=「シ
ステム(Web サーバー)にログオンしているユーザー」になり
ます。それで問題は解決できるのではないですか? (パスワ
ードが他人に漏れているとか、ログインしたまま席を外した隙に他
人が PC を使うとかは別の問題として)Active Directory ドメインサービス環境下で、ドメインに属す
る Web サーバーの統合 Windows 認証は、スタンドアロンの Web
サーバーのローカル Windows アカウントを使用した Windows 認
証とは全く違うことは理解されているでしょうか?> ただ、Windows認証にするとして制御が難しそうですが。
難しいことは全然ないです。Active Directory ドメインサービ
スがきちんと構築されていれば、Forms 認証よりはるかに簡単か
つ安全なはずです。- 編集済み SurferOnWww 2012年4月13日 11:42 誤字訂正
-
回答ありがとうございます。
おのでらさんの言うとおり他人のPCで他人のIDって言うのは思いつきませんでしたし、PCにローカルログインしてもWebシステムにはアクセスできちゃいますから余計ややこしくなりますね。そう考えるとなかなか難しいですね。
SurferOnWwwさん、ちょっと説明が足りなくてすいません。
PCログインユーザー(ADユーザー)≠システムにログインするユーザーになります。
PCにログインするユーザーの一部に複数名で使いまわすIDがあり、こういう人でもシステムでは個別に管理する事になっています。これ以外の部分についてはSurferOnWwwさんの認識どおりです。この要件だとWindows認証は使えないと思うんですが使えますか? -
> PCにログインするユーザーの一部に複数名で使いまわすIDがあり、
> こういう人でもシステムでは個別に管理する事になっています。デバイス CAL を利用しているなどの理由で、ドメインユーザー
アカウントを複数名で使いまわしているのでしょうか?その状況で、Web にログインするユーザーは個人個人を特定した
いので、Web アプリを Forms 認証にして、各ユーザーに専用の
ID と Password 与えているということでしょうか? であれば、
ここで Windows 認証という選択肢はなくなりますね。上記の状況では、クライアントがアカウント情報を送信しない限
り、サーバー側で『PCにログインしているユーザー名』を取得す
る手段はありません。自分が知る限り、少なくとも ASP.NET に
はアカウント情報を送信するような機能はありません。解決策は、ユーザー CAL に変更して個人個人に専用のドメイン
ユーザーアカウントを与え、Web アプリを統合 Windows 認証に
するぐらいしか思いつきませんが、それは NG なんですよね。- 回答としてマーク echodev 2012年4月18日 5:43
-
上手くいくか不明ですが、
- Windows 認証、ログインページのみ、aspx の PostBackUrl に後者を指定
- Forms 認証、web.config のログインページのURLに前者を指定
という構成にしたらどうだろうか? Forms 認証のアプリケーションはそのままにして Windows の認証情報をログイン時に取得できるようになって、後者へログイン情報の1つとして渡せると思いますがどうでしょう?
# 面倒ですが、Web アプリ間のデータ共有の仕組みを用意すれば、Windows のユーザ名はクライアントを経由しないで渡すこともできますね
- 編集済み K. Takaoka 2012年4月24日 14:00