8

私がやろうとしていること:

  • 当社のイントラネット上にホームページを作成し、ページの読み込み時にこれらの資格情報の入力を求められることなく、ページを表示しているユーザーのログイン Windows ユーザー名を自動的に取得します。

  • IT担当者がドメインをセットアップするまでにはしばらく時間がかかるため、現在、ローカルのユーザー名を取得したいだけです。たとえば、現在、プロンプトなしで「(PC-Name)\windows.user.name」をキャプチャする必要があります。

環境:

  • Windows 7 x64 上の Apache 2.2.21 (本番環境になると、CentOS に搭載されます)。

  • PHP 5.3.8 (VC9-ZTS)。

  • Internet Explorer 9.0.8x と Firefox 6.0.2 (Chrome については後で考えます)。

  • 現在のテスト ページは、print_r( $_SERVER ) を呼び出す PHP スクリプトです。

  • 簡単にするために、これをテストしているディレクトリは VirtualHost ではありません。

これまでに行った手順:

  • SourceForge から mod_sspi_1.0.4-2.2.2 をダウンロードし、mod_auth_sspi.so を Apache モジュール ディレクトリに展開します。

  • モジュール宣言を追加しました:

    LoadModule sspi_auth_module modules/mod_auth_sspi.so

  • ディレクトリ定義を追加しました:

    AllowOverride なし オプション なし 順序を許可、拒否 すべてから許可

    AuthName "My Intranet"
    AuthType SSPI
    SSPIAuth On
    SSPIAuthoritative Off
    
    require valid-user
    

  • about:config に移動し、network.automatic-ntlm-auth.trusted-uris を PHP スクリプトの絶対 URL パスに設定して、Firefox で統合認証を有効にし、Firefox を再起動しました。

  • 私はまだ IE で同等の手順を実行していませんが、内部でサポートされている主なブラウザーである Firefox が動作するようになるとします。

  • Apache を再起動し、テスト PHP スクリプトのロードを試みました。

結果:

  • IE と Firefox の両方で、ページが読み込まれる前にユーザー名とパスワードの入力を求められます。そのプロンプトは必要ありません。プロンプトなしでユーザー名を自動的に検出したい。

これまでのトラブルシューティング:

  • 権限のあるオン/オフなど、さまざまなSSPIオプションを循環させてみました。無効。

  • 「require valid-user」を削除するとプロンプトは表示されなくなりますが、ユーザー名も渡されません (NULL ではなく、単に配列ピリオドに設定されていません)。

  • プロンプトで [キャンセル] をクリックすると、標準の [認証が必要です] ページが表示されます。

  • 無効なユーザー名を入力した場合、または正しいユーザー名を入力してもパスワードが間違っている場合、ページは読み込まれますが、ユーザー名は "(PC-Name)\Guest" になります。

  • 正しいユーザー名/パスワードを入力すると、Guest の代わりにユーザー名が表示されます。

  • IE または Firefox でユーザー名/パスワードを入力すると、保存されたパスワードのキャッシュをクリアするか、ブラウザーを再起動するまで、ブラウザーは後続のページのユーザー名を記憶します。

  • 私は過去3時間ほどグーグルとランダムな推測に費やしました. 成功ゼロ。この質問をしている人々の孤立したフォーラム投稿をいくつか見つけましたが、彼らは答えられなかったか、私がすでに試した解決策を提供しましたが成功しませんでした.

繰り返しますが、プロンプトを表示せずにページを読み込み、現在ログオンしている Windows ユーザー名を $_SERVER 配列の出力に表示する必要があります。

私が推測できる限り、これは次のいずれかです。Windows の構成の問題、Apache の構成の問題、またはブラウザーの構成の問題です。それ以外は、私はアイデアがありません。

あなたが提供できるどんな助けにもとても感謝しています。ありがとう!

――クリス

4

2 に答える 2

7

数日かかりましたが、最終的には自力で解決しました。どうやら、Firefox の about:config 設定について説明しているさまざまなドキュメントやチュートリアルが間違っているようです。彼らは、プロトコル プレフィックスを含む完全な URI を含める必要があると主張しています。結局のところ、正反対のことが当てはまります。

暗闇でのランダムショットとして、「localhost」(テストサーバーが実行されているドメイン)だけに設定してみました。そして出来上がり!それはそれを修正しました!一方、「http://localhost」は壊れました。

サーバー側の構成が正しいことを確認した後、Firefox で動作するようになると、それを IE と Chrome に適用するのは簡単でした。IE の場合、「http://localhost」(この場合、プロトコル プレフィックスが必要です) を「イントラネット」ゾーンに追加しました。また、Chrome は IE が使用するのと同じネットワーク設定を使用するため、この手順で両方のブラウザーで動作するようになりました。

サーバー側の設定に関する限り、私は最初からそれを持っていたようです。ただし、少し単純化することができたので、実際にディレクトリ ブロックで必要なのは次のとおりです。

AuthName "Whatever you want to call your intranet"
AuthType SSPI
SSPIAuth On

require valid-user

この設定で、print_r( $_SERVER ) を実行する PHP スクリプトを指定すると、出力には次のような内容が含まれます。

[REMOTE_USER] => dev-kdc-pc01\kris.craig
[AUTH_TYPE] => NTLM
[PHP_AUTH_USER] => dev-kdc-pc01\kris.craig

ドメイン部分 (つまり、「dev-kdc-pc01\」) を取り除きたい場合は、PHP で解析するか、上記の httpd.conf のディレクトリ ブロックにある SSPI の内容に次の行を追加します。

SSPIOmitDomain On

これは、Apache Web サーバーが localhost で実行されている Windows システムでのみテストしたことに注意してください。Apache サーバーが Linux で実行されている状況ではまだテストしていませんが、サーバーはブラウザーが送信するものを受け入れるだけなので、結果に影響はありません。これには、クライアントが Windows またはその他の SSPI 互換環境を実行している必要もあります。Mac を使用している従業員のためにこれを機能させる方法をまだ決定していません。

また、現在ドメインが構成されていないネットワークでこれを正常にテストしたことにも注意してください。他の場所で公開された記事によると、ドメインのメンバーであるワークステーションでの動作は同じであるはずです。

これが役立つことを願っています!ありがとう!

于 2011-12-08T00:29:31.260 に答える
0

This might be a partial answer.

BOOL WINAPI GetUserName(
  __out    LPTSTR lpBuffer,
  __inout  LPDWORD lpnSize
);

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724432%28v=vs.85%29.aspx

It looks like you can fetch system information using this, the other half might be automating it using PERL or Python to scrape the information, then post it to PHP.

Here's the outline on fetching SysInfo in Windows.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724426%28v=vs.85%29.aspx

Honestly this is a pretty easy thing to do with PECL/PAM if you are using Linux.

于 2011-12-07T22:57:15.900 に答える