我最近在我的项目中实施了基于身份的两因素身份验证,效果很好。
这就是我对双因素身份验证 (TFA) 工作的理解;用户登录并在成功登录应用程序时发送 TFA 代码并使用记住浏览器选项对其进行验证 30 天,这会为 TwoFactorRememberBrowser 生成一个 cookie。在后续登录时,将使用相同的 cookie 在接下来的 30 天内跳过双因素流程。
但突然出现的问题报告说,第一个用户为 TFA 注册了浏览器,然后第二个用户登录并为 TFA 注册了相同的浏览器,我相信这会覆盖第一个用户 cookie TwoFactorRememberBrowser。现在,当第一个用户在同一浏览器上再次登录时,尽管同一用户在第一次尝试时已经为 TFA 注册了记住浏览器选项,但为该用户调用了两个因素进程。
在这里我想解决这个问题,以便同一浏览器上的每个用户都可以保存 TFA 记住浏览器选项。为此,我认为 TFA RememberBrowser cookie 需要配置为基于用户群。如果有人可以帮助我了解如何使用配置更改或删除此身份框架限制来实现此功能,我需要帮助。
我可以在链接 Asp.Net Identity TwoFactorRememberBrowser cookie overwritten for second user 上看到类似的问题 但是没有解决方案,想看看是否有人可以提供一种方法来为同一浏览器上的多个用户覆盖此行为。我正在使用 Microsoft.AspNet.Identity.Core 2.0.0.0
以下是代码片段。
public void ConfigureAuth(IAppBuilder app)
{
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
var twoFactorSignInCookieTimeOut = Convert.ToDouble(System.Configuration.ConfigurationManager.AppSettings["TwoFactorSignInCookieTimeOut"]);
var twoFactorRememberBrowserExpiry = Convert.ToDouble(System.Configuration.ConfigurationManager.AppSettings["TwoFactorRememberBrowserExpiry"]);
var signInCookieExpiry = Convert.ToDouble(System.Configuration.ConfigurationManager.AppSettings["SignInCookieExpiry"]);
var options = SecurityManager.GetCookieOptions("/Home", "mywebsite", signInCookieExpiry);
app.UseCookieAuthentication(options);
var optionsRememberBrowser = SecurityManager.GetRememberBrowserCookieOptions(signInCookieExpiry, twoFactorRememberBrowserExpiry, "mywebsite");
app.UseCookieAuthentication(optionsRememberBrowser);
app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(twoFactorSignInCookieTimeOut));
}
public static CookieAuthenticationOptions GetRememberBrowserCookieOptions(double signInCookieExpiry, double rememberBrowserDays, string cookiePrefix)
{
var optionsRememberBrowser = new CookieAuthenticationOptions()
{
AuthenticationType = DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie,
AuthenticationMode = AuthenticationMode.Passive,
CookieName = cookiePrefix + "." + DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie,
ExpireTimeSpan = TimeSpan.FromHours(signInCookieExpiry),
SlidingExpiration = false,
Provider = new CookieAuthenticationProvider
{
OnResponseSignIn = ctx =>
{
ctx.OwinContext.Set("auth-prop-expires", ctx.Properties.ExpiresUtc);
ctx.OwinContext.Set("auth-prop-persist", ctx.Properties.IsPersistent);
var issued = ctx.Properties.IssuedUtc ?? DateTimeOffset.UtcNow;
ctx.Properties.ExpiresUtc = issued.AddDays(rememberBrowserDays);
ctx.Properties.IsPersistent = true;
},
OnResponseSignedIn = ctx =>
{
ctx.Properties.ExpiresUtc = ctx.OwinContext.Get<DateTimeOffset?>("auth-prop-expires");
ctx.Properties.IsPersistent = ctx.OwinContext.Get<bool>("auth-prop-persist");
}
}
};
return optionsRememberBrowser;
}