diff --git a/src/Microsoft.AspNet.Identity/IdentityServiceCollectionExtensions.cs b/src/Microsoft.AspNet.Identity/IdentityServiceCollectionExtensions.cs index 6ccc4ce6c5..318fdae347 100644 --- a/src/Microsoft.AspNet.Identity/IdentityServiceCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Identity/IdentityServiceCollectionExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Security; @@ -52,6 +53,8 @@ namespace Microsoft.Framework.DependencyInjection // Services used by identity services.AddOptions(identityConfig); services.AddDataProtection(identityConfig); + services.AddLogging(identityConfig); + services.TryAdd(describe.Singleton()); // Identity services services.TryAdd(describe.Transient, UserValidator>()); diff --git a/src/Microsoft.AspNet.Identity/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Identity/Properties/AssemblyInfo.cs index 9b09bcab00..20b5c479d6 100644 --- a/src/Microsoft.AspNet.Identity/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Identity/Properties/AssemblyInfo.cs @@ -3,4 +3,7 @@ using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("Microsoft.AspNet.Identity.Test")] \ No newline at end of file +[assembly: InternalsVisibleTo("Microsoft.AspNet.Identity.Test")] +[assembly: InternalsVisibleTo("Microsoft.AspNet.Identity.EntityFramework.Test")] +[assembly: InternalsVisibleTo("Microsoft.AspNet.Identity.EntityFramework.InMemory.Test")] +[assembly: InternalsVisibleTo("Microsoft.AspNet.Identity.InMemory.Test")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity/RoleManager.cs b/src/Microsoft.AspNet.Identity/RoleManager.cs index 848fc21d55..9b3d5f52b3 100644 --- a/src/Microsoft.AspNet.Identity/RoleManager.cs +++ b/src/Microsoft.AspNet.Identity/RoleManager.cs @@ -28,11 +28,11 @@ namespace Microsoft.AspNet.Identity /// The IRoleStore commits changes via the UpdateAsync/CreateAsync methods /// public RoleManager(IRoleStore store, - IEnumerable> roleValidators = null, - ILookupNormalizer keyNormalizer = null, - IdentityErrorDescriber errors = null, - ILogger> logger = null, - IHttpContextAccessor contextAccessor = null) + IEnumerable> roleValidators, + ILookupNormalizer keyNormalizer, + IdentityErrorDescriber errors, + ILogger> logger, + IHttpContextAccessor contextAccessor) { if (store == null) { @@ -62,22 +62,22 @@ namespace Microsoft.AspNet.Identity /// /// Used to validate roles before persisting changes /// - public IList> RoleValidators { get; } = new List>(); + internal IList> RoleValidators { get; } = new List>(); /// /// Used to generate public API error messages /// - public IdentityErrorDescriber ErrorDescriber { get; set; } + internal IdentityErrorDescriber ErrorDescriber { get; set; } /// /// Used to log results /// - public ILogger> Logger { get; set; } + internal ILogger> Logger { get; set; } /// /// Used to normalize user names, role names, emails for uniqueness /// - public ILookupNormalizer KeyNormalizer { get; set; } + internal ILookupNormalizer KeyNormalizer { get; set; } /// /// Returns an IQueryable of roles if the store is an IQueryableRoleStore diff --git a/src/Microsoft.AspNet.Identity/UserManager.cs b/src/Microsoft.AspNet.Identity/UserManager.cs index a914603c72..a1477d493d 100644 --- a/src/Microsoft.AspNet.Identity/UserManager.cs +++ b/src/Microsoft.AspNet.Identity/UserManager.cs @@ -29,8 +29,6 @@ namespace Microsoft.AspNet.Identity private TimeSpan _defaultLockout = TimeSpan.Zero; private bool _disposed; - private IPasswordHasher _passwordHasher; - private IdentityOptions _options; private HttpContext _context; /// @@ -47,16 +45,16 @@ namespace Microsoft.AspNet.Identity /// /// public UserManager(IUserStore store, - IOptions optionsAccessor = null, - IPasswordHasher passwordHasher = null, - IEnumerable> userValidators = null, - IEnumerable> passwordValidators = null, - ILookupNormalizer keyNormalizer = null, - IdentityErrorDescriber errors = null, - IEnumerable> tokenProviders = null, - IEnumerable msgProviders = null, - ILogger> logger = null, - IHttpContextAccessor contextAccessor = null) + IOptions optionsAccessor, + IPasswordHasher passwordHasher, + IEnumerable> userValidators, + IEnumerable> passwordValidators, + ILookupNormalizer keyNormalizer, + IdentityErrorDescriber errors, + IEnumerable> tokenProviders, + IEnumerable msgProviders, + ILogger> logger, + IHttpContextAccessor contextAccessor) { if (store == null) { @@ -64,10 +62,10 @@ namespace Microsoft.AspNet.Identity } Store = store; Options = optionsAccessor?.Options ?? new IdentityOptions(); - PasswordHasher = passwordHasher ?? new PasswordHasher(); - KeyNormalizer = keyNormalizer ?? new UpperInvariantLookupNormalizer(); - ErrorDescriber = errors ?? new IdentityErrorDescriber(); _context = contextAccessor?.Value; + PasswordHasher = passwordHasher; + KeyNormalizer = keyNormalizer; + ErrorDescriber = errors; if (userValidators != null) { @@ -93,7 +91,6 @@ namespace Microsoft.AspNet.Identity RegisterTokenProvider(tokenProvider); } } - if (msgProviders != null) { foreach (var msgProvider in msgProviders) @@ -101,7 +98,6 @@ namespace Microsoft.AspNet.Identity RegisterMessageProvider(msgProvider); } } - } /// @@ -109,69 +105,19 @@ namespace Microsoft.AspNet.Identity /// protected internal IUserStore Store { get; set; } - /// - /// Used to hash/verify passwords - /// - public IPasswordHasher PasswordHasher - { - get - { - ThrowIfDisposed(); - return _passwordHasher; - } - set - { - ThrowIfDisposed(); - if (value == null) - { - throw new ArgumentNullException("value"); - } - _passwordHasher = value; - } - } + internal IPasswordHasher PasswordHasher { get; set; } - /// - /// Used to validate users before persisting changes - /// - public IList> UserValidators { get; } = new List>(); + internal IList> UserValidators { get; } = new List>(); - /// - /// Used to validate passwords before persisting changes - /// - public IList> PasswordValidators { get; } = new List>(); + internal IList> PasswordValidators { get; } = new List>(); - /// - /// Used to normalize user names and emails for uniqueness - /// - public ILookupNormalizer KeyNormalizer { get; set; } + internal ILookupNormalizer KeyNormalizer { get; set; } - /// - /// Used to generate public API error messages - /// - public IdentityErrorDescriber ErrorDescriber { get; set; } + internal IdentityErrorDescriber ErrorDescriber { get; set; } - /// - /// Used to log IdentityResult - /// - public ILogger> Logger { get; set; } + internal ILogger> Logger { get; set; } - public IdentityOptions Options - { - get - { - ThrowIfDisposed(); - return _options; - } - set - { - ThrowIfDisposed(); - if (value == null) - { - throw new ArgumentNullException("value"); - } - _options = value; - } - } + internal IdentityOptions Options { get; set; } /// /// Returns true if the store is an IUserTwoFactorStore diff --git a/test/Microsoft.AspNet.Identity.EntityFramework.InMemory.Test/RoleStoreTest.cs b/test/Microsoft.AspNet.Identity.EntityFramework.InMemory.Test/RoleStoreTest.cs index 9299a59ceb..ea1f2dbf16 100644 --- a/test/Microsoft.AspNet.Identity.EntityFramework.InMemory.Test/RoleStoreTest.cs +++ b/test/Microsoft.AspNet.Identity.EntityFramework.InMemory.Test/RoleStoreTest.cs @@ -19,8 +19,8 @@ namespace Microsoft.AspNet.Identity.EntityFramework.InMemory.Test var services = new ServiceCollection(); services.AddEntityFramework().AddInMemoryStore(); var store = new RoleStore(new InMemoryContext()); - services.AddIdentity(); services.AddInstance>(store); + services.AddIdentity(); var provider = services.BuildServiceProvider(); var manager = provider.GetRequiredService>(); Assert.NotNull(manager); @@ -33,7 +33,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework.InMemory.Test services.AddEntityFramework().AddInMemoryStore(); services.AddTransient(); services.AddTransient, RoleStore>(); - services.AddTransient, RoleValidator>(); + services.AddIdentity(); services.AddSingleton>(); var provider = services.BuildServiceProvider(); var manager = provider.GetRequiredService>(); diff --git a/test/Microsoft.AspNet.Identity.Test/IdentityBuilderTest.cs b/test/Microsoft.AspNet.Identity.Test/IdentityBuilderTest.cs index d19a6442a6..2032a40778 100644 --- a/test/Microsoft.AspNet.Identity.Test/IdentityBuilderTest.cs +++ b/test/Microsoft.AspNet.Identity.Test/IdentityBuilderTest.cs @@ -237,13 +237,13 @@ namespace Microsoft.AspNet.Identity.Test private class MyUserManager : UserManager { - public MyUserManager(IUserStore store) : base(store) { } + public MyUserManager(IUserStore store) : base(store, null, null, null, null, null, null, null, null, null, null) { } } private class MyRoleManager : RoleManager { public MyRoleManager(IRoleStore store, - IEnumerable> roleValidators) : base(store) + IEnumerable> roleValidators) : base(store, null, null, null, null, null) { } diff --git a/test/Microsoft.AspNet.Identity.Test/RoleManagerTest.cs b/test/Microsoft.AspNet.Identity.Test/RoleManagerTest.cs index 99e35a31fb..49a765ebe0 100644 --- a/test/Microsoft.AspNet.Identity.Test/RoleManagerTest.cs +++ b/test/Microsoft.AspNet.Identity.Test/RoleManagerTest.cs @@ -124,7 +124,7 @@ namespace Microsoft.AspNet.Identity.Test public async Task RoleManagerPublicNullChecks() { Assert.Throws("store", - () => new RoleManager(null, null, null)); + () => new RoleManager(null, null, null, null, null, null)); var manager = CreateRoleManager(new NotImplementedStore()); await Assert.ThrowsAsync("role", async () => await manager.CreateAsync(null)); await Assert.ThrowsAsync("role", async () => await manager.UpdateAsync(null)); @@ -148,9 +148,7 @@ namespace Microsoft.AspNet.Identity.Test private static RoleManager CreateRoleManager(IRoleStore roleStore) { - var v = new List>(); - v.Add(new RoleValidator()); - return new RoleManager(roleStore); + return MockHelpers.TestRoleManager(roleStore); } private class NotImplementedStore : IRoleStore diff --git a/test/Microsoft.AspNet.Identity.Test/RoleValidatorTest.cs b/test/Microsoft.AspNet.Identity.Test/RoleValidatorTest.cs index f1b0aa48fa..8536a0f855 100644 --- a/test/Microsoft.AspNet.Identity.Test/RoleValidatorTest.cs +++ b/test/Microsoft.AspNet.Identity.Test/RoleValidatorTest.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNet.Identity.Test { // Setup var validator = new RoleValidator(); - var manager = new RoleManager(new NoopRoleStore()); + var manager = MockHelpers.TestRoleManager(); // Act // Assert @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Identity.Test { // Setup var validator = new RoleValidator(); - var manager = new RoleManager(new NoopRoleStore()); + var manager = MockHelpers.TestRoleManager(); var user = new TestRole {Name = input}; // Act diff --git a/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs b/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs index 099e4faa36..a129b28d58 100644 --- a/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs +++ b/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs @@ -16,23 +16,15 @@ namespace Microsoft.AspNet.Identity.Test { public class UserManagerTest { - private class TestManager : UserManager - { - public IUserStore StorePublic { get { return Store; } } - - public TestManager(IUserStore store) : base(store) { } - } - [Fact] public void EnsureDefaultServicesDefaultsWithStoreWorks() { var services = new ServiceCollection() - .AddTransient, NoopUserStore>() - .AddTransient(); + .AddTransient, NoopUserStore>(); services.AddIdentity(); - var manager = services.BuildServiceProvider().GetRequiredService(); + var manager = services.BuildServiceProvider().GetRequiredService>(); Assert.NotNull(manager.PasswordHasher); - Assert.NotNull(manager.StorePublic); + Assert.NotNull(manager.Store); Assert.NotNull(manager.Options); } @@ -639,15 +631,11 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public async Task ManagerPublicNullChecks() { - var store = new NotImplementedStore(); - Assert.Throws("store", - () => new UserManager(null, null)); + () => new UserManager(null, null, null, null, null, null, null, null, null, null, null)); - var manager = new UserManager(store); + var manager = MockHelpers.TestUserManager(new NotImplementedStore()); - Assert.Throws("value", () => manager.PasswordHasher = null); - Assert.Throws("value", () => manager.Options = null); await Assert.ThrowsAsync("user", async () => await manager.CreateAsync(null)); await Assert.ThrowsAsync("user", async () => await manager.CreateAsync(null, null)); await diff --git a/test/Shared/MockHelpers.cs b/test/Shared/MockHelpers.cs index ea3ebd0a6f..590c708791 100644 --- a/test/Shared/MockHelpers.cs +++ b/test/Shared/MockHelpers.cs @@ -8,6 +8,9 @@ using System.Threading.Tasks; using System.Text; using Microsoft.Framework.Logging; using Moq; +using Microsoft.Framework.OptionsModel; +using System.Linq; +using Microsoft.AspNet.Hosting; namespace Microsoft.AspNet.Identity.Test { @@ -49,10 +52,20 @@ namespace Microsoft.AspNet.Identity.Test public static UserManager TestUserManager(IUserStore store = null) where TUser : class { store = store ?? new Mock>().Object; + var options = new Mock>(); + var idOptions = new IdentityOptions(); + options.Setup(o => o.Options).Returns(idOptions); + var userValidators = new List>(); var validator = new Mock>(); - var userManager = new UserManager(store); - userManager.UserValidators.Add(validator.Object); - userManager.PasswordValidators.Add(new PasswordValidator()); + userValidators.Add(validator.Object); + var pwdValidators = new List>(); + pwdValidators.Add(new PasswordValidator()); + 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())) .Returns(Task.FromResult(IdentityResult.Success)).Verifiable(); return userManager; @@ -63,7 +76,11 @@ namespace Microsoft.AspNet.Identity.Test store = store ?? new Mock>().Object; var roles = new List>(); roles.Add(new RoleValidator()); - return new RoleManager(store, roles); + return new RoleManager(store, roles, + new UpperInvariantLookupNormalizer(), + new IdentityErrorDescriber(), + new Logger>(new LoggerFactory()), + null); } }