TotpGenerator 1.0.2
dotnet add package TotpGenerator --version 1.0.2
NuGet\Install-Package TotpGenerator -Version 1.0.2
<PackageReference Include="TotpGenerator" Version="1.0.2" />
paket add TotpGenerator --version 1.0.2
#r "nuget: TotpGenerator, 1.0.2"
// Install TotpGenerator as a Cake Addin #addin nuget:?package=TotpGenerator&version=1.0.2 // Install TotpGenerator as a Cake Tool #tool nuget:?package=TotpGenerator&version=1.0.2
You can generate Totp
code based on time, UserSecurityStamp
and UserIdentifier
and ExpirationTime
.
You can use this package instead of Rfc6238AuthenticationService class for generating totp
code with identity.
<PackageReference Include="TotpGenerator" Version="1.0.2" />
Usage:
public async ValueTask<int> GetTwoFactorTotpCode(string email)
{
var user = await GetUserByEmail(email);
var modifier = GetModifier(user, TotpEnum.TwoFactor);
var totpCode = TotpService.GenerateCode(user.SecurityStamp.ToString(), modifier);
return totpCode;
}
public async ValueTask<bool> ValidateTwoFactorTotpCode(string email, int totpCode)
{
var user = await GetUserByEmail(email);
string modifier = GetModifier(user, TotpEnum.TwoFactor);
var isValid = TotpService.ValidateCode(
user.SecurityStamp.ToString(),
totpCode,
modifier,
_userOption.TwoFactorTotpExpiration);
return isValid;
}
If you want to modify the TOTP code method generated by Identity, you need to follow these steps:
First, create a class that inherits from the TotpSecurityStampBasedTokenProvider class. Then, you should override the GenerateAsync and ValidateAsync methods and use TotpService instead of Rfc6238AuthenticationService.
GenerateAsync method:
public override async Task<string> GenerateAsync(
string purpose,
UserManager<ApplicationUser> manager,
ApplicationUser user)
{
if (manager == null)
{
throw new ArgumentNullException(nameof(manager));
}
var token = await manager.CreateSecurityTokenAsync(user);
var modifier = await GetUserModifierAsync(purpose, manager, user);
return TotpService.GenerateCode(token, modifier).ToString("D6", CultureInfo.InvariantCulture);
}
ValidateAsync method:
public override async Task<bool> ValidateAsync(
string purpose,
string token,
UserManager<ApplicationUser> manager,
ApplicationUser user)
{
if (manager == null)
{
throw new ArgumentNullException(nameof(manager));
}
int code;
if (!int.TryParse(token, out code))
{
return false;
}
var securityToken = await manager.CreateSecurityTokenAsync(user);
var modifier = await GetUserModifierAsync(purpose, manager, user);
return securityToken != null && TotpService.ValidateCode(securityToken, code, modifier, _userOption.TwoFactorTotpExpiration);
}
Then, introduce the created class to Identity:
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<IdentityContext>()
.AddDefaultTokenProviders()
.AddTokenProvider<CustomTotpSecurityStampBasedTokenProvider >("CustomTotp");
And when generating and validating the code, you should send its provider name to the UserManager:
var verificationCode = await _userManager.GenerateTwoFactorTokenAsync(user, "CustomTotp");
var verify = await _userManager.VerifyTwoFactorTokenAsync(user, "CustomTotp", request.VerificationCode);
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 is compatible. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
-
.NETStandard 2.1
- No dependencies.
-
net5.0
- No dependencies.
-
net6.0
- No dependencies.
-
net7.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.