我想知道是否有任何简单的方法可以根据我现有的ASP.NET成员资格验证Openfire用户?我看到Openfire有一个自定义数据库集成指南here 但我不认为它支持我目前的密码安全方法。显然我的一些成员有1型,有些有2型密码安全。我不确定是怎么回事,但由于它们不一致,我不能使用Openfire的预设密码安全选项之一。我需要查询我的数据库以确定密码的存储方式,然后根据类型应用正确的密码验证方法。有什么建议吗?
答案 0 :(得分:2)
因此,实现这一点并不困难。您需要创建三个新的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
表中。)