2FA OTP
Install
dotnet add package OTP.Net
dotnet add package QRCoder
Create Code
public static string GenerateSecret(int len = 20){
return Base32Encoding.ToString(KeyGeneration.GenerateRandomKey(len));
}
Create QRCode
public static byte[] QRCode(string content){
using(QRCodeGenerator generator = new QRCodeGenerator()){
QRCodeData data = generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.Q);
PngByteQRCode qRCode = new PngByteQRCode(data);
return qRCode.GetGraphic(20);
}
}
Show QRCode
Controller
public class AuthController : Controller{
public IActionResult QRCode(){
Member? member = HttpContext.Session.GetObject("Member");
if(member is null) return Redirect("/auth/register");
string issuer = "ceb.net.vn";
string optUri = $"otpauth://totp/{issuer}:{member.Email}?secret={member.TwoFactorSecret}&issuer={issuer}";
return File(Helper.QRCode(optUri), "image/png");
}
}
View
<img src="/auth/qrcode" alt="QR Code" width="200">
Verify Code
public static bool VerifyCode(string secret, string code){
Totp totp = new Totp(Base32Encoding.ToBytes(secret));
return totp.VerifyTotp(code, out _, VerificationWindow.RfcSpecifiedNetworkDelay);
}
Install App
Google Authenticator
Microsoft Authenticator