强制用户在提交之前重新输入凭据

时间:2017-01-31 13:01:49

标签: asp.net-mvc asp.net-mvc-5

使用MVC5,我有一个用户必须登录的应用程序,然后可以对某些数据执行标准操作(创建,编辑,删除)。

我想在执行某项任务时添加凭据提示。例如,用户正在编辑一行数据。我希望在更新行之前,当他们点击“保存”按钮时,系统会提示他们再次输入登录凭据。为了清楚起见,他们已经登录,我只想强制他们在允许保存之前重新确认他们的凭据。

我如何在控制器中执行此操作?我想要一个单独的屏幕/弹出窗口显示,在允许更新数据之前询问用户名和密码(然后将检查以确保正确的用户凭据)。

我查看了在控制器中创建一个新方法,该方法传递了用户名和密码,该方法会再次检查用户凭据。但是,当我还需要弹出窗口时,我如何从编辑屏幕调用它?我是否在编辑视图中添加隐藏div的路径,该视图显示用户单击“保存”按钮的时间,然后调用该方法?

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

听起来你理想地想要一个可以从客户端异步调用的动作。虽然这可以采用标准MVC控制器操作的形式,但您可能需要考虑将其构建为Web API控制器(通常我们将使用Web API控制器来提供非HTML响应)。您可以在网络上的许多地方阅读有关Web API的更多信息,因此我现在不再讨论它,但是假设您有一个HttpResponseMessage结果方法,如下所示:

[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一起包含在内。这将允许您检查用户是否从服务器输入了有效凭据。