Статьи

Автоматический вход в WordPress с IIS7 и плагином

Для нашей блоговой платформы RealDolmen , где мы используем WordPress в качестве движка, который управляет несколькими внешними и внутренними блогами (да, это внутренний SaaS, который у нас есть!), Мы хотели, чтобы наши сотрудники имели простое решение для входа на платформу. Мы взглянули на репозиторий плагинов WordPress и нашли отличный плагин Simple LDAP Login для входа в Active Directory. Это позволило для входа с использованием учетных данных Active Directory. Тем не менее, при просмотре блогов из корпоративной сети страница входа является еще одним шагом на пути пользователей: они уже вошли в сеть, так зачем снова входить в систему, используя те же учетные данные?

К счастью для нас, мы размещаем WordPress на Windows, IIS 7 и SQL Server . Потрясенный? Нет Linux, MySQL, .htaccess и mod_rewrite там! И это работает отлично. На самом деле, мы получаем некоторые дополнительные услуги бесплатно: единый вход стал возможен благодаря IIS!

Настройка проверки подлинности Windows в IIS7

Чтобы обеспечить сценарий единого входа для WordPress на IIS, просто включите проверку подлинности Windows в консоли управления IIS7, например, так:

Проверка подлинности Windows в IIS - WordPress, PHP

Если вы сейчас заходите на сайт WordPress … Ничего не происходит! За исключением обычных вещей: отображается не вошедшая в систему версия сайта … Причина этого очевидна: анонимная аутентификация также включена и находится на более высоком уровне, поэтому IIS7 отказывается аутентифицировать пользователя, используя его учетные данные Active Directory … Одним из решений может быть обратный порядок, но это означает, что для входа в систему требуется * каждый * отдельный пользователь. Не идеальная ситуация … И вот тут наш плагин для WordPress пригодится, черт возьми, мы даже делимся им с вами, чтобы вы тоже могли его использовать!

Дурачить IIS7, когда требуется …

Решение того факта, что анонимная аутентификация выше по цепочке в IIS7 и что этого требует тот факт, что мы не хотим, чтобы всем приходилось входить в систему, обманывает IIS7, заставляя верить, что аутентификация Windows выше по цепочке в некоторых ситуации … И почему бы не сделать это из PHP и не обернуть этот «хак» в плагин WordPress?

Основой для нашего плагина является следующее: всякий раз, когда пользователь просматривает веб-сайт и использует Internet Explorer (извините, в других браузерах это не поддерживается), возможна проверка подлинности Windows. Единственный оставленный шаг — это запуск, который довольно прост: если вы обнаружите, что пользователь выходит из локальной сети и использует Internet Explorer (в Windows), отправьте ему заголовок HTTP / 1.1 401 Unauthorized . Это заставит IE отправлять токен аутентификации Windows на сервер, а также заставит IIS7 думать, что анонимная аутентификация не удалась, что также немедленно вызовет аутентификацию Windows на стороне сервера.

Теперь, как это сделать в плагине WordPress? Ну, просто: подключитесь к 2 событиям, которые предлагает WordPress, а именно: init и login_form . В этом? Ну да! Вы хотите, чтобы пользователи автоматически входили в систему при выходе из локальной сети. Нет лучшего способа сделать это, чем init . Другой очевиден: если пользователь каким-то образом попадает на страницу входа и выходит из локальной сети, вы хотите, чтобы эта страница была пропущена и там использовалась аутентификация Windows. Вот несколько упрощенных кодов для регистрации хуков:

1<?php
2add_action('init','iisauth_auto_login');
3add_action('login_form','iisauth_wp_login_form');

Далее реализация! Давайте начнем с того, что происходит в init :

1function iisauth_auto_login() {
2if (!is_user_logged_in() && iisauth_is_lan_user() && iisauth_using_ie()) {
3        iisauth_wp_login_form();
4    }
5}

Как вы можете видеть: всякий раз, когда мы подозреваем, что пользователь приходит из внутренней локальной сети и использует IE, мы вызываем метод iisauth_wp_login_form () (который «случайно» также срабатывает, когда пользователь находится на странице входа в систему). Вот этот код:

 1function iisauth_wp_login_form() {
 2// Checks if IIS provided a user, and if not, rejects the request with 401
 3    // so that it can be authenticated
 4if (iisauth_is_lan_user() && iisauth_using_ie() &&empty($_SERVER["REMOTE_USER"])) {
 5        nocache_headers();
 6header("HTTP/1.1 401 Unauthorized");
 7ob_clean();
 8exit();
 9    } elseif (iisauth_is_lan_user() && iisauth_using_ie() &&!empty($_SERVER["REMOTE_USER"])) {
10if (function_exists('get_userdatabylogin')) {
11$username=strtolower(substr($_SERVER['REMOTE_USER'],strrpos($_SERVER['REMOTE_USER'],'\\') +1));
12
13$user= get_userdatabylogin($username);
14if (!is_a($user,'WP_User')) {
15// Create the user
16$newUserId= iisauth_create_wp_user($username);
17if (!is_a($newUserId,'WP_Error')) {
18$user= get_userdatabylogin($username);
19                }
20            }
21
22if ($user&&$username==$user->user_login) {
23// Clean buffers
24ob_clean();
25
26// Feed WordPress a double-MD5 hash (MD5 of value generated in check_passwords)
27$password=md5($user->user_pass);
28
29// User is now authorized; force WordPress to use the generated password
30$using_cookie=true;
31                wp_setcookie($user->user_login,$password,$using_cookie);
32
33// Redirect and stop execution
34$redirectUrl= home_url();
35if (isset($_GET['redirect_to'])) {
36$redirectUrl=$_GET['redirect_to'];
37                }
38                wp_redirect($redirectUrl);
39exit;
40            }
41        }
42    }
43}

Здесь происходит то, что заголовок аутентификации отправляется при необходимости, и как только IIS предоставляет пользователя, мы просто регистрируем пользователя в WordPress и перенаправляем его. Настоящая «магия» заключается в этой части:

1// Checks if IIS provided a user, and if not, rejects the request with 401
2// so that it can be authenticated
3if (iisauth_is_lan_user() && iisauth_using_ie() &&empty($_SERVER["REMOTE_USER"])) {
4    nocache_headers();
5header("HTTP/1.1 401 Unauthorized");
6ob_clean();
7exit();
8}

Который делает именно то, что я описал ранее в этом посте …

Скачать

Ну, конечно, не стесняйтесь использовать этот плагин! Вот исходный код: iisauth.zip (1.44 кб)

(И большое спасибо нашему менеджеру по маркетингу за то, что он позволил мне распространить этот маленький плагин! Еще раз доказательство безошибочного духа в RealDolmen !)