【问题标题】:Authenticate Ignite Openfire users against ASP.NET membership?针对 ASP.NET 成员身份验证 Ignite Openfire 用户?
【发布时间】:2011-10-01 17:54:43
【问题描述】:

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

【问题讨论】:

  • 我想我要做的是尝试将所有加密密码用户转换为使用散列密码,因为我无法以其他方式转换,因为散列无法解密。由于 ASP.NET 使用 SHA1 对密码和盐进行散列,理论上我应该能够检查用户密码的 SHA1 散列和盐。我会再玩一些数据,看看会发生什么。
  • 你能让这个工作吗?
  • 我还不能让它工作。我一直忙于学期项目和其他副业。我希望尽快仔细研究集成这两个身份验证系统。如果我找到解决方案,我会通知您。
  • 我真的让它工作了,它是三个部分。真的没那么难,明天我会发布解决方案

标签: c# asp.net sql membership openfire


【解决方案1】:

所以,让它发挥作用实际上并不难。您需要创建三个新的 Java 文件,一个用于以下各项:

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

实现 admin provdier 和 user provider 很简单,只需按照提供的 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 数据库的密码字段进行比较,您就可以开始运行了。

另一个需要注意的 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 表。)

【讨论】:

  • 我想知道您是否可以发布一些关于如何实现提供程序以及您在哪里找到示例的文档的链接。不知道你是否愿意分享你的源代码,但是网上没有很多好的例子,我也没有找到任何关于这方面的全面文档。
  • 我只是将代码发布到网上——但不幸的是,我是为了工作而编写的,所以它并不是我真正要发布的。我只是关注了 OpenFire 网站上的文档,以及我在帖子中提到的文件。这真的不难——最困难的部分是将明文密码转换为可以与 IIS 数据库进行比较的密码,这就是我在这里发布该代码的原因......
  • 您能否提供相关文档的链接?将不胜感激!
  • 他们没有那么有用....但是你去igniterealtime.org/builds/openfire/docs/latest/documentation/…。遵循提供的 JDBC 驱动程序并对其进行修改会更有帮助(您实际上不必进行很多修改)——使用 Plain 作为密码哈希类型。
  • 感谢您的信息和跟进。我在 eclipse 上遇到了一点问题,但最终还是弄明白了。
猜你喜欢
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多