2017-01-31 5 views
0

MVC5を使用すると、ユーザーがログインしなければならないアプリケーションがあり、一部のデータ(作成、編集、削除)に対して標準のアクションを実行できます。投稿する前にユーザーに資格情報を再入力させる

特定のタスクが実行される場合はいつでも、資格情報のプロンプトを追加したいと思います。たとえば、ユーザーがデータ行を編集しているとします。行が更新される前に、Saveボタンを押したときにログイン資格情報を再度入力するように求められます。明確にするために、彼らはすでにログインしています、私はちょうど彼らが保存する前に彼らの資格情報を再確認するようにしたいです。

コントローラでこれを行うにはどうすればよいですか?私は、データの更新を許可する前に、別の画面/ポップアップを表示し、ユーザー名とパスワードを要求します(正しいユーザー資格情報を確認するためにチェックされます)。

コントローラに新しいメソッドを作成してみました。ユーザ名とパスワードが渡され、ユーザーの資格情報を再度確認します。しかし、編集画面からこれを呼び出すにはどうすればいいですか?表示するにはポップアップが必要ですか?ユーザーが[保存]ボタンをクリックしたときに表示される[編集]ビューに隠しdivを追加してから、そのメソッドを呼び出しますか?

答えて

1

一般的には、解決策を試すことが期待されます。次に、の特定の問題が発生した場合は、その特定の問題について質問できます。私はこれが比較的単純明快でなければならないとあなたに伝えます。必要なのは、ユーザーがパスワードを再入力することだけです。ちょうどあなたの編集フォームにパスワード入力を追加し、それをバインドする何かにあなたのビューモデルに、または単にあなたのビューモデルに加えて、アクションパラメータに直接バインドすることができます:あなたはそれをしたい場合は

[HttpPost] 
public ActionResult MyAction(MyViewModel model, string password) 

ポップアップで行うだけで、ポップアップHTMLをフォームに含める(ポップアップの入力がフォームの一部になるようにする)か、JavaScriptを使用してフォーム内の別の入力を設定する必要がありますビューモデルプロパティまたはアクションパラメータのいずれかに設定します。いずれにしても、パスワードはフォームデータの他の部分とともに投稿する必要があります。

一度あなたのポストのアクション内で、手動でパスワードを確認することができます

var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); 
var verifyPassword = UserManager.PasswordHasher.VerifyHashedPassword(user.PasswordHash, password); 
if (verifyPassword == PasswordVerificationResult.Failed) 
{ 
    ModelState.AddModelError("", "Password incorrect."); 
    // If password is incorrect, ModelState will be invalid now 
} 

if (ModelState.IsValid) 
{ 
    // save posted data 
} 
+0

ありがとうございました。ポップアップに手間がかかっていたので、ポップアップを表示するのではなく、実際にパスワード確認フィールドをフォーム自体に追加するという方法がありました。 – Baz

1

あなたは理想的には、クライアントから非同期で呼び出すことができるアクションをしたいと思うように聞こえます。これは標準的なMVCコントローラーアクションの形を取ることができますが、これをWeb APIコントローラーに組み込むことを検討することができます(通常、HTML以外の応答を提供するためにWeb APIコントローラーを使用します)。あなたはので、私は今それに入るが、あなたがこのようになりますHttpResponseMessage結果メソッドを持って言わせません。ウェブ上で多くの場所でWeb APIについての詳細を読むことができます:

あなたが返すことができ、このパターンを使用して
[HttpPost] 
public HttpResponseMessage CheckCredentials(string username, string password) 
{ 
    // Check user credentials and return either one of the following results: 

    // If credentials valid 
    return Request.CreateResponse(HttpStatusCode.OK); 

    // If not valid 
    return Request.CreateErrorResponse(HttpStatusCode.BadRequest); 
} 

有効な資格情報の場合は「200 OK」、無効な資格情報の場合は「400 Bad Request」となります。

既に述べたように、ページ上に表示されない認証プロンプトに必要なHTMLコンテンツを持つことができます。ユーザーが認証が必要なアクションを実行すると、ポップアップをレンダリングできます。ユーザーがポップアップを送信すると、前に作成したWeb APIエンドポイントへの非同期要求を起動できます。戻ってくる応答に応じて、タスクを続行するか、エラーメッセージとともに資格情報のプロンプトを再度表示します。

私たちが要求した以上にユーザーの資格情報を送信する場合は、HTTPSを使用していることを確認してください。

編集:クリスは、後述するように

、このソリューションは、クライアントの手の中にあなたの「クイックチェック」を残します。ユーザーが資格情報を再入力せずに簡単にアクションを実行できないようにするには、に完全にを頼るべきではありません。

ユーザー名とパスワードを隠しフィールドとして保存し、メインの同期POSTにそれらを含めることができます。これにより、ユーザーがサーバーから有効な資格情報を入力したことを確認できます。

+1

これは完全に機能的なソリューションです。ただし、JavaScriptベースにすることで、悪意のあるユーザーは実際にはパスワードチェックを完全に無効にし、パスワードを確認せずにフォームを送信することができます。セキュリティのためには、パスワードを回避することができないように、フォームのポストと共にパスワードを検証する必要があります。 –

+0

@ChrisPratt私はあなたに絶対に同意します。私は質問の範囲に(あまりにも厳密に)固執していました。 – jdurc

関連する問題