如何在 ASP.NET MVC 5.2.3 和 Katana 中正确设置双重身份验证?
Posted
技术标签:
【中文标题】如何在 ASP.NET MVC 5.2.3 和 Katana 中正确设置双重身份验证?【英文标题】:How to set up two-factor authentication in ASP.NET MVC 5.2.3 and Katana correctly? 【发布时间】:2015-11-02 07:00:00 【问题描述】:在您通过 Visual Studio 2015 Community RC 在 ASP.NET MVC 5.2.3 模板中获得的代码中,如果您按原样运行它们,并且如果您使用您的电子邮件地址注册(并且不是 em> 使用外部服务提供商(例如 Facebook 或 Google 或 Linked In 或 Twitter),然后如果您通过输入用户名和密码登录网站,它会立即让您登录并且不会触发双重身份验证.它只是让您成功登录。
具体来说,如果您输入正确的用户名和密码,SignInManager
上的 PasswordSignInAsync
方法始终会返回 SignInStatus
或 Success
。它永远不会评估为SignInStatus.RequiresVerification
。
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model,
string returnUrl)
if (!ModelState.IsValid)
return View(model);
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout,
// change to shouldLockout: true
var result = await SignInManager.PasswordSignInAsync(
model.Email, model.Password,
model.RememberMe, shouldLockout: true);
switch (result)
case SignInStatus.Success:
// if I sign-in with my correct user name
// and password, the flow-of-control always
// comes here. The SignInStatus never evaluates
// to RequiresVerification
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
// the flow-of-control never reaches here
return RedirectToAction("SendCode",
new
ReturnUrl = returnUrl,
RememberMe = model.RememberMe
);
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
即使默认代码已启用并按照以下 sn-ps 代码的指示进行设置,也会发生这种情况。
在 Startup.ConfigureAuth 中
app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie,
TimeSpan.FromMinutes(5));
app.UseTwoFactorRememberBrowserCookie(
DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);
在 ApplicationUserManager.Create 中,工厂方法。
// Register two factor authentication providers. This application uses Phone
// and Emails as a step of receiving a code for verifying the user
// You can write your own provider and plug it in here.
manager.RegisterTwoFactorProvider("Phone Code",
new PhoneNumberTokenProvider<ApplicationUser>
MessageFormat = "Your security code is 0"
);
manager.RegisterTwoFactorProvider("Email Code",
new EmailTokenProvider<ApplicationUser>
Subject = "Security Code",
BodyFormat = "Your security code is 0"
);
var container = Unity.Container;
manager.EmailService = container.Resolve<EmailService>();
manager.SmsService = container.Resolve<SmsService>();
我已经在 Unity 容器中设置了我的 EmailService
和 SmsService
,并且它们已正确配置。
我还需要做什么才能正确设置它?我已经阅读了 this article 和 MSDN 上的一些文档,以及其他网站上的一些论坛帖子,但我不确定我是否遗漏了什么。
这家伙不是从任何地方调用/重定向到的。我想这就是缺少的东西。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> EnableTwoFactorAuthentication()
await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(),
true);
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user != null)
await SignInManager.SignInAsync(user, isPersistent: false,
rememberBrowser: false);
return RedirectToAction("Index", "Manage");
似乎我错过了我必须专门让用户调用 EnableTwoFactorAuthentication
操作的部分,因为目前没有调用它,但我不确定它应该如何与其余部分集成登录工作流程。
【问题讨论】:
在 userManager 配置中,您是否将 UserLockoutEnabledByDefault 设置为 true?这样做可以防止新用户在电子邮件确认之前登录(您还必须手动检查用户是否被 userManager.IsLockedOut 锁定) 【参考方案1】:在浏览器中单击 f12 并删除应用程序 Cookie
【讨论】:
以上是关于如何在 ASP.NET MVC 5.2.3 和 Katana 中正确设置双重身份验证?的主要内容,如果未能解决你的问题,请参考以下文章