从LINQ返回字符串

问题描述:

对于学校项目,我们必须创建一个需要登录的评估网站。 对于数据库连接,我选择了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

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

wachwoordLogin将是一个IQueryable这样你就可以通过使用FirstOrDefault()这将返回null得到这一点,如果没有找到:

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

输入您的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