【问题标题】:Unknown Type of data to return in linq to xml query在 linq to xml 查询中返回的未知数据类型
【发布时间】:2012-03-28 13:08:53
【问题描述】:

我想返回从 Linq 的查询中检索到的匿名数据。我不知道返回哪种 List 因为数据是“var”匿名的。

          public List<?????> QueryXmlUserLogin()
         { 
          var data = from item in XDocumentObj.Descendants("User_Data")
                   select new   
                   {
                       user = item.Element("user").Value,
                       password = item.Element("password").Value,
                   };

         data.ToList();

         return ????

【问题讨论】:

  • 只是一个小想法,看看变量名,你不存储密码,是吗?
  • 我这样做了,但是包含 XDocument 的文件是加密的
  • 那么,从安全角度来看,这并不是最好的主意,加密文件或什至加密每个密码或两者都加密并不重要。这是一个相当大的攻击向量,黑客获取您的加密密钥并解密文件/密码。一种更安全的方法是存储生成的密码强哈希。因此,您根本不存储密码,而只是一个不可逆转的“垃圾”。每次用户登录时,您都会对提供的密码重新应用哈希并将其与存储的哈希进行比较。但是这取决于您是否关心该应用程序的安全性。

标签: c# list linq-to-xml xmldocument


【解决方案1】:

想到两种数据类型,Tuple&lt;string, string&gt;KeyValuePair&lt;string, string&gt;,具体取决于它们的预期用途:

public List<Tuple<string, string>> QueryXmlUserLogin()
{ 
    var data = from item in XDocumentObj.Descendants("User_Data")
               select Tuple.Create(item.Element("user").Value, item.Element("password").Value);

    return data.ToList();
}

然而,使用这些通常可以隐藏返回类型的含义。由于该方法是公开的,因此您最好为该作业创建一个新类:

 public class UserCredentials
 {
     public string Username {get; set; }
     public string Password {get; set; }
 }

 public List<UserCredentials> QueryXmlUserLogin() ...

顺便说一句,(基于变量名)不应该以明文形式存储密码。抱歉,如果我对变量的解释有误或您的示例是人为设计的,但如果有人偶然发现这篇文章 - 应该存储密码(和唯一盐)的哈希值,而不是明文密码。

【讨论】:

    【解决方案2】:

    我不会返回匿名类型,因为他们有这个问题。也许你应该创建一个新的数据结构,构造它,然后返回一个List&lt;T&gt;

    【讨论】:

      【解决方案3】:

      你可以创建一个类型,例如:

      class Person {
        public string User { get; set; }
        public string Password { get; set; }
      }
      

      然后使用:

      public List<Person> QueryXmlUserLogin()
      { 
         var data = from item in XDocumentObj.Descendants("User_Data")
              select new Person
              {
                    User = item.Element("user").Value,
                    Password = item.Element("password").Value,
              };
      
         return data.ToList();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多