Web サービスと通信するために WCF を使用するアプリケーションを作成しています。データベースは、資格情報などのユーザー関連データの保存にも使用されます。DB 内のパスワードはハッシュ + ソルト化されています。
ユーザーは、提供されたユーザー名とパスワードを使用して手動でログインする必要があります。その後、アプリケーションはプロキシを使用して、認証を担当する Web サービスと通信します。Web サービスは、ユーザーが存在するかどうかを確認し、データをクライアントに返します。クライアントはデータを表示します。それ以外の場合、資格情報が無効であるか、サーバーに到達できない場合にエラーが表示されます。
私の質問:
Web サービスが行う作業の量を減らすために、認証プロセスをクライアントが行うようにしました。つまり、クライアントはユーザー名を Web サービスに送信します。Web サービスは、「ユーザー」テーブルにそのユーザー名のエントリが存在するかどうかをデータベースでチェックインします。存在する場合、Web サービスは、(DB からの) ハッシュ化およびソルト化されたパスワードをクライアントに返します。次に、クライアントは、ユーザーが入力したパスワードを、取得したハッシュ化/ソルト化されたパスワードと比較します。復号化は行われず、入力されたパスワードは同じソルト バイトを使用してハッシュされ、パスワードが比較されます。
これは容認できる動作ですか?
提供されたユーザー名が DB に見つからない場合、どうすればよいですか? サーバーが例外をスローする必要があり、それはクライアントによって処理されますか? または、認証部分を 2 つのステップに分割する必要があります。
1) ユーザーが存在することを確認します。
2) DB から暗号化されたパスワードを取得します。
最初のステップでは、クライアントが「ユーザーが存在しない」ことを意味する特定の値を返します (例: ブール値「False」)。