2010-11-25 161 views
2

您好,C#存儲信息

我工作在C#中的服務器程序,但我碰到的一個問題。當用戶連接,他的帳戶被認證等等。這一切都很好。

但問題是,服務器將不得不執行大量的查詢和功能與連接的用戶的用戶名,密碼等作爲參數。如果我只有1個客戶端,這不會成爲問題,但多線程和多個連接使這是一項艱鉅的任務。

目前,我有幾個功能,我有這樣的呼籲:(主要是出於安全原因)

functionName(action, value, username, password) 

這似乎只是矯枉過正我,因爲我有可能使用此功能5-6次在一個1字符串。

我想我只是尋找一種好方法來存儲多個連接用戶的信息,而不需要線程混合信息。

謝謝你的時間。

目前我在做什麼:

就像我以前說過,在這一刻,客戶端始終將自己的用戶名和加密密碼的服務器。並且用戶名和密碼將始終作爲大多數方法的參數添加,因此我可以檢查數據庫以查看數據是否正確。

它使代碼看起來非常複雜。

編輯:

目前用戶將登錄使用他的用戶名和密碼。然後,我加密信息並以包的形式發送它。

服務器解密信息並檢查數據庫中的用戶名和密碼。

之後,我創建GUID並將其發送回客戶端,以便它可以保存該ID並將其添加到每個後續數據包中。

現在我該如何(服務器端)檢查來自客戶端的數據包中的GUID是否是合法的服務器端? - 我只是暫時將GUID存儲在數據庫中?

回答

2

你可能會考慮返回一個安全令牌身份驗證的方法,也許是GUID

Guid Authenticate(username, password) 

,並在周圍的方法通過這個來代替username.password的

functionname(action, value, securityToken) 
+0

我還會補充說,他應該在固定的閒置時間和用戶註銷後過期令牌。出於安全目的... – 2010-11-25 11:19:02

+0

非常感謝,聽起來像個好主意。只是想知道,我將如何存儲這個GUID,而不會被下一個用戶的GUID覆蓋呢? - 我只是將它作爲臨時值存儲在數據庫中? – Nick 2010-11-25 11:37:12

0

如果我沒有理解正確地,你可以創建一些類,並首先用參數username,password來初始化它,然後它將只有2個參數的functionName(action,value)方法,你會像現在這樣調用它,一個字符串中有5-6次(??),在裏面它會調用實際帶有4個參數的函數名將這兩個參數從其字段中添加。

像SecureFunctionCaller sfc = SecureFunctionCaller(username,password); sfc.functionName(action,value)。

您可能需要將所有這些函數複製到此類,因此它取決於編號。你也可以創建一個用戶對象,並在其中包含用戶名和密碼,並使用3個參數功能,而不是4個參數,如果這樣會更好。

PS:那個說我同意,你有可能會做的一切都是錯的建築智慧,但有這麼一點信息它很難猜測

PPS:你的編輯,現在它明顯,你應該先進行身份驗證的用戶,所以他有後一個安全令牌,然後用它來代替這兩個參數ive認爲你是在服務器上而不是客戶端上描述方法調用。

2

我想你在想這些都是錯的。您只需在登錄時發送用戶密碼,然後忘記密碼。如果您想檢查用戶身份,請使用他們的唯一標識符。

1

我在這種情況下做的事情通常是讓用戶首先用他們的用戶名/密碼登錄並返回一個令牌,然後他們可以使用它來代替以後的調用。令牌有一個到期時間,你也可以將它綁定到他們的ip以獲得額外的安全性

你可以做的一件聰明的事情是包含一個散列作爲令牌的一部分,這樣你可以做一個初始檢查,如果該令牌是有效的進入數據庫,說你的令牌

dsklfgjkgjdlg,你有一個祕密令牌hashstring,說「craemefraice」,你哈希令牌與你的祕密字符串,並將其添加到您的令牌,因此它可能會dsklfgjkgjdlg:[thehash]

當你想檢查一個令牌時,你只需簡單地將字符串拆分爲:,用你的祕密字符串進行散列並檢查它是否與令牌匹配。如果不是,它是無效的,如果它是檢查對數據庫的憑據