登录身份验证始终返回 true

Posted

技术标签:

【中文标题】登录身份验证始终返回 true【英文标题】:Login authentication always returning true 【发布时间】:2012-03-09 09:55:53 【问题描述】:

我的代码正在查询服务器,如果用户和密码正确,则返回“+”字符。否则不会。不好的做法,但我只是用这个想法来学习我是初学者的 C# 和 ASP.NET(我以前用 JSP 编写过程序)。

我的问题:

目前,我似乎有一些错误导致我的方法 总是返回真。这不应该是这样。它应该只是 当用户名/密码通过身份验证时为 true。 我希望它仅在用户未登录时才显示登录表单 并且会话尚未开始-适应我的最佳方法是什么 执行此操作的代码?

到目前为止我的代码:

   @
    // Initialize general page variables
    string username = "";
    string password = "";
    bool rememberMe = false;

    // Validation
    bool isValid = true;

    // If this is a POST request, validate and process data
        if (IsPost) 
            username = Request.Form["username"];
            password = Request.Form["password"];
            rememberMe = Request.Form["remember"].AsBool();

            // Attempt to login to the external authentication server
            if(isValid)
                using (TcpClient client = new TcpClient("hosty.host.com", 110)) 
                using (NetworkStream stream = client.GetStream()) 
                using (StreamReader reader = new StreamReader(stream)) 
                using (StreamWriter writer = new StreamWriter(stream)) 
                    writer.WriteLine("USER " + username );
                    writer.WriteLine("PASS " + password );
                    string response = reader.ReadLine();
                    isValid = response[ 0 ] == '+';
                    Response.Write(response);
                    writer.WriteLine("quit\n");
                
                
                
                
            

            if (isValid) 
                <text>IT WORKED---></text>
            //USER LOGGED IN/ SESSION STARTED


             else 
                <text>IT DIDNT WORK :( </text>
                //USER NOT LOGGED IN, SESSION NOT STARTED
            
        
       
        <h2>Login Here</h2>
        <form action="" method="post">
          <fieldset>
            <legend>Login Form</legend>
            <label for="username">Username:
              <input type="text" name="username" id="username" value="" />
            </label>
            <label for="password">Password:
              <input type="password" name="password" id="password" value="" />
            </label>
            <label for="remember">
              <input class="checkbox" type="checkbox" name="remember" id="remember" checked="checked" />
              Remember me</label>
            <p>
              <input type="submit" name="login" id="login" value="Login" />
              &nbsp;
              <input type="reset" name="reset" id="reset" value="Reset" />
            </p>
          </fieldset>
        </form>
      </div>
          </fieldset>
        </form>

【问题讨论】:

请避免在问题标题中包含C#/Razor/ASP.NET 之类的内容。这就是标签的用途。 您可以堆叠使用语句(嵌套语句),因此不需要那么多组大括号。 【参考方案1】:

您从isValid=true 开始,但如果您的程序甚至无法连接到服务器,isValid 仍然为真。

所以也许您的用户甚至根本没有验证,即使验证未完成,您也可以从 isValid 开始并以相同的方式结束。

代码原样,我以false开头,去掉一行。

// Validation
    bool isValid = false;

    // If this is a POST request, validate and process data
        if (IsPost) 
            username = Request.Form["username"];
            password = Request.Form["password"];
            rememberMe = Request.Form["remember"].AsBool();

            // Attempt to login to the external authentication server
            // if(isValid)
            
                using (TcpClient client = new TcpClient("hosty.host.com", 110)) 
                using (NetworkStream stream = client.GetStream()) 
                using (StreamReader reader = new StreamReader(stream)) 
                using (StreamWriter writer = new StreamWriter(stream)) 
                    writer.WriteLine("USER " + username );
                    writer.WriteLine("PASS " + password );
                    string response = reader.ReadLine();
                    isValid = response[ 0 ] == '+';
                    Response.Write(response);
                    writer.WriteLine("quit\n");
                
                
                
                
            

            if (isValid) 
                <text>IT WORKED---></text>
            //USER LOGGED IN/ SESSION STARTED


             else 
                <text>IT DIDNT WORK :( </text>
                //USER NOT LOGGED IN, SESSION NOT STARTED
            
        

还要注意 Page.IsValid 是 Web 表单上的现有参数。

【讨论】:

(笑话:如果登录身份验证总是返回 true,那么将重要信息显示给未通过身份验证的用户 :) 哈哈,是的,这是我完整程序的(略微)缩减版。我在完整版中附加了一些更多信息。我现在已经适应使用您的更改,但不幸的是它仍然总是说它已经过身份验证(打印“IT WORKS!”)! @SimonKiely 你能调试你的代码看看返回时有什么响应吗? 我正在尝试这样做(Response.Write(response); 在我上面的代码中)但屏幕上没有呈现任何内容。显示此代码的最佳方式是什么?抱歉,我知道这个愚蠢的问题,但我才刚刚开始 C#。 好的,我有一个新错误。响应字符串保持“+OK Dovecot 就绪。”。我相信这只是表明 POP3 服务器已准备好接受连接,但它没有提供任何身份验证?如果我尝试调用'reader.ReadLine();'多次,我进入一个无限循环。有什么想法吗?

以上是关于登录身份验证始终返回 true的主要内容,如果未能解决你的问题,请参考以下文章

JWT 身份验证始终返回 401 HTTP 错误 asp.net core

Laravel Passport身份验证问题:始终返回未经身份验证的身份

Codeigniter facebook 身份验证问题

ORACLE。使用LDAP进行身份验证始终返回-16

基于策略的授权 - Auth0 身份验证 - 始终返回 Forbidden 403

IsCustomResponse 在基于适配器的身份验证中始终返回 false