根据ASP认证Ignite Openfire用户.网会员



我想知道是否有任何简单的方法来验证Openfire用户对我现有的ASP。网会员?我看到Openfire有一个自定义数据库集成指南但我认为它不支持我目前的密码安全方法。显然,我的一些成员有类型1和一些类型2密码安全。我不确定这是怎么发生的,但由于它们不一致,我无法使用Openfire预设的密码安全选项之一。我需要对数据库进行查询,找出密码的存储方式,然后根据类型应用正确的密码身份验证方法。有什么建议吗?

所以,让这个工作其实并不难。您需要创建三个新的Java文件,分别对应以下内容:

  • 一个实现AdminProvider.java(如果你想从IIS数据库拉出admins)
  • 一个实现UserProvider.java(从IIS中列出所有/活跃用户)
  • 一个实现AuthProvider.java(实际做认证)

实现管理提供程序和用户提供程序很简单,只需遵循所提供的JDBC示例即可。需要注意的一点是,IIS数据库中没有GUID,而实际的用户帐户字段(电子邮件、姓名等)在另一个表中,因此您必须执行一个查询来找出IIS ID,然后使用该查询来找出其余的帐户字段,例如

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

然后获得电子邮件(在您拥有IIS ID之后)

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

进行实际的身份验证非常简单,只需获取openfire提供给您的用户名,清理它(有时是user@host—@host部分不是用户名的真正一部分)并根据您提供的用户名计算IIS ID。

然后你可以做一个查询找出密码&密码散列

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

有了这些,你就有了加密给你的密码所需的一切——算法如下:

注意——所有的utils都包含在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数据库的密码字段进行比较,您将关闭并运行。

关于Admin提供程序,另一件要注意的事情是:openfire使用的AdminManager会缓存结果。看起来结果在系统启动时就被缓存了——因此实际上不可能使管理员列表与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示例,就会非常容易。请注意,在您更改openfire配置中的provider.*属性后,您将无法再使用默认管理员登录-如果出现混乱,您将不得不回到数据库并更改配置(在openfire DB的dbo.ofProperty表中)

最新更新