针对ASP.NET成员身份验证Ignite Openfire用户?

时间:2011-07-09 04:48:15

标签: c# asp.net sql membership openfire

我想知道是否有任何简单的方法可以根据我现有的ASP.NET成员资格验证Openfire用户?我看到Openfire有一个自定义数据库集成指南here 但我不认为它支持我目前的密码安全方法。显然我的一些成员有1型,有些有2型密码安全。我不确定是怎么回事,但由于它们不一致,我不能使用Openfire的预设密码安全选项之一。我需要查询我的数据库以确定密码的存储方式,然后根据类型应用正确的密码验证方法。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

因此,实现这一点并不困难。您需要创建三个新的Java文件,每个文件对应以下各项:

  • 实现AdminProvider.java的一个(如果你想从IIS数据库中提取管理员)
  • 实现UserProvider.java(列出来自IIS的所有/活动用户)的一个
  • 实现AuthProvider.java(实际进行身份验证)的人

实现admin provdier和用户提供程序是直截了当的,只需按照提供的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 = ?

有了这个,你就拥有了加密给你的密码所需要的一切 - 这就是算法:

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

管理员提供程序需要注意的另一件事: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表中。)