diff --git a/samples/IdentitySample.Mvc/Controllers/AccountController.cs b/samples/IdentitySample.Mvc/Controllers/AccountController.cs index 2d2bcd4f85..85006948b4 100644 --- a/samples/IdentitySample.Mvc/Controllers/AccountController.cs +++ b/samples/IdentitySample.Mvc/Controllers/AccountController.cs @@ -2,13 +2,15 @@ using System.Security.Claims; using System.Security.Principal; using System.Threading.Tasks; +using IdentitySample.Models; +using IdentitySamples; using Microsoft.AspNet.Authentication; +using Microsoft.AspNet.Authorization; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Mvc; using Microsoft.AspNet.Mvc.Rendering; -using Microsoft.AspNet.Authorization; -namespace IdentitySample.Models +namespace IdentitySample.Controllers { [Authorize] public class AccountController : Controller @@ -92,13 +94,8 @@ namespace IdentitySample.Models { var code = await UserManager.GenerateEmailConfirmationTokenAsync(user); var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Context.Request.Scheme); - var email = new IdentityMessage - { - Destination = model.Email, - Subject = "Confirm your account", - Body = "Please confirm your account by clicking this link: link" - }; - await UserManager.SendMessageAsync("Email", email); + await MessageServices.SendEmailAsync(model.Email, "Confirm your account", + "Please confirm your account by clicking this link: link"); ViewBag.Link = callbackUrl; return View("DisplayEmail"); } @@ -255,13 +252,8 @@ namespace IdentitySample.Models var code = await UserManager.GeneratePasswordResetTokenAsync(user); var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Context.Request.Scheme); - var email = new IdentityMessage - { - Destination = model.Email, - Subject = "Reset Password", - Body = "Please reset your password by clicking here: link" - }; - await UserManager.SendMessageAsync("Email", email); + await MessageServices.SendEmailAsync(model.Email, "Reset Password", + "Please reset your password by clicking here: link"); ViewBag.Link = callbackUrl; return View("ForgotPasswordConfirmation"); } @@ -351,11 +343,29 @@ namespace IdentitySample.Models return View(); } - // Generate the token and send it - if (!await SignInManager.SendTwoFactorCodeAsync(model.SelectedProvider)) + var user = await SignInManager.GetTwoFactorAuthenticationUserAsync(); + if (user == null) { return View("Error"); } + + // Generate the token and send it + var code = await UserManager.GenerateTwoFactorTokenAsync(user, model.SelectedProvider); + if (string.IsNullOrWhiteSpace(code)) + { + return View("Error"); + } + + var message = "Your security code is: " + code; + if (model.SelectedProvider == "Email") + { + await MessageServices.SendEmailAsync(await UserManager.GetEmailAsync(user), "Security Code", message); + } + else if (model.SelectedProvider == "Phone") + { + await MessageServices.SendSmsAsync(await UserManager.GetPhoneNumberAsync(user), message); + } + return RedirectToAction("VerifyCode", new { Provider = model.SelectedProvider, ReturnUrl = model.ReturnUrl, RememberMe = model.RememberMe }); } diff --git a/samples/IdentitySample.Mvc/Controllers/HomeController.cs b/samples/IdentitySample.Mvc/Controllers/HomeController.cs index 3a831a25ed..b6dae59f8d 100644 --- a/samples/IdentitySample.Mvc/Controllers/HomeController.cs +++ b/samples/IdentitySample.Mvc/Controllers/HomeController.cs @@ -1,6 +1,6 @@ using Microsoft.AspNet.Mvc; -namespace IdentitySample.Models +namespace IdentitySample.Controllers { public class HomeController : Controller { diff --git a/samples/IdentitySample.Mvc/Controllers/ManageController.cs b/samples/IdentitySample.Mvc/Controllers/ManageController.cs index 5c7736baef..13223ceed9 100644 --- a/samples/IdentitySample.Mvc/Controllers/ManageController.cs +++ b/samples/IdentitySample.Mvc/Controllers/ManageController.cs @@ -2,11 +2,12 @@ using System.Security.Principal; using System.Threading.Tasks; using IdentitySample.Models; +using IdentitySamples; using Microsoft.AspNet.Authorization; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Mvc; -namespace IdentitySample +namespace IdentitySample.Controllers { [Authorize] public class ManageController : Controller @@ -98,12 +99,7 @@ namespace IdentitySample // Generate the token and send it var user = await GetCurrentUserAsync(); var code = await UserManager.GenerateChangePhoneNumberTokenAsync(user, model.Number); - var message = new IdentityMessage - { - Destination = model.Number, - Body = "Your security code is: " + code - }; - await UserManager.SendMessageAsync("SMS", message); + await MessageServices.SendSmsAsync(model.Number, "Your security code is: " + code); return RedirectToAction("VerifyPhoneNumber", new { PhoneNumber = model.Number }); } diff --git a/samples/IdentitySample.Mvc/MessageServices.cs b/samples/IdentitySample.Mvc/MessageServices.cs new file mode 100644 index 0000000000..6860d99af9 --- /dev/null +++ b/samples/IdentitySample.Mvc/MessageServices.cs @@ -0,0 +1,20 @@ +using System.Threading.Tasks; + +namespace IdentitySamples +{ + public static class MessageServices + { + public static Task SendEmailAsync(string email, string subject, string message) + { + // Plug in your email service + return Task.FromResult(0); + } + + public static Task SendSmsAsync(string number, string message) + { + // Plug in your sms service + return Task.FromResult(0); + } + + } +} \ No newline at end of file diff --git a/samples/IdentitySample.Mvc/Startup.cs b/samples/IdentitySample.Mvc/Startup.cs index 7921d2753f..b1ebf48e26 100644 --- a/samples/IdentitySample.Mvc/Startup.cs +++ b/samples/IdentitySample.Mvc/Startup.cs @@ -1,16 +1,12 @@ -using System; using IdentitySample.Models; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Diagnostics; using Microsoft.AspNet.Identity; -using Microsoft.AspNet.Routing; using Microsoft.Data.Entity; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Logging; using Microsoft.Framework.Logging.Console; -using System.Threading.Tasks; -using System.Threading; namespace IdentitySamples { @@ -42,9 +38,7 @@ namespace IdentitySamples services.AddIdentity(Configuration) .AddEntityFrameworkStores() - .AddDefaultTokenProviders() - .AddMessageProvider() - .AddMessageProvider(); + .AddDefaultTokenProviders(); services.ConfigureFacebookAuthentication(options => { @@ -86,39 +80,5 @@ namespace IdentitySamples SampleData.InitializeIdentityDatabaseAsync(app.ApplicationServices).Wait(); } - public class EmailMessageProvider : IIdentityMessageProvider - { - public string Name - { - get - { - return "Email"; - } - } - - public Task SendAsync(IdentityMessage message, CancellationToken cancellationToken = default(CancellationToken)) - { - // Plug in your service - return Task.FromResult(0); - } - } - - public class SmsMessageProvider : IIdentityMessageProvider - { - public string Name - { - get - { - return "SMS"; - } - } - - public Task SendAsync(IdentityMessage message, CancellationToken cancellationToken = default(CancellationToken)) - { - // Plug in your service - return Task.FromResult(0); - } - } - } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity/EmailTokenProvider.cs b/src/Microsoft.AspNet.Identity/EmailTokenProvider.cs index d192dde38e..776d1f8e19 100644 --- a/src/Microsoft.AspNet.Identity/EmailTokenProvider.cs +++ b/src/Microsoft.AspNet.Identity/EmailTokenProvider.cs @@ -1,6 +1,4 @@ using System; -using System.Globalization; -using System.Threading; using System.Threading.Tasks; using Microsoft.Framework.OptionsModel; @@ -8,16 +6,7 @@ namespace Microsoft.AspNet.Identity { public class EmailTokenProviderOptions { - public string Name { get; set; } = Resources.DefaultEmailTokenProviderName; - - public string MessageProvider { get; set; } = "Email"; - - public string Subject { get; set; } = "Security Code"; - - /// - /// Format string which will be used for the email body, it will be passed the token for the first parameter - /// - public string BodyFormat { get; set; } = "Your security code is: {0}"; + public string Name { get; set; } = "Email"; } /// @@ -65,27 +54,5 @@ namespace Microsoft.AspNet.Identity var email = await manager.GetEmailAsync(user); return "Email:" + purpose + ":" + email; } - - /// - /// Notifies the user with a token via email using the Subject and BodyFormat - /// - /// - /// - /// - /// - public override async Task NotifyAsync(string token, UserManager manager, TUser user) - { - if (manager == null) - { - throw new ArgumentNullException(nameof(manager)); - } - var msg = new IdentityMessage - { - Destination = await manager.GetEmailAsync(user), - Subject = Options.Subject, - Body = string.Format(CultureInfo.CurrentCulture, Options.BodyFormat, token) - }; - await manager.SendMessageAsync(Options.MessageProvider, msg); - } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity/IIdentityMessageProvider.cs b/src/Microsoft.AspNet.Identity/IIdentityMessageProvider.cs deleted file mode 100644 index 2eaa60a115..0000000000 --- a/src/Microsoft.AspNet.Identity/IIdentityMessageProvider.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.AspNet.Identity -{ - public interface IIdentityMessageProvider - { - string Name { get; } - - Task SendAsync(IdentityMessage message, CancellationToken cancellationToken); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity/IUserTokenProvider.cs b/src/Microsoft.AspNet.Identity/IUserTokenProvider.cs index d785f41bd5..184b9844ff 100644 --- a/src/Microsoft.AspNet.Identity/IUserTokenProvider.cs +++ b/src/Microsoft.AspNet.Identity/IUserTokenProvider.cs @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Threading; using System.Threading.Tasks; namespace Microsoft.AspNet.Identity @@ -35,15 +34,6 @@ namespace Microsoft.AspNet.Identity /// Task ValidateAsync(string purpose, string token, UserManager manager, TUser user); - /// - /// Notifies the user that a token has been generated, i.e. via email or sms, or can no-op - /// - /// - /// - /// - /// - Task NotifyAsync(string token, UserManager manager, TUser user); - /// /// Returns true if provider can be used for this user to generate two factor tokens, i.e. could require a user to have an email /// diff --git a/src/Microsoft.AspNet.Identity/IdentityBuilder.cs b/src/Microsoft.AspNet.Identity/IdentityBuilder.cs index 80efa2f345..7dbc04c9f1 100644 --- a/src/Microsoft.AspNet.Identity/IdentityBuilder.cs +++ b/src/Microsoft.AspNet.Identity/IdentityBuilder.cs @@ -66,11 +66,6 @@ namespace Microsoft.AspNet.Identity return AddScoped(typeof(IUserTokenProvider<>).MakeGenericType(UserType), provider); } - public virtual IdentityBuilder AddMessageProvider() where TProvider : IIdentityMessageProvider - { - return AddScoped(typeof(IIdentityMessageProvider), typeof(TProvider)); - } - public virtual IdentityBuilder AddDefaultTokenProviders() { Services.Configure(options => diff --git a/src/Microsoft.AspNet.Identity/IdentityMessage.cs b/src/Microsoft.AspNet.Identity/IdentityMessage.cs deleted file mode 100644 index 44c9b3e16f..0000000000 --- a/src/Microsoft.AspNet.Identity/IdentityMessage.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNet.Identity -{ - /// - /// Represents a message - /// - public class IdentityMessage - { - /// - /// Target for the message, i.e. email or phone number - /// - public virtual string Destination { get; set; } - - /// - /// Subject - /// - public virtual string Subject { get; set; } - - /// - /// Message contents - /// - public virtual string Body { get; set; } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity/PhoneNumberTokenProvider.cs b/src/Microsoft.AspNet.Identity/PhoneNumberTokenProvider.cs index cec3f7740a..83bb2406b4 100644 --- a/src/Microsoft.AspNet.Identity/PhoneNumberTokenProvider.cs +++ b/src/Microsoft.AspNet.Identity/PhoneNumberTokenProvider.cs @@ -7,14 +7,7 @@ namespace Microsoft.AspNet.Identity { public class PhoneNumberTokenProviderOptions { - public string Name { get; set; } = Resources.DefaultPhoneNumberTokenProviderName; - - public string MessageProvider { get; set; } = "SMS"; - - /// - /// Message contents which should contain a format string which the token will be the only argument - /// - public string MessageFormat { get; set; } = Resources.DefaultPhoneNumberTokenProviderMessageFormat; + public string Name { get; set; } = "Phone"; } /// @@ -69,26 +62,5 @@ namespace Microsoft.AspNet.Identity var phoneNumber = await manager.GetPhoneNumberAsync(user); return "PhoneNumber:" + purpose + ":" + phoneNumber; } - - /// - /// Notifies the user with a token via SMS using the MessageFormat - /// - /// - /// - /// - /// - public override async Task NotifyAsync(string token, UserManager manager, TUser user) - { - if (manager == null) - { - throw new ArgumentNullException("manager"); - } - var msg = new IdentityMessage - { - Destination = await manager.GetPhoneNumberAsync(user), - Body = string.Format(CultureInfo.CurrentCulture, Options.MessageFormat, token) - }; - await manager.SendMessageAsync(Options.MessageProvider, msg); - } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity/Properties/Resources.Designer.cs b/src/Microsoft.AspNet.Identity/Properties/Resources.Designer.cs index 2aa5369096..416c98f9e5 100644 --- a/src/Microsoft.AspNet.Identity/Properties/Resources.Designer.cs +++ b/src/Microsoft.AspNet.Identity/Properties/Resources.Designer.cs @@ -26,54 +26,6 @@ namespace Microsoft.AspNet.Identity return GetString("ConcurrencyFailure"); } - /// - /// Your security code is: {0} - /// - internal static string DefaultEmailTokenProviderBodyFormat - { - get { return GetString("DefaultEmailTokenProviderBodyFormat"); } - } - - /// - /// Your security code is: {0} - /// - internal static string FormatDefaultEmailTokenProviderBodyFormat(object p0) - { - return string.Format(CultureInfo.CurrentCulture, GetString("DefaultEmailTokenProviderBodyFormat"), p0); - } - - /// - /// Email - /// - internal static string DefaultEmailTokenProviderName - { - get { return GetString("DefaultEmailTokenProviderName"); } - } - - /// - /// Email - /// - internal static string FormatDefaultEmailTokenProviderName() - { - return GetString("DefaultEmailTokenProviderName"); - } - - /// - /// Security code - /// - internal static string DefaultEmailTokenProviderSubject - { - get { return GetString("DefaultEmailTokenProviderSubject"); } - } - - /// - /// Security code - /// - internal static string FormatDefaultEmailTokenProviderSubject() - { - return GetString("DefaultEmailTokenProviderSubject"); - } - /// /// An unknown failure has occured. /// @@ -90,38 +42,6 @@ namespace Microsoft.AspNet.Identity return GetString("DefaultError"); } - /// - /// Your security code is: {0} - /// - internal static string DefaultPhoneNumberTokenProviderMessageFormat - { - get { return GetString("DefaultPhoneNumberTokenProviderMessageFormat"); } - } - - /// - /// Your security code is: {0} - /// - internal static string FormatDefaultPhoneNumberTokenProviderMessageFormat(object p0) - { - return string.Format(CultureInfo.CurrentCulture, GetString("DefaultPhoneNumberTokenProviderMessageFormat"), p0); - } - - /// - /// Phone - /// - internal static string DefaultPhoneNumberTokenProviderName - { - get { return GetString("DefaultPhoneNumberTokenProviderName"); } - } - - /// - /// Phone - /// - internal static string FormatDefaultPhoneNumberTokenProviderName() - { - return GetString("DefaultPhoneNumberTokenProviderName"); - } - /// /// Default Token Provider /// @@ -298,22 +218,6 @@ namespace Microsoft.AspNet.Identity return GetString("LoginAlreadyAssociated"); } - /// - /// No IUserMessageProvider named '{0}' is registered. - /// - internal static string NoMessageProvider - { - get { return GetString("NoMessageProvider"); } - } - - /// - /// No IUserMessageProvider named '{0}' is registered. - /// - internal static string FormatNoMessageProvider(object p0) - { - return string.Format(CultureInfo.CurrentCulture, GetString("NoMessageProvider"), p0); - } - /// /// No IUserTokenProvider named '{0}' is registered. /// diff --git a/src/Microsoft.AspNet.Identity/Resources.resx b/src/Microsoft.AspNet.Identity/Resources.resx index 2351b1e7aa..f3cd081aa8 100644 --- a/src/Microsoft.AspNet.Identity/Resources.resx +++ b/src/Microsoft.AspNet.Identity/Resources.resx @@ -121,30 +121,10 @@ Optimistic concurrency failure, object has been modified. Error when optimistic concurrency fails - - Your security code is: {0} - Default body format for the email - - - Email - Default name for the email token provider - - - Security code - Default subject for the email - An unknown failure has occured. Default identity result error message - - Your security code is: {0} - Default message format for the phone number token provider - - - Phone - Default name for the phone number token provider - Default Token Provider Name of the default token provider @@ -189,10 +169,6 @@ A user with this login already exists. Error when a login already linked - - No IUserMessageProvider named '{0}' is registered. - Error when there is no IUserMessageProvider - No IUserTokenProvider named '{0}' is registered. Error when there is no IUserTokenProvider diff --git a/src/Microsoft.AspNet.Identity/SignInManager.cs b/src/Microsoft.AspNet.Identity/SignInManager.cs index 9b61fbb588..ce5ddb22b6 100644 --- a/src/Microsoft.AspNet.Identity/SignInManager.cs +++ b/src/Microsoft.AspNet.Identity/SignInManager.cs @@ -202,24 +202,6 @@ namespace Microsoft.AspNet.Identity return identity; } - public virtual async Task SendTwoFactorCodeAsync(string provider) - { - var twoFactorInfo = await RetrieveTwoFactorInfoAsync(); - if (twoFactorInfo == null || twoFactorInfo.UserId == null) - { - return false; - } - - var user = await UserManager.FindByIdAsync(twoFactorInfo.UserId); - if (user == null) - { - return false; - } - var token = await UserManager.GenerateTwoFactorTokenAsync(user, provider); - await UserManager.NotifyTwoFactorTokenAsync(user, provider, token); - return await LogResultAsync(true, user); - } - public virtual async Task IsTwoFactorClientRememberedAsync(TUser user) { var userId = await UserManager.GetUserIdAsync(user); diff --git a/src/Microsoft.AspNet.Identity/TotpSecurityStampBasedTokenProvider.cs b/src/Microsoft.AspNet.Identity/TotpSecurityStampBasedTokenProvider.cs index 721f371efc..3c175149ee 100644 --- a/src/Microsoft.AspNet.Identity/TotpSecurityStampBasedTokenProvider.cs +++ b/src/Microsoft.AspNet.Identity/TotpSecurityStampBasedTokenProvider.cs @@ -15,18 +15,6 @@ namespace Microsoft.AspNet.Identity { public abstract string Name { get; } - /// - /// This token provider does not notify the user by default - /// - /// - /// - /// - /// - public virtual Task NotifyAsync(string token, UserManager manager, TUser user) - { - return Task.FromResult(0); - } - /// /// Generate a token for the user using their security stamp /// diff --git a/src/Microsoft.AspNet.Identity/UserManager.cs b/src/Microsoft.AspNet.Identity/UserManager.cs index 04c0edc96c..2cc9c0ac00 100644 --- a/src/Microsoft.AspNet.Identity/UserManager.cs +++ b/src/Microsoft.AspNet.Identity/UserManager.cs @@ -24,8 +24,6 @@ namespace Microsoft.AspNet.Identity { private readonly Dictionary> _tokenProviders = new Dictionary>(); - private readonly Dictionary _msgProviders = - new Dictionary(); private TimeSpan _defaultLockout = TimeSpan.Zero; private bool _disposed; @@ -42,7 +40,6 @@ namespace Microsoft.AspNet.Identity /// /// /// - /// /// public UserManager(IUserStore store, IOptions optionsAccessor, @@ -52,7 +49,6 @@ namespace Microsoft.AspNet.Identity ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IEnumerable> tokenProviders, - IEnumerable msgProviders, ILogger> logger, IHttpContextAccessor contextAccessor) { @@ -91,13 +87,6 @@ namespace Microsoft.AspNet.Identity RegisterTokenProvider(tokenProvider); } } - if (msgProviders != null) - { - foreach (var msgProvider in msgProviders) - { - RegisterMessageProvider(msgProvider); - } - } } /// @@ -1527,20 +1516,6 @@ namespace Microsoft.AspNet.Identity _tokenProviders[provider.Name] = provider; } - /// - /// Register a user message provider - /// - /// - public virtual void RegisterMessageProvider(IIdentityMessageProvider provider) - { - ThrowIfDisposed(); - if (provider == null) - { - throw new ArgumentNullException("provider"); - } - _msgProviders[provider.Name] = provider; - } - /// /// Returns a list of valid two factor providers for a user /// @@ -1619,33 +1594,6 @@ namespace Microsoft.AspNet.Identity return token; } - /// - /// Notify a user with a token from a specific user factor provider - /// - /// - /// - /// - /// - public virtual async Task NotifyTwoFactorTokenAsync(TUser user, string tokenProvider, string token) - { - ThrowIfDisposed(); - if (user == null) - { - throw new ArgumentNullException("user"); - } - if (tokenProvider == null) - { - throw new ArgumentNullException(nameof(tokenProvider)); - } - if (!_tokenProviders.ContainsKey(tokenProvider)) - { - throw new NotSupportedException(String.Format(CultureInfo.CurrentCulture, - Resources.NoTokenProvider, tokenProvider)); - } - await _tokenProviders[tokenProvider].NotifyAsync(token, this, user); - return await LogResultAsync(IdentityResult.Success, user); - } - // IUserFactorStore methods internal IUserTwoFactorStore GetUserTwoFactorStore() { @@ -1692,30 +1640,6 @@ namespace Microsoft.AspNet.Identity return await LogResultAsync(await UpdateUserAsync(user), user); } - // Messaging methods - - /// - /// Send a message to the user using the specified provider - /// - /// - /// - /// - public virtual async Task SendMessageAsync(string messageProvider, IdentityMessage message) - { - ThrowIfDisposed(); - if (message == null) - { - throw new ArgumentNullException(nameof(message)); - } - if (!_msgProviders.ContainsKey(messageProvider)) - { - throw new NotSupportedException(String.Format(CultureInfo.CurrentCulture, - Resources.NoMessageProvider, messageProvider)); - } - await _msgProviders[messageProvider].SendAsync(message, CancellationToken); - return IdentityResult.Success; - } - // IUserLockoutStore methods internal IUserLockoutStore GetUserLockoutStore() { diff --git a/test/Microsoft.AspNet.Identity.Test/IdentityBuilderTest.cs b/test/Microsoft.AspNet.Identity.Test/IdentityBuilderTest.cs index d58f558fad..31dae8f25f 100644 --- a/test/Microsoft.AspNet.Identity.Test/IdentityBuilderTest.cs +++ b/test/Microsoft.AspNet.Identity.Test/IdentityBuilderTest.cs @@ -234,7 +234,7 @@ namespace Microsoft.AspNet.Identity.Test private class MyUserManager : UserManager { - public MyUserManager(IUserStore store) : base(store, null, null, null, null, null, null, null, null, null, null) { } + public MyUserManager(IUserStore store) : base(store, null, null, null, null, null, null, null, null, null) { } } private class MyRoleManager : RoleManager diff --git a/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs b/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs index ddbb38eabb..b1f95cb7c6 100644 --- a/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs +++ b/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs @@ -631,7 +631,7 @@ namespace Microsoft.AspNet.Identity.Test public async Task ManagerPublicNullChecks() { Assert.Throws("store", - () => new UserManager(null, null, null, null, null, null, null, null, null, null, null)); + () => new UserManager(null, null, null, null, null, null, null, null, null, null)); var manager = MockHelpers.TestUserManager(new NotImplementedStore()); @@ -736,8 +736,6 @@ namespace Microsoft.AspNet.Identity.Test async () => await manager.GenerateTwoFactorTokenAsync(null, null)); await Assert.ThrowsAsync("user", async () => await manager.VerifyTwoFactorTokenAsync(null, null, null)); - await Assert.ThrowsAsync("user", - async () => await manager.NotifyTwoFactorTokenAsync(null, null, null)); await Assert.ThrowsAsync("user", async () => await manager.GetValidTwoFactorProvidersAsync(null)); await Assert.ThrowsAsync("user", @@ -797,7 +795,6 @@ namespace Microsoft.AspNet.Identity.Test await Assert.ThrowsAsync(() => manager.GenerateEmailConfirmationTokenAsync(null)); await Assert.ThrowsAsync(() => manager.IsEmailConfirmedAsync(null)); await Assert.ThrowsAsync(() => manager.ConfirmEmailAsync(null, null)); - await Assert.ThrowsAsync(() => manager.SendMessageAsync(null, null)); } private class BadPasswordValidator : IPasswordValidator where TUser : class diff --git a/test/Shared/MockHelpers.cs b/test/Shared/MockHelpers.cs index ddc30e09b1..ca7fd850d9 100644 --- a/test/Shared/MockHelpers.cs +++ b/test/Shared/MockHelpers.cs @@ -21,7 +21,7 @@ namespace Microsoft.AspNet.Identity.Test public static Mock> MockUserManager() where TUser : class { var store = new Mock>(); - var mgr = new Mock>(store.Object, null, null, null, null, null, null, null, null, null, null); + var mgr = new Mock>(store.Object, null, null, null, null, null, null, null, null, null); mgr.Object.UserValidators.Add(new UserValidator()); mgr.Object.PasswordValidators.Add(new PasswordValidator()); return mgr; @@ -63,7 +63,6 @@ namespace Microsoft.AspNet.Identity.Test var userManager = new UserManager(store, options.Object, new PasswordHasher(), userValidators, pwdValidators, new UpperInvariantLookupNormalizer(), new IdentityErrorDescriber(), Enumerable.Empty>(), - Enumerable.Empty(), new Logger>(new LoggerFactory()), null); validator.Setup(v => v.ValidateAsync(userManager, It.IsAny())) diff --git a/test/Shared/TestMessageService.cs b/test/Shared/TestMessageService.cs deleted file mode 100644 index 52040cf594..0000000000 --- a/test/Shared/TestMessageService.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.AspNet.Identity.Test -{ - public class TestMessageService : IIdentityMessageProvider - { - public IdentityMessage Message { get; set; } - - public string Name { get; set; } = "Test"; - - public Task SendAsync(IdentityMessage message, CancellationToken cancellationToken = default(CancellationToken)) - { - Message = message; - return Task.FromResult(0); - } - } - -} \ No newline at end of file diff --git a/test/Shared/UserManagerTestBase.cs b/test/Shared/UserManagerTestBase.cs index a72112e538..d834cda845 100644 --- a/test/Shared/UserManagerTestBase.cs +++ b/test/Shared/UserManagerTestBase.cs @@ -1447,76 +1447,6 @@ namespace Microsoft.AspNet.Identity.Test Assert.Equal(stamp, user.SecurityStamp); } - [Fact] - public async Task CanEmailTwoFactorToken() - { - var manager = CreateManager(); - var messageService = new TestMessageService { Name = "Email" }; - manager.RegisterMessageProvider(messageService); - const string factorId = "Email"; // default - var user = new TUser() { UserName = "EmailCodeTest", Email = "foo@foo.com" }; - user.EmailConfirmed = true; - const string password = "password"; - IdentityResultAssert.IsSuccess(await manager.CreateAsync(user, password)); - var stamp = user.SecurityStamp; - Assert.NotNull(stamp); - var token = await manager.GenerateTwoFactorTokenAsync(user, factorId); - Assert.NotNull(token); - Assert.Null(messageService.Message); - IdentityResultAssert.IsSuccess(await manager.NotifyTwoFactorTokenAsync(user, factorId, token)); - Assert.NotNull(messageService.Message); - Assert.Equal("Your security code is: " + token, messageService.Message.Body); - Assert.True(await manager.VerifyTwoFactorTokenAsync(user, factorId, token)); - IdentityResultAssert.VerifyUserManagerSuccessLog(manager.Logger, "VerifyTwoFactorTokenAsync", user.Id.ToString()); - } - - [Fact] - public async Task NotifyWithUnknownProviderFails() - { - var manager = CreateManager(); - var user = CreateTestUser(); - IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); - await - ExceptionAssert.ThrowsAsync( - async () => await manager.NotifyTwoFactorTokenAsync(user, "Bogus", "token"), - "No IUserTokenProvider named 'Bogus' is registered."); - } - - [Fact] - public async Task EmailTokenFactorWithFormatTest() - { - // CONSIDER: do we want to support multiple email token options? - const string factorId = "Email"; // default - const string subject = "Custom subject"; - const string body = "Your code is {0}!"; - var services = new ServiceCollection(); - services.Configure(o => - { - o.Name = factorId; - o.Subject = subject; - o.BodyFormat = body; - }); - var manager = CreateManager(null, services); - var messageService = new TestMessageService { Name = "Email" }; - manager.RegisterMessageProvider(messageService); - var user = CreateTestUser(); - user.Email = user.UserName + "@foo.com"; - const string password = "password"; - IdentityResultAssert.IsSuccess(await manager.CreateAsync(user, password)); - var stamp = user.SecurityStamp; - Assert.NotNull(stamp); - var token = await manager.GenerateTwoFactorTokenAsync(user, factorId); - Assert.NotNull(token); - IdentityResultAssert.VerifyUserManagerSuccessLog(manager.Logger, "GenerateTwoFactorTokenAsync", user.Id.ToString()); - Assert.Null(messageService.Message); - IdentityResultAssert.IsSuccess(await manager.NotifyTwoFactorTokenAsync(user, factorId, token)); - Assert.NotNull(messageService.Message); - Assert.Equal(subject, messageService.Message.Subject); - Assert.Equal(string.Format(body, token), messageService.Message.Body); - IdentityResultAssert.VerifyUserManagerSuccessLog(manager.Logger, "NotifyTwoFactorTokenAsync", user.Id.ToString()); - Assert.True(await manager.VerifyTwoFactorTokenAsync(user, factorId, token)); - } - [Fact] public async Task EmailFactorFailsAfterSecurityStampChangeTest() { @@ -1548,69 +1478,6 @@ namespace Microsoft.AspNet.Identity.Test Assert.True(await manager.GetTwoFactorEnabledAsync(user)); } - [Fact] - public async Task CanSendMessage() - { - var manager = CreateManager(); - var messageService = new TestMessageService(); - manager.RegisterMessageProvider(messageService); - var user = CreateTestUser(); - IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); - await manager.SendMessageAsync(messageService.Name, new IdentityMessage { Destination = "foo", Subject = "Hi", Body = "Body" }); - Assert.NotNull(messageService.Message); - Assert.Equal("foo", messageService.Message.Destination); - Assert.Equal("Hi", messageService.Message.Subject); - Assert.Equal("Body", messageService.Message.Body); - } - - [Fact] - public async Task CanSmsTwoFactorToken() - { - var manager = CreateManager(); - var messageService = new TestMessageService { Name = "SMS" }; - manager.RegisterMessageProvider(messageService); - const string factorId = "Phone"; // default - var user = CreateTestUser(); - user.PhoneNumber = "4251234567"; - IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); - var stamp = user.SecurityStamp; - Assert.NotNull(stamp); - var token = await manager.GenerateTwoFactorTokenAsync(user, factorId); - Assert.NotNull(token); - Assert.Null(messageService.Message); - IdentityResultAssert.IsSuccess(await manager.NotifyTwoFactorTokenAsync(user, factorId, token)); - Assert.NotNull(messageService.Message); - Assert.Equal("Your security code is: " + token, messageService.Message.Body); - Assert.True(await manager.VerifyTwoFactorTokenAsync(user, factorId, token)); - } - - [Fact] - public async Task PhoneTokenFactorFormatTest() - { - const string factorId = "Phone"; // default - var services = new ServiceCollection(); - services.Configure(o => - { - o.Name = factorId; - o.MessageFormat = "Your code is: {0}"; - }); - var manager = CreateManager(null, services); - var messageService = new TestMessageService { Name = "SMS" }; - manager.RegisterMessageProvider(messageService); - var user = CreateTestUser(); - user.PhoneNumber = "4251234567"; - IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); - var stamp = user.SecurityStamp; - Assert.NotNull(stamp); - var token = await manager.GenerateTwoFactorTokenAsync(user, factorId); - Assert.NotNull(token); - Assert.Null(messageService.Message); - IdentityResultAssert.IsSuccess(await manager.NotifyTwoFactorTokenAsync(user, factorId, token)); - Assert.NotNull(messageService.Message); - Assert.Equal("Your code is: " + token, messageService.Message.Body); - Assert.True(await manager.VerifyTwoFactorTokenAsync(user, factorId, token)); - } - [Fact] public async Task GenerateTwoFactorWithUnknownFactorProviderWillThrow() {