2012-03-14 62 views
2

我需要將我的應用業務邏輯放入WCF服務。該服務不應該依賴於ASP.NET,並且關於業務邏輯中經常使用的經過身份驗證的用戶有很多數據,因此它應該被緩存(可能使用分佈式緩存)。至於認證 - 我將使用兩個級別的認證:asp.net,wcf認證和緩存

  1. 前端 - 窗體身份驗證後端
  2. (WCF服務) - 消息用戶名認證。

對於這兩種身份驗證,應該使用相同的自定義成員資格提供程序。 要緩存的身份驗證的用戶數據,我要實現兩個服務方法:

1)身份驗證 - 將檢索所需要的數據,並將其放置到緩存中(其中用戶名將會用作鍵)
2 )SignOut - 將從高速緩存中刪除數據

問題1.以這種方式執行驗證是正確的(在兩個地方)?

問題2這個緩存策略值得使用還是應該使用aspnet兼容服務和asp.net會話?

也許,這些問題太籠統了。但是,無論如何,我想獲得任何建議或建議。

任何想法

回答

2

問題1:

從我的經驗的ASP窗體身份驗證就足夠了。沒有理由發送憑據作爲POST,當然不是GET。您可以使用它來更改密碼或帳戶信息方法。你可能想看看會員和角色。

問題2:

我會堅持使用ASP.NET會話。這可能會讓您的應用程序更容易出現問題和漏洞,我認爲這是不必要的。

+0

但會議應用回收和緩存持續時間將被你的設置後,將到期。 – Pankaj 2012-03-14 19:13:48

+0

如果您不希望在應用程序回收後丟失數據,則可以使用SQL Server。 http://support.microsoft.com/kb/317604 – 2012-03-23 22:00:34

0

如果你不想依賴於ASP.NET,那麼你不應該使用任何會話

我可以指點什麼:

  1. 使用UserNameValidator,所以你需要發送每個請求的用戶名/密碼到wcf服務(網上有很多關於如何配置UserNameValidator的文章)

  2. 實現IAuthorizationPolicy,您可以在其中檢索用戶數據以設置角色等。是創建一次該對象,然後再利用

的問題是,如果你只使用這2個部件,你需要爲每個請求獲取數據如你沒有辦法transfert從UserNameValidator用戶名到IAuthorizationPolicy 爲了避免這種情況,您需要在WCF中實現完整的身份驗證機制。這是不難的,而這裏是一個非常好的鏈接,幫我做它在1或2小時:

http://www.neovolve.com/post/2008/04/07/wcf-security-getting-the-password-of-the-user.aspx

的「PasswordAuthorizationPolicy」(請見下面鏈接)創建一次,然後再利用。對於每個請求,都會調用Evaluate方法。

這意味着您可以在此類上添加任何自定義屬性,將它們填充到構造函數中,然後永久使用它們。您不需要管理緩存生存期,因爲它綁定到客戶端通道,所以一旦客戶端關閉連接,通道將過期所有這些數據將從內存中刪除

1

將密碼傳遞到服務之間不是一個好的做法。您應該在您的前端應用程序中考慮creating a custom security token並將此令牌傳遞給WCF服務。 WCF服務可以使用證書驗證令牌。通過這種方法,你可以

  • 將任何用戶數據到安全令牌,並在WCF服務
  • 緩存在前端應用程序會話令牌使用,因此你不需要任何分佈式緩存
  • 集中式登錄,避免認證用戶兩次
+0

謝謝,rosencreuz。這是一個非常有用的信息。但是,我想知道將密碼傳遞給服務有什麼不好? – andrew 2012-03-25 12:15:28

+0

密碼是機密信息,您需要確保它。最佳做法是儘可能早地進行身份驗證,以免在所有應用程序中關心它。例如,很可能您不想在前端和WCF服務之間加密您的內部流量(SSL),您不希望對WCF服務中的密碼處理等進行安全審計。 – rosencreuz 2012-03-28 11:34:49

0

我的建議是在WCF端創建類認證(或別的東西):

public class Authentication<T> 
{ 
    public static Dictionary<string, T> Users { get; set; } 
} 

如果你有用戶等級:

public class User 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    ... 
} 

您可以管理用戶是這樣的:

Authentication<User>.Users.Add("username", new User());