none
Form認証でのWindowsにログオンしているアカウントを取得する方法 RRS feed

  • 質問

  • 現在、クライアントユーザーのPCにログオンしているユーザー名を取得してデータベースへログを出力したいと考えています。

    実装したコードだとIISを実行しているユーザー名しか取れないことが判明して色々試したのですがローカルのユーザー名が

    取得できませんでした。

    ローカルユーザー名は取得できないものですか?それとも取得できますか?取得できる場合はどのようにすれば取得できる

    のでしょうか?教えてください。

    環境:IIS6.0(Form認証を使用するため匿名アクセス)

        SQL Server 2008

         .Net FrameWork 2.0

        WebサーバーとDBサーバーはそれぞれ別のPC(サーバー)で稼働しています。

    2012年4月11日 2:29

回答

  • ※回答じゃないかもしれません。

    1. 他人がログオンしているPCを使ってシステムにログオンしてくる人がいるのでクライアントPCにログオンしているユーザー名を取得したい(システムにログオンしてくるユーザーは把握できる)
    2. 自分がログオンしているPCを使って他人のIDでログオンしてくるユーザーを把握したい(不正に他人のIDを利用している)
    「3.他人がログオンしているPCを使って他人のIDでWebシステムにログオンしてくるユーザー」はどうするんだろうかなーと…

    クライアントPCにログオンしているユーザーと同じユーザーでシステムにログオンしているかを知りたいので『PCにログインしているユーザー名』が取得したかったんです。これってやりすぎですか?

    クラサバ(C/S)アプリケーションじゃないと難しい気がします。そもそも Web アプリケーションはクライアントを意識せずに動くシステムだと思っています。どうしても Web のみでやりたいのであれば Silverlight とか AxtiveX を駆使すればできるかもしれません。まあ、ユーザーを徹底して管理したいという意味で統合 Windows 認証があるのですが…。

    結論としてはIISをWindows認証にしないとクライアントPCにログインしているユーザー名は取得できないので無理って事ですよね。ここまでやろうとすると裏ワザ的なやり方になってしまうという理解で大丈夫でしょうか?

     答えじゃなくて補足なのですが、ここまでの話だと 統合 Windows 認証にすればログインユーザーを完全に把握できるような流れになっていますが、これはあくまでも PC にログインするユーザーがすべてドメインユーザーであることが前提です。ドメインユーザー以外で Web にアクセスすると認証画面が表示されるのでそこで他人のユーザー名とパスワードを入れてしまえば他人に成り済ますことができます。ドメインユーザーでもアクセス権限のあるページを開こうとするやはり認証画面が表示されるので成りすましは可能です。そこの認識は注意したほうがいいと思います。

     ADで管理しているPCであれば Web でどうこうするよりもポリシー設定とか監視ツール入れたほうが楽なような気がしないでもないような…。


    おのでら (http://sorceryforce.com/)

    • 編集済み おのでら_ 2012年4月13日 3:45
    • 回答としてマーク echodev 2012年4月18日 5:42
    2012年4月13日 3:42
  • > PCにログインするユーザーの一部に複数名で使いまわすIDがあり、
    > こういう人でもシステムでは個別に管理する事になっています。

    デバイス CAL を利用しているなどの理由で、ドメインユーザー
    アカウントを複数名で使いまわしているのでしょうか?

    その状況で、Web にログインするユーザーは個人個人を特定した
    いので、Web アプリを Forms 認証にして、各ユーザーに専用の
    ID と Password 与えているということでしょうか? であれば、
    ここで Windows 認証という選択肢はなくなりますね。

    上記の状況では、クライアントがアカウント情報を送信しない限
    り、サーバー側で『PCにログインしているユーザー名』を取得す
    る手段はありません。自分が知る限り、少なくとも ASP.NET に
    はアカウント情報を送信するような機能はありません。

    解決策は、ユーザー CAL に変更して個人個人に専用のドメイン
    ユーザーアカウントを与え、Web アプリを統合 Windows 認証に
    するぐらいしか思いつきませんが、それは NG なんですよね。

    • 回答としてマーク echodev 2012年4月18日 5:43
    2012年4月17日 12:28

すべての返信

  • echodev さんこんにちは、おのでらです。

    クライアントでログインしているユーザー名はブラウザ、またはクライアントのシステムがなんらかの形でユーザー名を送信しない限りは取得できないと思います。たとえばインターネット上のサイトで勝手にクライアントのログインユーザー名取られたら嫌ですよね?(というかセキュリティ的にまずい)

    Form 認証しているとのことなので Form 認証しているユーザー名ではだめなのでしょうか?


    おのでら (http://sorceryforce.com/)

    2012年4月11日 3:37
  • おのでらさんこんにちは、返信ありがとうございます。

    確かに言われてみればその通りですね。インターネット視点で考えればその通り納得できます。

    私の前提条件が不足していました。すいません。

    利用はイントラネット内のみでAD管理されているます。この条件であればWindowsにログオンしているユーザー名が

    取れますか?それともやっぱりインターネットと考え方が同じだから取れないですか?

    ちなみにForm認証のユーザー名は取得しています。それとクライアントPCのIPアドレスも取得できています。

    2012年4月11日 4:00
  • > 利用はイントラネット内のみでAD管理されているます。

    であれば Forms 認証ではなく、ドメインユーザーアカウントを利用
    した統合 Windows 認証を使ってはいかがですか? ブラウザは IE
    限定になってしまいますが。

    2012年4月11日 11:55
  • Windows 認証でも FireFox や Google Chrome など他のブラウザでも認証できたはずだったかと思います。

    SurferOnWww さんのおっしゃるとおり AD のドメインユーザーで Windows 認証ならサイトにアクセスしているユーザー名は取得することが可能です。

    ※追記

    シングルサインオン前提です。


    おのでら (http://sorceryforce.com/)


    2012年4月11日 13:58
  • Windows認証が使えれば良いんですが、調べた感じだと使えなかったのでForm認証にしました。

    やっぱりForm認証では取得できないのでしょうか?

    ダメだと思った理由

    • 限定的ではあるんですが、Windowsユーザーを複数名で使いまわす場合がありましてその使いまわしているユーザーをシステム上では個々に分けてログインさせたかった
    • Form認証にしました。それとログオン画面を表示したかった。

    2012年4月12日 4:16
  • やっぱりForm認証では取得できないのでしょうか?

     先ほども記載した通り、Form認証でログオンユーザー名をブラウザが送ることはできないと思います。

     試したことはない裏ワザチックな考えですが、認証を Windows 認証にし、なんちゃって Form 認証画面を作ってログインさせるようにすればユーザー名を取ることができるかもしれません。(制御周りがいろいろ大変な気もしますが…)


    おのでら (http://sorceryforce.com/)


    2012年4月12日 11:07
  • > やっぱりForm認証では取得できないのでしょうか?

    おのでらさんがレスされている通り、クライアント側からユーザー
    情報を送信しない限り、サーバー側でユーザー名を取得する手段は
    ありません。

    どうしても Forms 認証を使う必要があるなら、Forms 認証のユー
    ザー名とドメインユーザー名を同じにしておいてはいかがですか。

    または、Froms 認証のユーザー情報に Active Directory の資格情
    報ストアを使用して認証を行うという手もあります。

    セキュリティ保護された ASP.NET アプリケーションの構築 :
    認証、認定、および通信のセキュリティ保護 Active Directory
    でフォーム認証を使用する方法
    http://msdn.microsoft.com/ja-jp/library/cc465526.aspx

    ASP.NET からの Active Directory ドメイン サービス認証
    http://msdn.microsoft.com/ja-jp/library/ms180890%28v=VS.90%29.aspx

    「ダメだと思った理由」というのが当方よく理解できていませんが、
    上記ではその理由に該当してやはりダメなのでしょうか。

    2012年4月12日 12:32
  • どちらかというと、ドメインユーザがきちんとユーザとして運用できてないのであえてForm認証を使っているという雰囲気ですので、ADから認証情報を取得とかではダメなのでしょうね、なんとなくですが。

    ちゃんとユーザ運用しようよというのが本筋であるとは思うのですが。

    無理矢理な手法としては、IISでは統合Windows認証を有効にしておいて、Form認証の仕組みと併用するというやり方もできるかもしれません。

    ASP.NET側の設定でWindows認証にしないと、統合Windows認証のユーザは取れないかな?
    そうであっても、設定はWindows認証にしておいて、手動でForm認証を実行するような感じでできそうな気はします。

    ただしあくまで強引なやり方ですので、あまりお勧めできるわけではないです。

    2012年4月12日 13:30
  • 追加で、How To: ASP.NET 2.0 で Active Directory とともにフォーム認証を使用する方法。SurferOnWwwさんの挙げられた1つ目のリンクは執筆日から判断してASP.NET 1.0向けなようです。
    2012年4月13日 0:36
  • 回答ありがとうございます。

    やっぱりIISをWindows認証にしないと難しそうですね。ただ、Windows認証にするとして制御が難しそうですが。

    あと、ADにアクセスする方法があることはとても参考になりました。(前に書いた通り、Windowsユーザーを複数名で使いまわす場合があるので、システムにログインするユーザーとADに登録されているユーザーは1対1にならないので難しいところがあります。)

    それと説明が不足していたんですが(うまく書けなくてすいません)、最初に書いた『PCにログインしているユーザー名』という事なんですが、それを知りたい目的があります。

    1. 他人がログオンしているPCを使ってシステムにログオンしてくる人がいるのでクライアントPCにログオンしているユーザー名を取得したい(システムにログオンしてくるユーザーは把握できる)
    2. 自分がログオンしているPCを使って他人のIDでログオンしてくるユーザーを把握したい(不正に他人のIDを利用している)

    クライアントPCにログオンしているユーザーと同じユーザーでシステムにログオンしているかを知りたいので『PCにログインしているユーザー名』が取得したかったんです。これってやりすぎですか?

    結論としてはIISをWindows認証にしないとクライアントPCにログインしているユーザー名は取得できないので無理って事ですよね。ここまでやろうとすると裏ワザ的なやり方になってしまうという理解で大丈夫でしょうか?

    2012年4月13日 0:52
  • ※回答じゃないかもしれません。

    1. 他人がログオンしているPCを使ってシステムにログオンしてくる人がいるのでクライアントPCにログオンしているユーザー名を取得したい(システムにログオンしてくるユーザーは把握できる)
    2. 自分がログオンしているPCを使って他人のIDでログオンしてくるユーザーを把握したい(不正に他人のIDを利用している)
    「3.他人がログオンしているPCを使って他人のIDでWebシステムにログオンしてくるユーザー」はどうするんだろうかなーと…

    クライアントPCにログオンしているユーザーと同じユーザーでシステムにログオンしているかを知りたいので『PCにログインしているユーザー名』が取得したかったんです。これってやりすぎですか?

    クラサバ(C/S)アプリケーションじゃないと難しい気がします。そもそも Web アプリケーションはクライアントを意識せずに動くシステムだと思っています。どうしても Web のみでやりたいのであれば Silverlight とか AxtiveX を駆使すればできるかもしれません。まあ、ユーザーを徹底して管理したいという意味で統合 Windows 認証があるのですが…。

    結論としてはIISをWindows認証にしないとクライアントPCにログインしているユーザー名は取得できないので無理って事ですよね。ここまでやろうとすると裏ワザ的なやり方になってしまうという理解で大丈夫でしょうか?

     答えじゃなくて補足なのですが、ここまでの話だと 統合 Windows 認証にすればログインユーザーを完全に把握できるような流れになっていますが、これはあくまでも PC にログインするユーザーがすべてドメインユーザーであることが前提です。ドメインユーザー以外で Web にアクセスすると認証画面が表示されるのでそこで他人のユーザー名とパスワードを入れてしまえば他人に成り済ますことができます。ドメインユーザーでもアクセス権限のあるページを開こうとするやはり認証画面が表示されるので成りすましは可能です。そこの認識は注意したほうがいいと思います。

     ADで管理しているPCであれば Web でどうこうするよりもポリシー設定とか監視ツール入れたほうが楽なような気がしないでもないような…。


    おのでら (http://sorceryforce.com/)

    • 編集済み おのでら_ 2012年4月13日 3:45
    • 回答としてマーク echodev 2012年4月18日 5:42
    2012年4月13日 3:42

  • > クライアント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 誤字訂正
    2012年4月13日 11:42
  • 回答ありがとうございます。

    おのでらさんの言うとおり他人のPCで他人のIDって言うのは思いつきませんでしたし、PCにローカルログインしてもWebシステムにはアクセスできちゃいますから余計ややこしくなりますね。そう考えるとなかなか難しいですね。

    SurferOnWwwさん、ちょっと説明が足りなくてすいません。
    PCログインユーザー(ADユーザー)≠システムにログインするユーザーになります。
    PCにログインするユーザーの一部に複数名で使いまわすIDがあり、こういう人でもシステムでは個別に管理する事になっています。これ以外の部分についてはSurferOnWwwさんの認識どおりです。この要件だとWindows認証は使えないと思うんですが使えますか?

    2012年4月17日 0:29
  • > PCにログインするユーザーの一部に複数名で使いまわすIDがあり、
    > こういう人でもシステムでは個別に管理する事になっています。

    デバイス CAL を利用しているなどの理由で、ドメインユーザー
    アカウントを複数名で使いまわしているのでしょうか?

    その状況で、Web にログインするユーザーは個人個人を特定した
    いので、Web アプリを Forms 認証にして、各ユーザーに専用の
    ID と Password 与えているということでしょうか? であれば、
    ここで Windows 認証という選択肢はなくなりますね。

    上記の状況では、クライアントがアカウント情報を送信しない限
    り、サーバー側で『PCにログインしているユーザー名』を取得す
    る手段はありません。自分が知る限り、少なくとも ASP.NET に
    はアカウント情報を送信するような機能はありません。

    解決策は、ユーザー CAL に変更して個人個人に専用のドメイン
    ユーザーアカウントを与え、Web アプリを統合 Windows 認証に
    するぐらいしか思いつきませんが、それは NG なんですよね。

    • 回答としてマーク echodev 2012年4月18日 5:43
    2012年4月17日 12:28
  • 回答ありがとうございます。

    おのでらさんとSurferOnWwwさんの回答とても勉強になりました。
    Windows認証にしないかぎりアカウント情報を取得できない事と、個人個人にドメインユーザーアカウントは与える事は私の権限ではできないのでのでアカウント情報を取得することはあきらめようと思います。

    ありがとうございました。

    2012年4月18日 5:42
  • 上手くいくか不明ですが、

    • Windows 認証、ログインページのみ、aspx の PostBackUrl に後者を指定
    • Forms 認証、web.config のログインページのURLに前者を指定

    という構成にしたらどうだろうか? Forms 認証のアプリケーションはそのままにして Windows の認証情報をログイン時に取得できるようになって、後者へログイン情報の1つとして渡せると思いますがどうでしょう?

    # 面倒ですが、Web アプリ間のデータ共有の仕組みを用意すれば、Windows のユーザ名はクライアントを経由しないで渡すこともできますね


    2012年4月24日 13:59