2

我正在尝试在帐户管理网站和 MediaWiki 网站之间实施 SSO。

MediaWiki站点使用LDAP进行身份验证,限制管理员登录(限制编辑、移动等管理权限,但5000个用户需要登录账户管理站点更新账户、查看磁盘空间等。

到目前为止,我可以使用以下功能成功连接到 Mediawiki,但我无法使用我的用户名和密码进行身份验证:

function do_post_request($url, $data, $optional_headers = null)   {
   $params = array('http' => array(
                     'method' => 'POST',
                     'content' => $data));

   if ($optional_headers !== null) {
      $params['http']['header'] = $optional_headers;
   }

   $ctx = stream_context_create($params);

   if (!$fp = @fopen($url, 'r', false, $ctx)) return FALSE;
   $response = @stream_get_contents($fp);

   return $response;   
}

function mediawiki_login($username, $password) {
      /*
       *  STEP 1: request mediawiki login via api
       */

       $url='/wiki/api.php'; // EDIT THIS TO POINT TO YOUR WIKI API!
      $data=http_build_query(array('format'=>'json',
           'action'   =>'login',
           'lgname'   =>$username,
           'lgpassword'=>$password));
  $headers="Content-type: application/x-www-form-urlencoded\r\n".
        "Content-length: ".strlen($data)."\r\n".
        "Connection: close\r\n";

  $contents=do_post_request($url, $data, $headers);                  
  if ($contents===FALSE) return FALSE;

  $mwdata = json_decode($contents, true);    
  // check if the api answers as expected
  if($mwdata["login"]["result"] != "NeedToken"){
     return FALSE;         
  }

  $token=         $mwdata['login']['token'];
  $cookieprefix=   $mwdata['login']['cookieprefix'];
  $sessionid=      $mwdata['login']['sessionid'];

  /*
   *  STEP 2: send token using sessionid cookie
   */
  $data=http_build_query(array('format'=>'json',
                 'action' =>'login',
                 'lgname'   =>$username,
                 'lgpassword'=>$password,
                 'lgtoken' => $token));

  $headers="Content-type: application/x-www-form-urlencoded\r\n".
              "Content-length: ".strlen($data)."\r\n".
              "Cookie: ".$cookieprefix."_session=".$sessionid."\r\n".
              "Connection: close\r\n";

  $contents=do_post_request($url, $data, $headers);
  if ($contents===FALSE) return FALSE;

  $mwdata = json_decode($contents, true);
  if($mwdata["login"]["result"] != "Success") return FALSE;

  // login success, set the mediawiki cookies
  $cookieprefix=   $mwdata['login']['cookieprefix'];
  $sessionid=      $mwdata['login']['sessionid'];
  $userid=      $mwdata['login']['lguserid'];
  $username=      $mwdata['login']['lgusername'];
  setcookie($cookieprefix.'UserID', $userid, 0, '/', '.yourdomain.tld', FALSE, TRUE);     // INSERT YOUR DOMAIN
  setcookie($cookieprefix.'UserName', $username, 0, '/', '.yourdomain.tld', FALSE, TRUE);
  setcookie($cookieprefix.'_session', $sessionid, 0, '/', '.yourdomain.tld', FALSE, TRUE);

  return TRUE;
} 

添加我自己的调试值后,我发现我WrongPass在第二个之后返回do_post_request由于我们使用 MediaWiki 的 LDAPAuthentication 扩展,我相信 API 没有使用扩展进行身份验证,因此没有找到用户名密码MediaWiki 使用的用户数据库中的组合

有没有人在使用 LDAP 身份验证时成功使用 MediaWiki API 对用户进行身份验证?

对上面的代码、LocalSettings.php 或 api.php 进行了哪些更改以使其成为可能?

4

2 回答 2

1

我刚刚面临一个类似的问题。解决方案是在我的 POST 数据中包含一个额外的参数lgdomain,设置为正确的 LDAP 域。

在MediaWiki API 文档中非常简短地提到了它。您的示例代码中似乎缺少它。如果没有该参数,您将获得“WrongPass”作为您的登录结果。

于 2013-12-03T22:22:17.593 回答
0

在花了一周时间研究这个问题后,我放弃了上面的选项。作为 MediaWiki 登录功能的一部分,我创建了一个扩展来为帐户管理网站创建身份验证 cookie。我遇到的一个其他人可能会觉得有用的问题是,在使用“setcookie”函数之后,在刷新页面之前实际上不会设置 cookie,因为页面中已经写入了 html,所以出于身份验证的目的,我有为帐户管理网站编写新的身份验证代码,然后在管理员 Mediawiki 登录之前将其用作过滤器。

于 2013-06-27T18:02:03.183 回答