1

Web サービスと通信するために WCF を使用するアプリケーションを作成しています。データベースは、資格情報などのユーザー関連データの保存にも使用されます。DB 内のパスワードはハッシュ + ソルト化されています。

ユーザーは、提供されたユーザー名とパスワードを使用して手動でログインする必要があります。その後、アプリケーションはプロキシを使用して、認証を担当する Web サービスと通信します。Web サービスは、ユーザーが存在するかどうかを確認し、データをクライアントに返します。クライアントはデータを表示します。それ以外の場合、資格情報が無効であるか、サーバーに到達できない場合にエラーが表示されます。

私の質問:

  • Web サービスが行う作業の量を減らすために、認証プロセスをクライアントが行うようにしました。つまり、クライアントはユーザー名を Web サービスに送信します。Web サービスは、「ユーザー」テーブルにそのユーザー名のエントリが存在するかどうかをデータベースでチェックインします。存在する場合、Web サービスは、(DB からの) ハッシュ化およびソルト化されたパスワードをクライアントに返します。次に、クライアントは、ユーザーが入力したパスワードを、取得したハッシュ化/ソルト化されたパスワードと比較します。復号化は行われず、入力されたパスワードは同じソルト バイトを使用してハッシュされ、パスワードが比較されます。

    これは容認できる動作ですか?

  • 提供されたユーザー名が DB に見つからない場合、どうすればよいですか? サーバーが例外をスローする必要があり、それはクライアントによって処理されますか? または、認証部分を 2 つのステップに分割する必要があります。

    1) ユーザーが存在することを確認します。

    2) DB から暗号化されたパスワードを取得します。

    最初のステップでは、クライアントが「ユーザーが存在しない」ことを意味する特定の値を返します (例: ブール値「False」)。

4

1 に答える 1

5

あなたのアプローチに対する私の主な異議は、クライアントが認証されているかどうかをクライアントに決定させたいということです。

そうしないでください!

その場合、悪意のある攻撃者は常に自分自身が認証されていると宣言し (基本的に、最初の呼び出しに対するサーバーからの応答を無視するだけです)、システムにアクセスできます!

ドアをノックしているクライアントを受け入れるかどうかの決定は、あなたの手に委ねる必要があります。たとえば、これはバックエンド/サーバー側で絶対に行う必要があることです。

クライアントにその決定をさせないでください。

于 2012-08-19T07:59:00.697 に答える