我使用 ASP.Net Identity 类(ApplicationSignInManager:SignInManager)在 ASP.NET MVC 应用程序中实现了基本的 2FA。请注意,我使用的是 AspNet.Identity.OWIN,而不是 AspNetCore.Identity。
用户使用记住浏览器参数验证通过电子邮件发送的代码后,将按预期创建 cookie:
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);
AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = true }, identity);
即使注销后,cookie
.AspNet.TwoFactorRememberBrowser
仍保留在浏览器中。
现在的问题是,在第二次登录时我需要知道这个 Cookie 是否属于尝试登录的用户。如果是,则跳过 2fa,如果不应用 2fa。
我不能只检查 cookie 是否存在,因为用户可能正在使用另一个用户的相同浏览器。我已经为此苦苦挣扎了两天,请提供任何帮助,我将不胜感激。
您可以使用
HttpContext.AuthenticateAsync()
方法来验证特定方案。对于你的情况:
var result = Context.AuthenticateAsync(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);
假设身份验证成功,您将获得一个包含
AuthenticateResult
的 ClaimsPrincipal
作为回报。这样,您可以检索数据,例如来自 cookie 的 UserId。
// Ensure the principal exists.
if (result?.Principal == null)
{
return null;
{
var userId = result.Principal.FindFirstValue(ClaimTypes.Name);
现在将
userId
与尝试登录的用户 ID 进行比较,您就会知道是否要求 2FA。
希望这有帮助!