【问题标题】:Returning a variable from a foreach-loop ASP.NET Core 5.0从 foreach 循环 ASP.NET Core 5.0 返回一个变量
【发布时间】:2021-12-21 10:12:24
【问题描述】:

我正在尝试从 foreach 循环返回密码以进行一些验证,但我无法让密码变量返回。我不断收到错误。我在控制器中执行此操作。

我的代码:

[HttpPost]
public IActionResult Login(userModel user)
{
    ViewBag.Password = pwd.GetPassword(user);

    string password = "";
    foreach(var pwdR in ViewBag.Password.Rows)
    {
       password = pwdR[1];
    }
    return password; // Here I get this error: CS0029: Cannot implicitly convert type 'string' to 'Microsoft.AspNetCore.Mvc.IActionResult'

    // VALIDATION CODE
    ....................
}

我做错了什么?

谢谢!

更新:

[HttpPost]
public IActionResult Login(userModel user)
{
    ScryptEncoder enc = new ScryptEncoder();
    UserModel pwd = new UserModel();
    ViewBag.Password = pwd.GetPassword(user);

    string password = "";
    foreach(var pwdR in ViewBag.Password.Rows)
    {
       password = pwdR[1];
    }
    return password; // Here I get this error: CS0029: Cannot implicitly convert type 'string' to 'Microsoft.AspNetCore.Mvc.IActionResult'

    // VALIDATION CODE
    bool match = enc.Compare(user.pwd, password);

    if (match) 
    {
        ViewBag.Error = "You are now logged in.";
        return View();
    } else
    {
        ViewBag.Error = "Login failed.";
        return View();
    }
}

【问题讨论】:

  • 因此您可以使用ActionResult<string>。但无论如何,从安全角度来看,在客户端返回密码确实是个坏主意。更好地在服务器端运行验证。
  • 如果您想了解更多关于 asp.net core 中的身份验证的信息,阅读 Microsoft 文档可能会很有用 :) docs.microsoft.com/en-us/aspnet/core/security/authentication/…
  • @mike 我已经阅读并尝试过使用 Identity,但我必须在这个项目中使用 MySql,这使事情变得很复杂。我花了几天时间尝试使用 Identity 进行注册和登录,但我遇到了很多复杂情况,所以我决定这样做。我已经有一个完成的数据库要连接,所以我不想创建新表。如果我可以使用 Sql 数据库,一切都会变得容易得多。
  • @AndrewSilver 我会试试的。谢谢。
  • 你能解释一下这个代码字符串密码=“”有什么意义吗? foreach(ViewBag.Password.Rows 中的 var pwdR){ 密码 = pwdR[1]; } ?

标签: c# asp.net asp.net-core .net-core


【解决方案1】:

加载所有用户并找到您需要的用户是一个很大的性能错误。

试试这个代码

[HttpPost]
public IActionResult Login(UserModel user)
{
    ScryptEncoder enc = new ScryptEncoder();

      var userNamePassword= GetUserNamePassword (user) ;

  if(  userNamePassword==null)
    ViewBag.Error = "Login failed. User is not found";
    return View();
}
    // VALIDATION CODE
    bool match = enc.Compare(userNamePassword.Password, password);

    if (match) 
    {
        ViewBag.Error = "You are now logged in.";
        return View();
    } else
    {
        ViewBag.Error = "Login failed.";
        return View();
    }
}

把你的模型类改成这个

 public class UserNamePasswordModel
    {
        public string Username { get; set; }

        public string Password { get; set; }

    } 

将此代码放置在登录操作附近的某处

private  UserNamePasswordModel GetUserNamePassword (UserModel user)
{

UserNamePasswordModel  userNamePassword= null;

var connectionString = "Server=localhost;Database=xxxx; uid = xxxx;Password=xxxx;";
        
using   (var connection = new MySqlConnection(connectionString))
{
  var command =  new MySqlCommand("SELECT UserName, Password  FROM User WHERE Username = @Username", connection);

command.Parameters.AddWithValue("@Username", user.Username);

        connection.Open();

       var reader = command.ExecuteReader();

        if (reader.HasRows)
        {
           if reader.Read()
            {
             userNamePassword= new UserNamePasswordModel
             {
              Username=  reader.GetString(0),
               Password =   reader.GetString(1)
             };
            }
        }
        
        reader.Close();
    }
}
    return userNamePassword;
       
}

【讨论】:

  • 哇,非常感谢!这也奏效了。我真的很感谢你抽出时间!非常感谢。
【解决方案2】:

尝试返回 Ok 并输入密码,例如:return Ok(password);

【讨论】:

  • 删除了错误,但其下的代码无法访问。在同一个控制器中返回密码后,我正在尝试进行一些验证。
  • 也许您可以分享更多关于其余代码的信息以及您正在尝试执行的验证类型
  • 现在更新了。这就是全部代码。
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 2020-07-16
  • 2012-12-27
  • 1970-01-01
  • 2014-10-26
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多