using System; using System.Threading.Tasks; using Microsoft.Framework.OptionsModel; namespace Microsoft.AspNet.Identity { public class EmailTokenProviderOptions { public string Name { get; set; } = "Email"; } /// /// TokenProvider that generates tokens from the user's security stamp and notifies a user via their email /// /// public class EmailTokenProvider : TotpSecurityStampBasedTokenProvider where TUser : class { public EmailTokenProvider(IOptions options, string name = "") { if (options == null) { throw new ArgumentNullException(nameof(options)); } Options = options.GetNamedOptions(name); } public EmailTokenProviderOptions Options { get; private set; } public override string Name { get { return Options.Name; } } /// /// True if the user has an email set /// /// /// /// public override async Task CanGenerateTwoFactorTokenAsync(UserManager manager, TUser user) { var email = await manager.GetEmailAsync(user); return !string.IsNullOrWhiteSpace(email) && await manager.IsEmailConfirmedAsync(user); } /// /// Returns the email of the user for entropy in the token /// /// /// /// /// public override async Task GetUserModifierAsync(string purpose, UserManager manager, TUser user) { var email = await manager.GetEmailAsync(user); return "Email:" + purpose + ":" + email; } } }