public class GoogleAuthenticatorService<TUser> : TotpSecurityStampBasedTokenProvider<TUser> where TUser : class { private static readonly DateTime UNIX_EPOCH = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); public override Task<bool> CanGenerateTwoFactorTokenAsync(UserManager<TUser> manager, TUser user) { return manager.GetTwoFactorEnabledAsync(user); } public string GenerateSecret() { byte[] buffer = new byte[9]; using (var rng = RandomNumberGenerator.Create()) { rng.GetBytes(buffer); } return Convert.ToBase64String(buffer).Substring(0, 10).Replace('/', '0').Replace('+', '1'); } public string GetCode(string secret, long counter) { return GeneratePassword(secret, counter); } public string GetCode(string secret) { return GetCode(secret, GetCurrentCounter()); } public long GetCurrentCounter() { return GetCurrentCounter(DateTime.UtcNow, UNIX_EPOCH, 30); } public bool IsValid(string secret, string code, int checkAdjacentIntervals = 1) { if (code == GetCode(secret)) return true; for (int i = 1; i <= checkAdjacentIntervals; i++) { if (code == GetCode(secret, GetCurrentCounter() + i)) return true; if (code == GetCode(secret, GetCurrentCounter() - i)) return true; } return false; } public override async Task<bool> ValidateAsync(string purpose, string token, UserManager<TUser> manager, TUser user) { return IsValid(await manager.GetSecurityStampAsync(user), token); } private string GeneratePassword(string secret, long iterationNumber, int digits = 6) { byte[] counter = BitConverter.GetBytes(iterationNumber); if (BitConverter.IsLittleEndian) Array.Reverse(counter); byte[] key = Encoding.ASCII.GetBytes(secret); byte[] hash; using (HMACSHA1 hmac = new HMACSHA1(key)) { hash = hmac.ComputeHash(counter); } int offset = hash[hash.Length - 1] & 0xf; int binary = ((hash[offset] & 0x7f) << 24) | ((hash[offset + 1] & 0xff) << 16) | ((hash[offset + 2] & 0xff) << 8) | (hash[offset + 3] & 0xff); int password = binary % (int)Math.Pow(10, digits); return password.ToString(new string('0', digits)); } private long GetCurrentCounter(DateTime now, DateTime epoch, int timeStep) { return (long)(now - epoch).TotalSeconds / timeStep; } }
public void ConfigureServices(IServiceCollection services) { services.AddSingleton(typeof(IConfigurationRoot), Configuration); // Add framework services. services.AddApplicationInsightsTelemetry(Configuration); services.AddIdentity<ApplicationUser, IdentityRole>() .AddEntityFrameworkStores<AuthDbContext>() .AddTokenProvider<GoogleAuthenticatorService<ApplicationUser>>("Google"); services.AddMvc(); services.Configure<IdentityOptions>(options => { options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(10); options.Lockout.MaxFailedAccessAttempts = 10; }); services.Configure<CookieAuthenticationOptions>(options => { options.LoginPath = new PathString("/Admin/Login"); }); }
[AllowAnonymous, HttpPost, ValidateAntiForgeryToken] public async Task<IActionResult> Login(LoginViewModel loginModel, string returnUrl = null) { ViewData["ReturnUrl"] = returnUrl; if (ModelState.IsValid) { var result = await _signInManager.PasswordSignInAsync(loginModel.Username, loginModel.Password, false, true); if (result.Succeeded) { return RedirectToLocal(returnUrl); } else if (result.RequiresTwoFactor) { return View("TwoAuth"); } else if (result.IsLockedOut) { return View("Login"); } } loginModel.Password = null; return View(loginModel); } [AllowAnonymous] public async Task<IActionResult> TwoAuth(string returnUrl = null) { ViewData["ReturnUrl"] = returnUrl; var user = await _signInManager.GetTwoFactorAuthenticationUserAsync(); if (user == null) { return View("Login"); } return View(); } [AllowAnonymous, ValidateAntiForgeryToken, HttpPost] public async Task<IActionResult> TwoAuth(string code, string returnUrl = null) { ViewData["ReturnUrl"] = returnUrl; var user = await _signInManager.GetTwoFactorAuthenticationUserAsync(); if (user != null) { var result = await _signInManager.TwoFactorSignInAsync("Google", code, false, false); if (result.Succeeded) { return RedirectToLocal(returnUrl); } else if (result.IsLockedOut) { return View("Login"); } } return View(); }
9 . What Your Parents Teach You About Only Fans Pornstars Kayleigh Wanless only fans pornstars
Mellissa May 18, 2024 4:16:14 AM