【问题标题】:Operator '==' cannot be applied to operands of type 'WebMatrix.Data.DynamicRecord'运算符“==”不能应用于“WebMatrix.Data.DynamicRecord”类型的操作数
【发布时间】:2012-11-20 14:45:54
【问题描述】:

我正在尝试使用 Razor 对名为 users 的表(包含 id(int) username(nchar(10))和 password(char(32) 进行非常简单的用户名和密码验证,但我遇到了这个错误:

Operator '==' cannot be applied to operands of type 'WebMatrix.Data.DynamicRecord' and 'HasherMD5Main'

我创建了一个 .cs 类,它执行 md5 哈希 (HasherMD5Main),它返回作为字符串传递的值(请不要在安全方面使用 cmets,这不会进入任何生产环境)并且我正在对输入的内容进行哈希处理密码,然后在数据库中查找。

代码

@{// Initialize page
    var enteredusername = "";
    var enteredpassword = "";
    var ErrorMessage = "";

    // If this is a POST request, validate and process data
    if( IsPost ) {
        enteredusername = Request.Form["enteredusername"];
        enteredpassword = Request.Form["enteredpassword"];
        var hash = new HasherMD5Main( enteredpassword );
        if( enteredusername.IsEmpty() || enteredpassword.IsEmpty() ) {
            ErrorMessage = "You must specify a username and password.";
        }
        else {
            var db = Database.Open( "MyConnectionString" );
            var passwordquery = db.QuerySingle( "SELECT password FROM users WHERE username = @0", enteredusername );
            if( passwordquery == hash ) {
                Response.Redirect( "/Success" );
            }
            else {
                Response.Redirect( "/Failure" );
            }

        }
    }
}

@if( ErrorMessage != "" ) {
    <p>@ErrorMessage</p>
    <p>Please correct the errors and try again.</p>
}

<form method="post" action="">
    <fieldset>
        <legend>Log In to Your Account</legend>
        <ol>
            <li>
                <label>Username:</label>
                <input type="text" id="enteredusername" name="enteredusername" />
            </li>
            <li>
                <label>Password:</label>
                <input type="password" id="enteredpassword" name="enteredpassword" />
            </li>
            <li>
                <p>
                    <input type="submit" value="login" /></p>
            </li>
        </ol>
    </fieldset>
</form>

关于如何简单地验证我的应用提供的散列密码是否与存储在数据库中的散列匹配的任何想法?

【问题讨论】:

  • 通过 ToString() 将它们都转换为字符串
  • 问:没有缩进是怎么回事?是不是弄乱了你的格式,或者你真的像那样格式化你的代码?
  • @Arsalan 你介意给我一个在我的变量上使用 ToString 的例子吗?我得到一个方法重载错误
  • @sputn1ck 你能摆脱 var 并保持它们的实际类型吗?如果你不知道类型是什么,你可以调试它,当你悬停变量时,它会显示类型!
  • @Arsalan 我不认为我有能力在 WebMatrix 中进行调试(也许在 VS 中我会)我尝试了这个,但我无法让它匹配(没有抛出错误) if (Convert.ToString(passwordquery) == Convert.ToString(hash))

标签: c# asp.net .net sql razor


【解决方案1】:

如果(密码查询 == 哈希) 是发生错误的地方。

当你比较某些东西时,两者都应该在比较之前最终归结为相同的类型。

问候, 帕万.G

【讨论】:

    【解决方案2】:

    产生错误的行是:

    如果(密码查询 == 哈希)

    hash 是您的自定义 Md5 哈希实例

    var hash = new HasherMD5Main(输入密码);

    而 passwordquery 是来自数据库查询 WebMatrix.Data.DynamicRecord 的结果集

    var passwordquery = db.QuerySingle("SELECT password FROM users WHERE username = @0", enteredusername);

    您要做的是让您的 MD5 哈希计算哈希,然后将其与您可以从结果集中提取的结果值进行比较。

    【讨论】:

    • 谢谢,我现在解决了这个问题,但我仍然可以将 WebMatrix.Data.DynamicRecord 转换为字符串,以便进行比较
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2015-08-09
    • 2020-10-19
    • 2014-05-27
    • 2015-01-25
    相关资源
    最近更新 更多