2011-03-09 150 views
0

對於學校項目,我們必須創建一個需要登錄的評估網站。 對於數據庫連接,我選擇了LINQ,因爲它是新的,應該更容易/更好使用。從LINQ返回字符串

我設法創建一個登錄檢查以下內容:

public static Boolean Controle(int id, string wachtwoord) 
{ 
    DataClassesDataContext context = new DataClassesDataContext(); 

    var loginGebruiker = 
     from p in dc.Gebruikers 
     where p.GebruikerID == id 
     where p.GebruikerWachtwoord == wachtwoord 
     select p; 


    return true; 
} 

現在,我想創建一個「忘記密碼」選項,在這裏輸入你的ID和密碼被返回(後它會通過電子郵件發送給你,不知道我會怎麼做這兩種,建議)

我試着用下面的代碼:

頁面上的按鈕後面
public static string Forgot(int id) 
{ 
    var context = new DataClassesDataContext(); 

    var wachtwoordLogin = (
     from p in dc.Gebruikers 
     where p.GebruikerID == id 
     select p.GebruikerWachtwoord); 

    return wachtwoordLogin.ToString(); 
} 

代碼:

lbl1.Text = Class1.Forgot(Convert.ToInt32(txt1.Text)); 

現在,當我進入第一用戶(1)的一個id,LBL1變成這樣:。

SELECT [T0] [GebruikerWachtwoord] FROM [DBO] [Gebruiker] AS [T 0] WHERE [T 0]。[GebruikerID] = @ P0

我不知道如何解決這個問題,我一直在到處找,我希望有人能幫助我。

感謝, 托馬斯

+0

好笑。我從來沒有意識到,當調用ToString()時,LINQ to SQL的內部'DataQuery '類(表示'IQueryable ')返回SQL代碼。 – Steven 2011-03-09 13:58:00

回答

2

LINQ使用延遲執行,所以你「wachtwoordLogin」其實只是「如何讓你的數據。」直到你申請一個操作員,LINQ纔會真正嘗試檢索你的數據。

你的第一個聲明:

var loginGebruiker = (
    from p in dc.Gebruikers 
    where p.GebruikerID == id 
    where p.GebruikerWachtwoord == wachtwoord 
    select p).FirstOrDefault() 

if (loginGeruiker != null) { 
    //Valid login 
} else { 
    // invalid 
} 

FirstOrDefault手段,採取的第一個項目在列表中,或返回無。

在你需要同樣的事情,另一種情況:

user = wachtwoordLogin.FirstOrDefault(); 

延伸閱讀:MSDN 101 LINQ Samples


你對電子郵件忘記了密碼的問題,你有沒有想過實現黃金問題算法呢?其簡化,並做同樣的事情。

基本上,在註冊時只讓他們回答一些問題,如果他們可以驗證他們,讓他們重置密碼。

+0

謝謝!它現在在工作! :D – Thomas 2011-03-09 12:58:22

+0

我的確在想金色問題算法,但它是一個學校項目,我們必須遵循他們的規則。 (還是)感謝你的建議。 :) – Thomas 2011-03-09 13:13:07

0

wachwoordLogin將是一個IQueryable這樣你就可以通過使用FirstOrDefault()這將返回null得到這一點,如果沒有找到:

(from p in dc.Gebruikers 
where p.GebruikerID == id 
select p.GebruikerWachtwoord).FirstOrDefault(); 
1

輸入您的ID和密碼被返回

什麼那麼,如果任何知道用戶名的人都可以看到密碼,那麼這就是密碼的要求嗎?我知道這不是你要問的,但對於開始編程的人來說,我有責任指出這一點。你在這裏創建的實質上是一個完全破碎的登錄模型。沒有人應該使用這樣的系統。

你永遠不應該有史以來顯示密碼。不在屏幕上,不在電子郵件中,從不。

密碼,如果它們甚至需要存儲的話(CodingHorror最近有幾篇好帖子,主張像OpenID這樣的東西)應該以散列形式存儲,並且基本上不能被檢索。當用戶登錄時,同樣對它們提供的密碼進行哈希(在到達應用程序代碼後立即將其傳送到系統中的任何其他位置),並將其與存儲的哈希版本進行比較。

如果用戶要求輸入密碼,那麼您沒有密碼。你不能給他。這是他的保護。與其向用戶提供密碼,如果忘記密碼,則向用戶提供重置密碼的方法(通過臨時可用的URL發送電子郵件到文件中的地址,這是一組「安全問題」,以驗證其身份等等),以便他可以輸入新的來覆蓋舊的。但是,你不應該能夠「向用戶顯示」他的密碼,因爲即使你作爲系統的管理員也不能以任何可用的形式看到它。

+1

+1,但用「散列」替換「encrypted」。加密的數據仍然可以解密和查看;散列數據不能。 – LukeH 2011-03-09 13:01:24

+0

@LukeH:好點。我剛剛在與業務用戶交談時習慣於交換這兩個術語,但我應該擺脫這種習慣:) – David 2011-03-09 13:03:23

+0

雖然我意識到這一點,但我對ASP.NET/LINQ/C#很陌生,而且我試圖採取這一步一步。 最終目標是生成一個新的隨機密碼並通過電子郵件發送給用戶。但我擔心這更加不可能達到。 (我甚至不知道如何通過電子郵件發送給用戶)。 任何幫助都非常感謝,感謝所有評論! :) – Thomas 2011-03-09 13:18:53