(feature): add totp recovery code and totp link gen
This commit is contained in:
parent
e8d87d8700
commit
543faeb801
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
<!-- NuGet package metadata -->
|
<!-- NuGet package metadata -->
|
||||||
<PackageId>MaksIT.Core</PackageId>
|
<PackageId>MaksIT.Core</PackageId>
|
||||||
<Version>1.0.7</Version>
|
<Version>1.0.8</Version>
|
||||||
<Authors>Maksym Sadovnychyy</Authors>
|
<Authors>Maksym Sadovnychyy</Authors>
|
||||||
<Company>MAKS-IT</Company>
|
<Company>MAKS-IT</Company>
|
||||||
<Product>MaksIT.Core</Product>
|
<Product>MaksIT.Core</Product>
|
||||||
|
|||||||
@ -60,7 +60,6 @@ public static class TotpGenerator {
|
|||||||
return unixTimestamp / Timestep;
|
return unixTimestamp / Timestep;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static string GenerateSecret() {
|
public static string GenerateSecret() {
|
||||||
// Example of generating a 32-character base32 secret for TOTP
|
// Example of generating a 32-character base32 secret for TOTP
|
||||||
var random = new byte[20];
|
var random = new byte[20];
|
||||||
@ -70,5 +69,42 @@ public static class TotpGenerator {
|
|||||||
|
|
||||||
return Base32Encoder.Encode(random); // You can use a Base32 encoder to generate the secret.
|
return Base32Encoder.Encode(random); // You can use a Base32 encoder to generate the secret.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<string> GenerateRecoveryCodes(int defaultCodeCount = 6) {
|
||||||
|
var recoveryCodes = new List<string>();
|
||||||
|
|
||||||
|
for (int i = 0; i < defaultCodeCount; i++) {
|
||||||
|
var code = Guid.NewGuid().ToString("N").Substring(0, 8); // Generate an 8-character code
|
||||||
|
var formattedCode = $"{code.Substring(0, 4)}-{code.Substring(4, 4)}"; // Format as XXXX-XXXX
|
||||||
|
recoveryCodes.Add(formattedCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
return recoveryCodes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GenerateTotpAuthLink(string label, string username, string twoFactoSharedKey, string issuer, string? algorithm = null, int? digits = null, int? period = null) {
|
||||||
|
|
||||||
|
var queryParams = new List<string> {
|
||||||
|
$"secret={Uri.EscapeDataString(twoFactoSharedKey)}",
|
||||||
|
$"issuer={Uri.EscapeDataString(issuer)}"
|
||||||
|
};
|
||||||
|
|
||||||
|
if (algorithm != null) {
|
||||||
|
queryParams.Add($"algorithm={Uri.EscapeDataString(algorithm)}");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (digits != null) {
|
||||||
|
queryParams.Add($"digits={digits}");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (period != null) {
|
||||||
|
queryParams.Add($"period={period}");
|
||||||
|
}
|
||||||
|
|
||||||
|
var queryString = string.Join("&", queryParams);
|
||||||
|
var authLink = $"otpauth://totp/{Uri.EscapeDataString(label)}:{Uri.EscapeDataString(username)}?{queryString}";
|
||||||
|
|
||||||
|
return authLink;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user