2011-07-09 41 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

您能否提供有關文檔的鏈接?將不勝感激! –