2011-07-09 45 views
0

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

+0

我想我要做的是尝试和转换所有加密的密码用户使用散列密码,因为我无法转换另一种方式,因为散列无法解密。由于ASP.NET使用SHA1来对密码和盐进行哈希处理,理论上我应该能够检查SHA1哈希值和salt是否为用户的密码。我将更多地使用这些数据,看看会发生什么。 –

+0

你能够得到这个工作? – debracey

+0

我还没有得到这个工作。我一直忙于学期项目和其他项目。我希望能尽快仔细研究整合两种认证系统。如果我找到解决方案,我会告诉你。 –

回答

2

因此,实际上并不难。您需要创建三个新的Java文件,每个操作:

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

实施管理provdier和用户提供的straightfoward,只需按照所提供的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的提供给您的用户名,清理它(有时候是用户@主机 - @主机部分不是用户名的一部分),并根据用户名给出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数据库的密码字段进行比较,即可关闭并运行。

管理提供者需要注意的另一件事情是: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.*属性后,您将无法再使用默认管理员登录 - 如果出现问题,您将不得不返回数据库并更改配置(在dbo.ofProperty

+0

我想知道您是否可以发布一些链接,了解如何实施提供商以及您找到样品的文档。不知道你是否愿意分享你的源代码,但网上没有很多好的例子,我还没有找到任何有关这方面的全面文档。 –

+0

我只是在网上发布代码 - 但不幸的是我写了它的工作,所以它不是真的发布。我只是跟着OpenFire网站上的文档以及我在文章中提到的文件。这并不困难 - 最难的部分是将明文密码转换为可与IIS数据库进行比较的密码,所以我在此处发布该代码... – debracey

+0

您能否提供有关文档的链接?将不胜感激! –

相关问题