[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[upki-fed:00609] moodle の shibboleth 化



土屋です.

moodle-1.9.9 を shibboleth 化しようとしてはまっています.

auth/shibboleth/README.txt の指示にしたがって,各種設定を行いました.その
結果,以下のような挙動を示すようになっています.まず,

    https://moodle.example.net/auth/shibboleth/login.php

にアクセスし「選択」ボタンを押すと,

    https://moodle.example.net/auth/shibboleth/index.php

に遷移します.auth/shibboleth/README.txt の指示に従い,この php スクリプ
トは shibboleth 認証されるようにしてあります.apache の access.log を見て
も,

    172.17.xx.xx - sampleuser [08/Feb/2013:20:13:09 +0900] "GET /auth/shibboleth/index.php HTTP/1.1" 303 (以下略)

というような記録が残っていますから(認証結果のユーザ名がログに現れています
から),正常に shibboleth 認証できているはずです.

その後で,この sampleuser は設定が完了していないと判定 user_not_fully_set_up($USER)
されて,ユーザ情報の表示画面に飛ばされるのですが,ここが謎で access.log
を見ると,

    172.17.xx.xx - - [08/Feb/2013:20:13:09 +0900] "GET /user/edit.php?id=&course=1 HTTP/1.1" 303 (以下略)

となっていて,本来なら何かの値が渡されるはずと思われる id というパラメー
タが空になっています(★).そのため,user/edit.php は「ログインが完了して
いない」と判断して,

    https://moodle.example.net/auth/shibboleth/login.php

に更にリダイレクトするため,何回やってもログイン画面に戻ってきてしまっ
て,ログインできないという状態になっています.

★のような現象が起きるのは,shibboleth SP の設定と shibboleth プラグイン
の設定のどちらかが間違っている可能性が考えられます.

まず,shibboleth SP の設定について検討しました.moodle.example.net の
attribute-map.xml では,

    <Attribute name="urn:mace:dir:attribute-def:uid" id="uid"/>
    <Attribute name="urn:oid:0.9.2342.19200300.100.1.1" id="uid"/>

と書いてありますので,moodle ユーザ名を取り出す環境変数としては uid でも
REMOTE_USER でもどちらでも良いはずです.shibboleth SP の設定を確かめるた
めに,

    #!/bin/sh
    echo Content-Type: text/plain
    echo
    printenv|sort

というような CGI を置いて実験してみましたが,uid も REMOTE_USER もどちら
も環境変数として正常に設定されていることが確認できました.ですか
ら,shibboleth SP の設定に問題はなく,正しく環境変数を渡しているものと思
われます.

次に,shibboleth プラグインの設定について検討しました.
auth/shibboleth/index.php に末尾に添付したような変更を加えて,shibboleth
プラグインの設定を確認してみたのですが,

    172.17.xx.xx - - [08/Feb/2013:20:14:09 +0900] "GET /user/edit.php?id=&course=1&userattr=uid&userattrvalue=sampleuser&username=sampleuser HTTP/1.1" 303 (以下略)

というアクセスログが取れましたので,

(1) moodle ユーザ名を取り出すための属性としては,uid が正しく設定されている.
(2) 環境変数 uid を参照し,moodle ユーザ名として sampleuser も正しく取り出せている.
(3) にも関わらず,sampleuser という moodle ユーザの ID が取り出せていない.

ということが分かりました.

なお,この moodle.example.net は,元々は shibboleth IdP が参照している
LDAP サーバを使って認証を行っていました.設定を元に戻して,LDAP サーバ経
由の認証をしてみると,sampleuser も正しくログインできます.したがって,
sampleuser という moodle ユーザがいないという可能性はありません.

という状態で途方に暮れてしまったのですが,お知恵を拝借できないでしょうか.

-- 
土屋 雅稔 ( TSUCHIYA Masatoshi )
--- auth/shibboleth/index.php.orig
+++ auth/shibboleth/index.php
@@ -54,7 +54,7 @@
             add_to_log(SITEID, 'user', 'login', "view.php?id=$USER->id&course=".SITEID, $USER->id, 0, $USER->id);
             
             if (user_not_fully_set_up($USER)) {
-                $urltogo = $CFG->wwwroot.'/user/edit.php?id='.$USER->id.'&amp;course='.SITEID;
+                $urltogo = $CFG->wwwroot.'/user/edit.php?id='.$USER->id.'&amp;course='.SITEID.'&amp;userattr='.$pluginconfig->user_attribute.'&amp;userattrvalue='.$_SERVER[$pluginconfig->user_attribute].'&amp;username='.$frm->username;
                 // We don't delete $SESSION->wantsurl yet, so we get there later
 
             } else if (isset($SESSION->wantsurl) and (strpos($SESSION->wantsurl, $CFG->wwwroot) === 0)) {