2013-07-31 3 views
4

Я изучаю реализацию двухфакторной аутентификации в MVC, похожей на аутентификатор Google.Надежная реализация двухфакторной аутентификации

Поскольку некоторые пользователи не будут иметь двухфакторную аутентификацию, мы хотим использовать двухэтапный процесс - один экран, чтобы ввести имя пользователя и пароль, а другой - ввести одноразовый пароль.

Мое затруднение заключается в том, как вы надежно сохраняете имя пользователя и пароль пользователей, пока они вводят свой одноразовый пароль? В настоящее время мы получаем пароль и немедленно отклоняем или выписываем файл cookie, поэтому мы не храним пароль нигде. Однако с двумя шагами мы не можем немедленно выпустить cookie, потому что пользователь может просто перейти к другому действию. В равной степени я не хочу отправлять пароль обратно пользователю в виде скрытого элемента в форме.

Какова стандартная практика для этой ситуации?

Лучшее, что я могу придумать, это сохранить имя пользователя и пароль в сеансе, но я не уверен, насколько это безопасно.

+0

https://stackoverflow.com/questions/47368154/how-to-make-google-authentication-scan-qr-code/47368506#47368506 здесь ваше решение –

ответ

4

На самом деле вам не нужно хранить пароль и ждать с вашей аутентификацией до тех пор, пока не пройдет второй шаг. Вы можете просто реализовать два этапа вашей аутентификации отдельно (каждый шаг - обычная проверка подлинности: вы сразу же аутентифицируете или отклоняете) и предоставляете соответствующие полномочия пользователям, которые прошли первый шаг и второй шаг соответственно.

В частности, вы можете создать свой собственный атрибут Authorize AuthorizeConfirmedAttribute, полученный от AuthorizeAttribute, и использовать его для вашего второго этапа аутентификации. Итак, в контроллере, где вы создаете свой экран для ввода одноразового пароля, вы используете обычный атрибут [Authorize], гарантирующий, что пользователь прошел первый этап аутентификации. Во всех других действиях вы используете атрибут [AuthorizeConfirmed], чтобы гарантировать, что пользователь прошел оба этапа аутентификации.

+0

Как сохранить тот факт, что они авторизованы с первого шага? Что бы мой AuthorizeConfirm не отличался? – berkeleybross

+0

Точно так же вы сохраняете факт аутентификации пользователя в обычной однофакторной аутентификации (установите токен аутентификации в файл cookie). Фактически, вы выполняете аутентификацию. Вы можете думать о первом шаге не как о первом шаге, а о отдельной полномасштабной аутентификации. Вы просто не авторизуете пользователя после первого шага, чтобы сделать многое, только для ввода одноразового пароля. Что касается AuthorizeConfirmAttribute, вы переопределите метод AuthorizeCore и проверьте там токен аутентификации на втором этапе из файлов cookie. –

5

Хотя ответ уже принят, я думал, что добавлю другой способ. Вам не нужно регистрировать пользователя, когда вы проверяете их комбинацию имени пользователя и пароля, если они предоставили правильные данные, все, что вам нужно сохранить во временных данных, - это их имя пользователя или их профиль, если вы хотите, а затем перенаправить их на вторая страница фактов, которая только однажды предоставила правильный один временной пароль, вы фактически регистрируете пользователя.

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

Это отношение фрагмент о том, как достичь этого

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public ActionResult Login(LoginModel model, string returnUrl) 
{ 
    if (ModelState.IsValid) 
    { 
     if (Membership.ValidateUser(model.UserName, model.Password)) 
     { 
      var profile = MvcTFAProfile.GetProfile(model.UserName); 

      if (profile.UsesTwoFactorAuthentication) 
      { 
       TempData[CurrentUserTempDataKey] = profile; 
       TempData[RememberMeTempDataKey] = model.RememberMe; 
       return RedirectToAction("SecondFactor", new {returnUrl = returnUrl}); 
      } 

      FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
      return RedirectToLocal(returnUrl); 
     } 
    } 

    // If we got this far, something failed, redisplay form 
    ModelState.AddModelError("", "The user name or password provided is incorrect."); 
    return View(model); 
} 

Следующая ссылка содержит все сведения о том, как реализовать это в ASP.NET MVC, статья предназначается Google Authenticator, который не может быть, что вы работаете, но принцип регистрации пользователя в и т. д. тот же; https://samjenkins.com/mvc-two-factor-authentication/

+0

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

2

Вы должны посмотреть на идентификатор ASP.NET для потока выборок для двухфакторной аутентификации. После пост имеет больше информации и ссылки на образец http://blogs.msdn.com/b/webdev/archive/2014/02/11/announcing-preview-of-microsoft-aspnet-identity-2-0-0-beta1.aspx

+0

эта ссылка не работает. –

+0

Вот полный учебник https://docs.microsoft.com/en-us/aspnet/mvc/overview/security/aspnet-mvc-5-app-with-sms-and-email-two-factor-authentication –