CSharp

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