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;
}
}
}