【问题标题】:ArgumentException when trying to implement a Login (ASP.NET Core Project)尝试实现登录时出现 ArgumentException(ASP.NET Core 项目)
【发布时间】:2021-04-25 21:38:03
【问题描述】:

我尝试在我的 ASP.NET Core Web 应用程序中实现登录,它使用来自 SQL 数据库的数据来验证登录。 我创建了一个服务类,它应该从数据库中获取用户名和密码,然后我试图将它们与登录信息进行比较。 但是,当我尝试对其进行测试时,我不断收到以下异常:

ArgumentException:初始化字符串的格式不符合从索引 0 开始的规范。

我尝试比较值的方法如下所示:

 private async Task<ApplicationUser> AuthenticateUser(string username, string password)
    {
  
        var loginName = await _loginService.GetUsernameAsync(username);
        var loginPassword = await _loginService.GetPasswordAsync(password);



        if (username.Equals(loginName.Username))
        {
            if(password.Equals(loginPassword.Password))
            {
                return new ApplicationUser()
                {
                    Username = loginName.Username,
                    Password = loginPassword.Password
                    //FullName = "Name"
                };
            }
            else
            {
                return null;
            }
        }
        else
        {
            return null;
        }
    }

【问题讨论】:

  • 我想看看你的 _loginService.GetPasswordAsync(password);我想知道如何在没有用户名的情况下获取密码。
  • 公共异步任务 GetPasswordAsync(string password) { return await _context.Users .FirstOrDefaultAsync(e => e.Password == password); }
  • 但在现实生活中,大多数用户拥有相同的密码。您还需要使用用户名。

标签: c# asp.net-mvc asp.net-core authentication argumentexception


【解决方案1】:

我认为你有一个错误。替换

if (username.Equals(loginName.Username))
        {
            if(password.Equals(loginPassword.Password))
            {


if ( loginName!= null && username == loginName.UserName 
         && loginPassword !=null && password==loginPassword.Password)

顺便修复一下您的密码查询。为此,您不需要 2 个操作:


public async Task<Users> GetPasswordAsync(string userName,string password)
 {
 return await _context.Set<Users>().Where(e => e.UserName==userName 
                        && e.Password == password).FirstOrDefaultAsync(); 
} 

【讨论】:

  • 感谢您的回答。我确实忘记检查字符串是否为空。
  • 不客气!不要忘记接受它是否有效。
  • 我得到这个异常的主要问题是我没有在一个方法中正确地得到连接字符串。因此,他无法验证数据库中的值
  • 不要再对字符串使用等号了。这非常棘手。