如何在 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 方法始终会返回 SignInStatusSuccess。它永远不会评估为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 容器中设置了我的 EmailServiceSmsService,并且它们已正确配置。

我还需要做什么才能正确设置它?我已经阅读了 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 中正确设置双重身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Web API 5.2.3 中使用 FromForm 属性

如何在 ASP.Net MVC 6 中编辑和继续

asp.net mvc 如何添加css

如何在 ASP.NET MVC 中集成 AngularJS

ASP.NET中的MVC如何使用?

ASP.NET中的MVC如何使用?