【问题标题】:ASP.NET Web API with OAuth2 - "Remember this browser" when using two factor authentication带有 OAuth2 的 ASP.NET Web API - 使用两因素身份验证时“记住此浏览器”
【发布时间】:2017-06-19 14:10:06
【问题描述】:

在 ASP.NET MVC 5 的默认模板中,使用两因素身份验证登录时,可以选择“记住此浏览器”。

在 ASP.NET MVC 中,这涉及在 Startup.Auth.cs 中配置 app.UseTwoFactorRememberBrowserCookie();,然后将 SignInManager.TwoFactorSignInAsync()isPersistent: true 一起使用

我想完成相同的操作,但使用带有 OAuth2 Bearer Tokens 的 ASP.NET Web API。

即我希望用户能够注销(或自动注销)。但是下次使用同一个浏览器登录时,用户只需要提供密码,不需要双重身份验证。

我将如何使用 OAuth2 Bearer Tokens 实现此类行为?

【问题讨论】:

  • 如果您不想使用它,为什么要设置两个因素身份验证?
  • 我希望用户必须在每台设备上使用两次身份验证(实际上,每个浏览器一次)。这是许多服务所采用的方法——Microsoft Account、Dropbox 等。
  • 您将需要用户表中的位字段 0 或 1,将用户标记为已成功使用双因素身份验证。然后在登录时检查该值。如果他们成功使用了两个因素身份验证,则让他们进入,如果没有,则将身份验证代码发送到他们的设备。

标签: c# .net asp.net-mvc asp.net-web-api asp.net-identity


【解决方案1】:

好吧,我认为这是客户端的问题,我想将您的问题重新表述为“在客户端存储身份验证令牌的最佳位置是什么?”

你有几个选择:

  1. HTML5 Web 存储(localStorage 或 sessionStorage)
  2. Cookie

使用选项一,当标签页/浏览器关闭时,令牌仍然有效,下次您会自动登录。

$window.sessionStorage.setItem('userInfo-token', 'tokenData');

使用选项二,您可以将令牌保存到 cookie 中,并在您向服务器发送请求时检索它。

当然,这两种选择各有利弊,更多信息我建议你阅读Where to Store your JWTs – Cookies vs HTML5 Web Storage

【讨论】:

  • 谢谢,但这并不是我想要的。我希望用户能够注销(或自动注销)。但是下次使用同一个浏览器登录时,用户只需要提供密码,而不是双重身份验证。
【解决方案2】:

我建议您需要更多地控制身份验证解决方案,并在成功登录 ASP.NET Web API OAuth2 Bearer Tokens 后,使用您创建的“记住此浏览器”cookie 来实现您自己的 LoginController存在,在用户浏览器上。就像 ASP.NET MVC app.UseTwoFactorRememberBrowserCookie() 一样。

如果用户使用两个因素登录,然后注销,您在该浏览器上放置一个 cookie,“记住我 30 天”cookie,下次他们登录时,您检查未过期的 cookie 并只允许使用密码登录到 OAuth2 Bearer Tokens 以外的其他登录方法。

由您掌控,您不需要 ASP.NET Web API OAuth2 Bearer Tokens 来解决您的整个登录解决方案。

【讨论】:

    【解决方案3】:

    我很确定这可以控制您用来验证用户身份的身份提供者。例如如果您使用任何微软服务,浏览器上的第一次登录会要求进行两因素身份验证,然后“记住”浏览器/设备以进行任何后续登录,并且不会启动两因素身份验证。 OAuth2 只是一个授权过程,而不是一个身份验证过程,因此您不太可能指示身份提供者不启动两因素身份验证。

    【讨论】:

      【解决方案4】:

      这些是你可以做的事情来实现这种行为。

      1) 在登录按钮期间单击发送 ajax 发布请求到 http://{yoursite}/token。成功登录后,它将返回不记名令牌和一些身份信息。检查本地存储中的“twofactorrequired”标志并确定是否需要双因素身份验证。如果此标志不可用,请将标志(首次登录)设置为 true。如果此标志值为 false,则表示两因素身份验证已完成。应根据发送给用户的电子邮件链接或手机代码设置此标志。

      $.ajax({
              type: "POST",
              url: "/Token",
              data: JSON.stringify(model),
              contentType: 'application/json',
              success: function (response) {
                  var json = JSON.parse(response);
                  localStorage.setItem("accesstoken", json["access_token"]);
      
                  if (isTwoFactorRequired() != false)
                  {
                  localStorage.setItem("twofactorrequired", true);   
                  }
      
                  window.location.href = "/Home/Index";           
              },
              failure: function (errMsg) {
              }
          });
      
      
      function isTwoFactorRequired() {
      if (localStorage.getItem("twofactorrequired") == false) {    
      return false;
      }
      else {
      return true;
      }
      

      注意:此方法并不完全安全。可以使用开发人员工具 (F12) 轻松设置此标志。为了使这更安全,需要将此标志与 MAC 地址或类似地址一起保存在 db 中。

      【讨论】:

        猜你喜欢
        • 2016-07-26
        • 2018-08-14
        • 2015-09-26
        • 2012-12-02
        • 2015-07-30
        • 2013-01-05
        • 1970-01-01
        • 1970-01-01
        • 2013-06-06
        相关资源
        最近更新 更多