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 ステートメントが値を返すことを保証しないことです。値 (null 以外) に設定された結果があり、ハッシュ化されたパスワードと提供されたパスワードが一致しないとします。そのロジックに従うと、return ステートメントにヒットしません。

次のように、ネストされた 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";

...この 2 番目のアプローチでは、else の使用について心配する必要はありません。他のすべての条件が満たされている場合は、ネストされた return ステートメントがとにかく関数を終了するためです。認証ステップのいずれかが失敗した場合のデフォルト アクションとして、この最終リターンを考えてみてください。


コードに関するもう 1 つの注意事項は、このような方法でデータの混合を返すことは理想的な方法ではないということです。つまり、結果は学生 ID であったり、エラー メッセージであったりします。呼び出し元のコードがロジック検証のステータスを確認できる複数のプロパティを持つ専用の結果クラスを作成することを検討してください。次のようなクラスから始めるとよいでしょう。

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 に答える