2017-01-31 2 views
0

Используя MVC5, у меня есть приложение, в которое должен войти пользователь, а затем может выполнять стандартные действия над некоторыми данными (создавать, редактировать, удалять).Заставить пользователя повторно вводить учетные данные перед отправкой

Я хотел бы добавить приглашение учетных данных при выполнении определенной задачи. Так скажем, например, пользователь редактирует строку данных. Я хочу, чтобы у них снова было предложено ввести свои учетные данные, когда они нажали кнопку «Сохранить», прежде чем обновить строку. Чтобы быть ясным, они ДОЛЖНЫ войти в систему, я просто хочу заставить их повторно подтвердить свои учетные данные, прежде чем им разрешат экономить.

Как я могу это сделать в контроллере? Я хочу показать отдельный экран/всплывающее окно с запросом имени пользователя и пароля (который затем будет проверен для обеспечения правильных учетных данных пользователя), прежде чем разрешить обновление данных.

Я рассмотрел создание нового метода в контроллере, которому передано имя пользователя и пароль, который проверяет учетные данные пользователей снова. Но как мне это назвать на экране «Редактировать», когда мне также нужно всплывающее окно? Спустился ли я по пути добавления скрытого 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 (обычно мы будем использовать контроллеры 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 для приглашения на проверку подлинности. Когда пользователь выполняет действие, требующее аутентификации, вы можете отобразить всплывающее окно. Когда пользователь отправляет всплывающее окно, вы можете отключить асинхронный запрос конечной точки веб-API, который вы создали ранее. В зависимости от ответа, который вы возвращаете, вы либо выполняете задачу, либо снова запрашиваете учетные данные с сообщением об ошибке.

Очевидно, что по мере того, как вы отправляете учетные данные пользователя по запросу, убедитесь, что используете HTTPS.

EDIT:

Как Крис упомянуто ниже, это решение оставляет свой «быстрый чек» в руках клиента. Хотя это нормально, когда вы просто хотите предоставить способ, чтобы пользователь не мог выполнить действие без повторного ввода своих учетных данных, вы не должны полностью полагаться на .

Вы можете сохранить имя пользователя и пароль в виде скрытых полей и включить их в свой основной синхронный POST. Это позволит вам проверить, что пользователь ввел действительные учетные данные с сервера.

+1

Это полностью функциональное решение. Однако, создав JavaScript на основе JavaScript, злоумышленник может фактически полностью отключить проверку пароля и отправить форму без проверки пароля. Для обеспечения безопасности пароль должен быть проверен вместе с сообщением формы, чтобы его нельзя было обойти. –

+0

@ChrisPratt Я абсолютно согласен с вами, я отредактирую свой ответ с этой деталью для видимости. Я придерживался (возможно, слишком строго) к сфере действия вопроса. – jdurc