using System; using System.Globalization; using System.Threading.Tasks; using Microsoft.Framework.OptionsModel; namespace Microsoft.AspNet.Identity { public class PhoneNumberTokenProviderOptions { public string Name { get; set; } = "Phone"; } /// /// TokenProvider that generates tokens from the user's security stamp and notifies a user via their phone number /// /// public class PhoneNumberTokenProvider : TotpSecurityStampBasedTokenProvider where TUser : class { public PhoneNumberTokenProvider(IOptions options) { if (options == null || options.Options == null) { throw new ArgumentNullException(nameof(options)); } Options = options.Options; } public PhoneNumberTokenProviderOptions Options { get; private set; } public override string Name { get { return Options.Name; } } /// /// Returns true if the user has a phone number set /// /// /// /// public override async Task CanGenerateTwoFactorTokenAsync(UserManager manager, TUser user) { if (manager == null) { throw new ArgumentNullException("manager"); } var phoneNumber = await manager.GetPhoneNumberAsync(user); return !string.IsNullOrWhiteSpace(phoneNumber) && await manager.IsPhoneNumberConfirmedAsync(user); } /// /// Returns the phone number of the user for entropy in the token /// /// /// /// /// public override async Task GetUserModifierAsync(string purpose, UserManager manager, TUser user) { if (manager == null) { throw new ArgumentNullException("manager"); } var phoneNumber = await manager.GetPhoneNumberAsync(user); return "PhoneNumber:" + purpose + ":" + phoneNumber; } } }