社内のWebサービスでユーザー別のアクセスログをとる必要がありまして、クライントは全部Windowsなので統合Windows認証を使えば特にクライアント側で操作せずにそのままWindowsのログイン名を入手できます。IEやEdgeはもちろんですがChromeも特に設定不要でした。Firefoxではログインのダイアログが出ますが、IEやChromeと同じに出さなくする設定は可能なようで、方法を調べるとあちこちにあります。
サーバー側はIISなら簡単にできるのですが、うちのサーバーはLinuxなのでちょっと手間が必要です。とはいっても統合Windows認証によるSingle Sign-Onというよりはユーザー名の取得が目的なので、LDAPとかWinbindも必要なくこちらのPHPスクリプトを組み込むだけで可能でした。ソースを見ればわかりますが、401を投げてWWW-Authenticate: NTLMの戻り値からユーザー名、ドメイン名、マシン名を入手できるとのこと。こちらのページが説明で、このページが元みたいです。
もう10年以上前の情報ですが、CentOS 7上のApache 2.4.6とPHP 5.4.16で問題なくユーザー名などを取得できました。ただひとつ上記ソースでは問題がありまして、文字列の取得で
if ($unicode) return str_replace("\0", '', substr($msg, $off, $len)); else return substr($msg, $off, $len);
と$unicode、デフォルトの値がtrueで雑に\0を削除だけして結果を得ており、漢字などの日本語はまったく考慮されていません。調べてみるとNTLM認証ではUTF-16のリトルエンディアンで扱われているとのことでしたので、$unicode変数はなくして
return mb_convert_encoding(substr($msg, $off, $len), "UTF-8", "UTF-16LE");
とUTF-16LEから、うちのシステム既定値のUTF-8へ変換をかけて文字化けなしにユーザー名の入手ができるようになりました。このときphp-mbstringパッケージのインストールは必要ですけど、たいていの人は入れているんじゃないでしょうか。うちも導入済みでした。
ともかく先人の方々には感謝です。