Аутентифицировать пользователей Ignite Openfire на членство в ASP.NET? - PullRequest
0 голосов
/ 09 июля 2011

Мне было интересно, есть ли какой-нибудь простой способ аутентификации пользователей Openfire по моему существующему членству в ASP.NET? Я вижу, что у Openfire есть специальное руководство по интеграции базы данных здесь но я не думаю, что он поддерживает мой текущий метод защиты паролем. Видимо, некоторые из моих участников имеют тип 1, а некоторые имеют парольную защиту типа 2. Я не уверен, как это произошло, но, поскольку они несовместимы, я не могу использовать один из предустановленных параметров безопасности Openfire. Мне нужно выполнить запрос к моей базе данных, чтобы выяснить, как хранится пароль, а затем применить правильный метод аутентификации по паролю в зависимости от типа. Есть предложения?

1 Ответ

2 голосов
/ 09 декабря 2011

Итак, на самом деле не так сложно заставить это работать.Вам нужно создать три новых файла Java, по одному для каждого из следующих:

  • Один, который реализует AdminProvider.java (если вы хотите получить администраторов из базы данных IIS)
  • Одинкоторый реализует UserProvider.java (для вывода списка всех / активных пользователей из IIS)
  • Тот, который реализует AuthProvider.java (для фактического выполнения аутентификации)

Реализация администратора admin и пользователяПоставщик прост, просто следуйте приведенным примерам JDBC.Следует отметить, что база данных IIS отключена от некоторого идентификатора GUID, а фактические поля учетной записи пользователя (электронная почта, имя и т. Д.) Находятся в другой таблице, поэтому вам необходимо выполнить запрос, чтобы выяснить идентификатор IIS, затем используйте это, чтобы выяснить остальные поля учетной записи, то есть.

SELECT TOP 1 UserId FROM dbo.aspnet_Users WHERE LoweredUserName = ?

Затем, чтобы получить E-mail (после того, как у вас есть IIS ID)

SELECT TOP 1 Email FROM dbo.aspnet_Membership WHERE UserId = ?

Выполнить настоящую аутентификацию очень просто, просто возьмите имя пользователя, данное вам openfire, очистите его (иногда это user @ host - часть @host на самом деле не является частьюusername) и выясните IIS ID на основе имени пользователя, которое вы дали.

Затем вы можете выполнить запрос, чтобы выяснить пароль и хэш пароля

SELECT TOP 1 Password, PasswordSalt FROM dbo.aspnet_Membership WHERE UserId = ?

Имея все, что вам нужно, чтобы зашифровать выданный вам пароль - вот алгоритм:

Примечание - все утилиты включены в OpenFire (т. Е. decodeHex(...), Base64...)

private static String encryptPassword(String password, String salt)
{
    if(password == null || salt == null)
        return "";

    try
    {
        byte[] bytes = password.getBytes("UTF-16LE");
        byte[] src = Base64.decode(salt);
        byte[] dst = new byte[src.length + bytes.length];

        System.arraycopy(src, 0, dst, 0, src.length);
        System.arraycopy(bytes, 0, dst, src.length, bytes.length);

        // Calculate the SHA1
        byte[] hashed = StringUtils.decodeHex(StringUtils.hash(dst, "SHA-1"));
        return Base64.encodeBytes(hashed);
    } 
    catch (UnsupportedEncodingException e)
    {
        Log.error("UTF-16LE encoding not suported");
    }

    return "";
}

Просто сравните результат этой функции с данными IISПоле пароля abase, и вы будете в нерабочем состоянии.

Еще одна вещь, которую следует отметить с провайдером Admin: AdminManager, который использует openfire, кэширует результаты.Похоже, что результаты загружаются в кеш при запуске системы, поэтому невозможно синхронизировать список администраторов с IIS.Я все еще обдумываю этот вопрос, чтобы выяснить, какой будет лучший подход.Я мог бы просто удалить все кэширование (AdminManager просто хранит список администраторов в памяти.)

Как только вы все настроите, просто измените несколько свойств в конфигурации для openfire, чтобы подключить его к вашему решению, например.

provider.admin.className --> org.jivesoftware.openfire.admin.IISAdminProvider
provider.auth.className --> org.jivesoftware.openfire.auth.IISAuthProvider
provider.user.className --> org.jivesoftware.openfire.user.IISUserProvider

Я добавил еще несколько свойств для имени пользователя и пароля базы данных IIS, а также некоторые переменные для того, как называется моя группа администраторов и т. Д. Просто следуйте примерам JDBC, и это очень легко.Обратите внимание, что после изменения свойств provider.* в конфигурации openfire вы больше не сможете войти в систему с администратором по умолчанию - если что-то не так, вам придется вернуться в базу данных и изменить конфигурацию (втаблица dbo.ofProperty вашей базы данных openfire.)

...