0

我得到一个错误不是所有的代码路径都返回一个值?

    public string Authentication(string studentID, string password) // this line?
    {
        var result = students.FirstOrDefault(n => n.StudentID == studentID);
        //find the StudentID that matches the string studentID 
        if (result != null)
        //if result matches then do this
        {
            //---------------------------------------------------------------------------- 
            byte[] passwordHash = Hash(password, result.Salt);
            string HashedPassword = Convert.ToBase64String(passwordHash);
            //----------------------------------------------------------------------------
            // take the specific students salt and generate hash/salt for string password (same way student.Passowrd was created)

            if (HashedPassword == result.Password)
            //check if the HashedPassword (string password) matches the stored student.Password
            {
                return result.StudentID;
                // if it does return the Students ID                     
            } 

        }
        else
        //else return a message saying login failed 
        {
            return "Login Failed";
        }
    }
4

5 回答 5

6

如果结果不是 null 而是 result.Password != HashedPassword 你没有返回任何东西。

您应该更改为:

...
if (HashedPassword == result.Password)
{
     return result.StudentID;
     // if it does return the Students ID                     
} 
return "Invalid Password";
...
于 2012-04-24T09:40:04.463 回答
4

问题在于,由于嵌套的 if 语句,您的第一个 if 语句不能确保返回值。假设您将结果设置为一个值(非空)并且您的散列密码和提供的密码不匹配,如果您遵循该逻辑,您将无法命中返回语句。

您应该像这样在嵌套的 if 语句中添加 else 子句:

if (HashedPassword == result.Password)
//check if the HashedPassword (string password) matches the stored student.Password
{
    return result.StudentID;
    // if it does return the Students ID                     
} 
else
{
    return "Login Failed";
}

或者更可取的是,删除您已经拥有的 else 语句,以便函数以返回登录失败结束:

if (result != null)
{
   //....
}

return "Login Failed";

...使用第二种方法,您无需担心使用 else ,因为如果满足所有其他条件,则嵌套的 return 语句无论如何都会结束该函数。如果任何身份验证步骤失败,请尝试将此最终返回视为默认操作


在您的代码中要注意的另一点是,以这种方式返回混合数据并不是理想的做法。即结果可能是学生证,也可能是错误消息。考虑创建一个具有多个属性的专用结果类,调用代码可以检查这些属性以查看逻辑验证的状态。类似以下的类将是一个好的开始:

public class LoginResult
{
   //determines if the login was successful
   public bool Success {get;set;}

   //the ID of the student, perhaps an int datatype would be better?
   public string StudentID {get;set;}

   //the error message (provided the login failed)
   public string ErrorMessage {get;set;}
}

(尽管如此,您的调用代码似乎已经知道学生ID)

于 2012-04-24T09:40:01.147 回答
1

删除其他。做就是了

if(result != null) {
    ...
}
return "Login Failed";
于 2012-04-24T09:40:25.213 回答
1

如果出现以下情况,您还应该返回一些东西:

if (HashedPassword != result.Password)

在内部 if 中放一个 else

于 2012-04-24T09:40:47.053 回答
-2

我对您的代码进行了一些更改。尝试一下。

public string Authentication(string studentID, string password) 
{
    var result = students.FirstOrDefault(n => n.StudentID == studentID);
    var yourVar;       
    if (result != null)       
    {

        byte[] passwordHash = Hash(password, result.Salt);
        string HashedPassword = Convert.ToBase64String(passwordHash);

        if (HashedPassword == result.Password)            
        {
            //return result.StudentID;
            yourVar = result.StudenID;
            // if it does return the Students ID                     
        } 

    }
    else
    //else return a message saying login failed 
    {
        yourVar = "Login Failed";
    }
    return yourVar;
}
于 2012-04-24T09:44:07.397 回答