2012-10-25 265 views
25

我正在創建用戶憑據駐留在Active Directory中的安全(SSL)公共服務。我想利用ServiceStack的身份驗證,並已閱讀wiki article。我已經編寫了用AD驗證用戶憑證的代碼。我有幾個問題。如何通過Active Directory/Windows身份驗證使用Servicestack身份驗證?

  1. 我使用哪個Auth提供程序?憑證,基本身份驗證或自定義?該服務需要SSL,因此基本身份驗證將是安全的,但密碼將被加密以增加安全性。
  2. 我還需要存儲UserAuth並緩存AuthUserSession嗎?
  3. 單點觸摸客戶端是否支持身份驗證?

更新2:我最終使用CredentialsAuthProvider製作了一個與AD集成的測試SS服務。不過,我的最終目標是,有1個網站被客戶打電話時是api。所以基本上是一個SS MVC網站。

更新:

這是做一些更多的研究SS是考慮這樣做可以支持Windows身份驗證在未來的商業產品後,我的理解。我在SS谷歌集團的神話中對此進行了閱讀。我問這個問題的原因是我的公司使用IWA構建內部應用程序,如果沒有IWA,採用SS MVC就很困難。我想我讀過你可以將SS MVC網站託管在使用IWA的ASP.NET網站之外,但我還沒有嘗試過。

+0

我在twitter上與Demis Bellot對話並得到了類似的迴應。 '@ChaseFlorell不是我調查過的東西,不再在Win/Active Directory中工作。需要一些研發來發現/解決問題......你應該在下面寫下他所說的答案。 –

回答

5

我也迷上了ServiceStack具有集成的Windows身份驗證(企業應用程序),關鍵是要跳過試圖把它與ServiceStack的AuthProviders完全整合,因爲IWA的一般方法不處理在您的應用程序代碼中擁有憑據 - 它由Web服務器處理。我做的是:

  1. 在IIS中配置站點/應用程序,以便Windows身份驗證是唯一啓用的選項。 (不允許匿名訪問。)這意味着IIS本身將處理未經身份驗證的用戶的質詢響應(HTTP 401/200)序列,併爲您處理該過程的身份驗證部分。

  2. 將ServiceStack的IHasRequestFilter(HTTP預請求過濾器)作爲屬性(例如[AdminOnly])實施。此過濾器的RequestFilter方法從HttpContext(HttpContext.User.Identity.Name)獲取當前用戶名,從存儲庫(可能是SQL數據庫,平面文件等)查找它,使用ServiceStack的ICacheClient(內存緩存,Redis等)緩存結果,並在未經授權的情況下拋出403 HttpError。

完成這一操作,一切是必然的,添加屬性到所需的類和方法(它可以獲取該認證/授權到服務管道需要時),在我APPHOST登記自己所需的緩存提供商實施,例如:

container.Register<ICacheClient>(new MemoryCacheClient() { FlushOnDispose = false }); 

它工作的很好。

+0

謝謝你的答案。我會試試這個。 – BrandonG

5

這是什麼德米斯貝洛在twitter上說。可能有可能,但需要更多的研究。

不是我調查過的東西,不在Win/Active 目錄中工作。需要一些R & D來查找/解決問題

我終於得到了一個與AD工作的原型服務。我實現了CredentialsAuthProvider。現在,這根本不依賴於ASP.NET IWA,但可以輕鬆檢查用戶是否在AD中。希望這可能有助於某人。

public class LDAPAuthProvider : CredentialsAuthProvider 
{ 
    public override bool TryAuthenticate(IServiceBase authService, string userName, string password) 
        { 
         //Check to see if the username/password combo is valid, an exception will be thrown if the username or password is wrong 
         try 
         { 
          DirectoryEntry entry = new DirectoryEntry(ConfigurationManager.AppSettings["TargetOU"], userName, password); 
          object nativeObject = entry.NativeObject; 
         } 
         catch (Exception) 
         { 
          //This means the username/password combo failed 
          return false; 
         } 

         return true; 
        } 
} 
+0

我會盡可能多地爲這個答案添加信息。包含上述「更新」中的一些信息,也許包含一些關於如何使用CredentialsAuthProvider的代碼。 –

+0

我認爲一個很好的折衷辦法是使用Forms Authentication。 IWA過去很容易設置,不需要爲用戶進行設置,但對於較新版本的IE,您必須將該站點添加到受信任的站點,然後編輯安全性以允許傳遞用戶憑據。您可以實施表單身份驗證,如果客戶端訪問該URL,則可以對其憑據進行身份驗證,並使用FormsAuthentication.SetAuthCookie()保存cookie。 – BrandonG

+0

這個SO問題將是一個很大的幫助:http://stackoverflow.com/questions/15068774/use-asp-net-authentication-with-servicestack – BrandonG

相關問題