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

StackOverflow https://stackoverflow.com/questions/1003751

質問

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

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

Windowsで実行しているので、PerlまたはApacheモジュールをインストールするのは簡単ではないことが証明されています。しかし、PHPはすでにHTTPヘッダーにアクセスできませんか?

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

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

更新 この質問を最初に投稿してから、セットアップをnginxおよびphp-fcgiに変更し、Windows上で実行し続けています。 Windows上のApache2とphp-cgiは、おそらくWindowsで設定できる最も遅いセットアップの1つです。 Apacheがまだ必要であるように見えます(php-fcgiで動作します)が、nginxソリューションの方が好きです。

また、HTTPサーバープラグインが必要で、PHP、Webサーバーに依存しないソリューションを使用できない理由を理解できません(教育を受けたいと思っています)。

役に立ちましたか?

解決

必要なのは、 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

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

他のヒント

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

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

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

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

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

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

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

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

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

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 = 

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が許可ユーザーのデータベースにあることを確認します。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top