web-dev-qa-db-ja.com

内部のPHPアプリにMicrosoft ADを使用してシングルサインオン(SSO)を実装するにはどうすればよいですか?

ドメインに参加しているコンピューターでIEがアプリケーションに自動的にサインオンするために使用できる追加のヘッダーを送信するように要求される場合があることを漠然と認識しています。Apacheを実行しています。 mod_phpを備えたWindowsサーバー。ユーザーが必要に応じてログインする必要がないようにしたいのですが、KerberosおよびApacheモジュールについて話しているリンクをいくつか見つけました。

http://www.onlamp.com/pub/a/onlamp/2003/09/11/kerberos.html?page=lasthttps://metacpan.org/pod/ Apache2 :: AuthenNTLM

私はWindowsで実行しているので、PerlまたはApacheモジュールをインストールするのは簡単ではありません。しかし、PHPはすでにHTTPヘッダーにアクセスできませんか?

私はこれを見つけましたが、認証を行わず、PHPがNTLMヘッダーを読み取ることができることを示しています。 http://siphon9.net/loune/2007/10/ simple-lightweight-ntlm-in-php /

ユーザーがアプリケーションをポイントするだけで、自動的に認証されるようにしたいのですが。誰かがこれで何か経験をしたか、それをまったく働かせましたか?

[〜#〜] update [〜#〜]最初にこの質問を投稿して以来、セットアップをnginxに変更し、php-fcgiをWindowsで実行しています。 Windows上のApache2とphp-cgiは、おそらくWindowsで構成できる最も遅いセットアップの1つです。 Apacheがまだ必要なようです(php-fcgiで動作します)が、nginxソリューションの方がいいと思います。

また、なぜHTTPサーバープラグインが必要で、PHPやWebサーバーにとらわれない解決策が得られないのか、まだ理解できていません(教育を受けたいと思っています)。

28
reconbot

必要なのは mod_auth_sspi Apacheモジュール。

サンプル構成:

AuthType SSPI
SSPIAuth On
SSPIAuthoritative On
SSPIDomain mydomain

# Set this if you want to allow access with clients that do not support NTLM, or via proxy from outside. Don't forget to require SSL in this case!
SSPIOfferBasic On

# Set this if you have only one domain and don't want the MYDOMAIN\ prefix on each user name
SSPIOmitDomain On

# AD user names are case-insensitive, so use this for normalization if your application's user names are case-sensitive
SSPIUsernameCase Lower
AuthName "Some text to Prompt for domain credentials"
Require valid-user

また、次のことも可能であることを忘れないでください Windowsドメインで透過的なSSOにFirefoxを使用 :単にabout:config、 検索する network.automatic-ntlm-auth.trusted-urisを入力し、内部アプリケーションのホスト名またはFQDN(myserverやmyserver.corp.domain.comなど)を入力します。複数のエントリを含めることができます。これはコンマ区切りのリストです。

18

私はこのために(一種の)バックエンドとしてOpenIDを使用するソリューションに興味があります...グーグルで(すばやく)Active Directoryに直接フックするものは何もありませんでした。ただし、プレーンなHTTP(S)を介して実装するのはかなり簡単です(ローカルのADに対して資格情報をチェックするOpenIDプロバイダーになります)。最良のシナリオでは、いくつかのクラスをアプリに追加してオフにして実行することができます。Webサーバーモジュールは必要ありません。どちらの側にも多くのオープンソースコードがあるので、他に何もない場合は、一見の価値があります。バックエンドをユーザーに公開した場合(つまり、OpenIDのURLをユーザーに提供した場合)、これらの認証情報を使用して内部サイトだけではなく、ユーザーがログインできるという追加の利点があります。 (例:スタックオーバーフロー。)

余談ですが、私はInternet Explorerが必要となるようにすることには反対です。それがあなたが質問を書いた方法からの目標であるかどうかはわかりませんが、IT環境によっては、FirefoxまたはSafari(またはOperaまたは...)を使用する人に熱狂的ではありません。 (最初にIEに対して開発しているのではありませんか?それは、私がそうするたびに苦痛でした。)これは、IEのこの機能を使用できなかったということではありません。唯一のオプションではありません。あなたが投稿したリンクは、NTLMがIE以外でも動作することを述べていますが、私はそれを使った経験がないため、それがどれほどうまく機能するかを判断するのは困難です。

1
Benjamin Oakes

組織のために解決する必要がある同様の問題がありました。

adLDAP の使用を検討していました。

サイトには、Active Directoryでシームレスな認証を実現するためのドキュメントもいくつかあります。

1
asgeo1

IIS/PHP FCGIの場合、不正なヘッダーを送信する必要があります。

function EnableAuthentication()
{
    $realm = "yoursite";
    header('WWW-Authenticate: Digest realm="'.$realm.'",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');
    header("HTTP/1.1 401 Unauthorized"); 
    exit;
}

その後、次のコマンドでユーザー名を取得できます。

$winuser = $_SERVER["REMOTE_USER"];

次に、$ winuserが許可されたユーザーのデータベースにあることを確認します。

確認して、権限のないアカウントでこれをテストしてください。これを最初にインストールしたときにテストして問題なく動作しましたが、後でサーバー管理者以外の標準ユーザーが試したところ、失敗しました。一時ディレクトリのいくつかは、ゲストユーザーのアクセス許可を変更する必要があることがわかりました。正確な設定を思い出せません。

0
Will Shaver

1つのオプションは、CAS(中央認証サービス)を使用することです。

Phpクライアントライブラリがあります。

MS Active Directoryへのリンク方法: http://www.ja-sig.org/wiki/display/CASUM/Active+Directory

ただし、Apache maven 2が必要です。

0
Hrishi