From 3abe532761a2f37e893377ca9f69d274b4848383 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Tue, 14 Oct 2014 19:19:44 -0700 Subject: [PATCH] React to options and hosting changes --- .../Models/IdentityModels.cs | 2 +- .../IdentitySample.Mvc/Models/SampleData.cs | 2 +- samples/IdentitySample.Mvc/Startup.cs | 3 +- samples/IdentitySample.Mvc/project.json | 1 + ...dentityEntityFrameworkBuilderExtensions.cs | 1 - .../BuilderExtensions.cs | 1 - .../ClaimsIdentityFactory.cs | 2 +- .../IdentityBuilder.cs | 2 +- .../IdentityServiceCollectionExtensions.cs | 14 ++--- .../SecurityStampValidator.cs | 2 +- .../SignInManager.cs | 14 ++++- src/Microsoft.AspNet.Identity/UserManager.cs | 2 +- .../CustomPocoTest.cs | 9 +-- .../DefaultPocoTest.cs | 14 ++--- .../SqlStoreTestBase.cs | 37 +++-------- .../UserStoreGuidKeyTest.cs | 3 +- .../UserStoreTest.cs | 61 +++++++++---------- .../HttpSignInTest.cs | 9 +-- .../StartupTest.cs | 4 +- .../ClaimsIdentityFactoryTest.cs | 4 +- .../IdentityOptionsTest.cs | 18 +++--- .../SecurityStampValidatorTest.cs | 8 +-- .../SignInManagerTest.cs | 32 ++++++---- .../UserManagerTest.cs | 4 +- test/Shared/MockHelpers.cs | 4 +- 25 files changed, 114 insertions(+), 139 deletions(-) diff --git a/samples/IdentitySample.Mvc/Models/IdentityModels.cs b/samples/IdentitySample.Mvc/Models/IdentityModels.cs index 50bdfc34dd..aaf0d2688f 100644 --- a/samples/IdentitySample.Mvc/Models/IdentityModels.cs +++ b/samples/IdentitySample.Mvc/Models/IdentityModels.cs @@ -10,7 +10,7 @@ namespace IdentitySample.Models public class ApplicationDbContext : IdentityDbContext { - public ApplicationDbContext(IServiceProvider serviceProvider, IOptionsAccessor optionsAccessor) + public ApplicationDbContext(IServiceProvider serviceProvider, IOptions optionsAccessor) : base(serviceProvider, optionsAccessor.Options) { } diff --git a/samples/IdentitySample.Mvc/Models/SampleData.cs b/samples/IdentitySample.Mvc/Models/SampleData.cs index bca857169c..d96cf66945 100644 --- a/samples/IdentitySample.Mvc/Models/SampleData.cs +++ b/samples/IdentitySample.Mvc/Models/SampleData.cs @@ -36,7 +36,7 @@ namespace IdentitySample.Models /// private static async Task CreateAdminUser(IServiceProvider serviceProvider) { - var options = serviceProvider.GetService>().Options; + var options = serviceProvider.GetService>().Options; const string adminRole = "Administrator"; var userManager = serviceProvider.GetService>(); diff --git a/samples/IdentitySample.Mvc/Startup.cs b/samples/IdentitySample.Mvc/Startup.cs index 2e18f63537..56abca8eb5 100644 --- a/samples/IdentitySample.Mvc/Startup.cs +++ b/samples/IdentitySample.Mvc/Startup.cs @@ -29,7 +29,7 @@ namespace IdentitySamples { services.AddEntityFramework().AddSqlServer(); services.AddScoped(); - services.ConfigureOptions(options => + services.Configure(options => { options.DefaultAdminUserName = Configuration.Get("DefaultAdminUsername"); options.DefaultAdminPassword = Configuration.Get("DefaultAdminPassword"); @@ -66,7 +66,6 @@ namespace IdentitySamples public void Configure(IApplicationBuilder app) { app.UseErrorPage(ErrorPageOptions.ShowAll) - .UsePerRequestServices() .UseStaticFiles() .UseIdentity() .UseFacebookAuthentication() diff --git a/samples/IdentitySample.Mvc/project.json b/samples/IdentitySample.Mvc/project.json index 3622c41817..84042678d8 100644 --- a/samples/IdentitySample.Mvc/project.json +++ b/samples/IdentitySample.Mvc/project.json @@ -24,6 +24,7 @@ "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:41532", "run": "run server.urls=http://localhost:41532" }, + "webroot": ".", "frameworks": { "aspnet50": { }, diff --git a/src/Microsoft.AspNet.Identity.EntityFramework/IdentityEntityFrameworkBuilderExtensions.cs b/src/Microsoft.AspNet.Identity.EntityFramework/IdentityEntityFrameworkBuilderExtensions.cs index 313a9fff8e..3290097270 100644 --- a/src/Microsoft.AspNet.Identity.EntityFramework/IdentityEntityFrameworkBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Identity.EntityFramework/IdentityEntityFrameworkBuilderExtensions.cs @@ -35,7 +35,6 @@ namespace Microsoft.Framework.DependencyInjection { builder.Services.AddScoped, UserStore>(); builder.Services.AddScoped, RoleStore>(); - builder.Services.AddScoped(); return builder; } diff --git a/src/Microsoft.AspNet.Identity/BuilderExtensions.cs b/src/Microsoft.AspNet.Identity/BuilderExtensions.cs index d3ca0cb72e..97a925efce 100644 --- a/src/Microsoft.AspNet.Identity/BuilderExtensions.cs +++ b/src/Microsoft.AspNet.Identity/BuilderExtensions.cs @@ -22,7 +22,6 @@ namespace Microsoft.AspNet.Builder throw new ArgumentNullException("app"); } app.UseCookieAuthentication(null, IdentityOptions.ExternalCookieAuthenticationType); - app.UseCookieAuthentication(null, IdentityOptions.ApplicationCookieAuthenticationType); app.UseCookieAuthentication(null, IdentityOptions.TwoFactorRememberMeCookieAuthenticationType); app.UseCookieAuthentication(null, IdentityOptions.TwoFactorUserIdCookieAuthenticationType); app.UseCookieAuthentication(null, IdentityOptions.ApplicationCookieAuthenticationType); diff --git a/src/Microsoft.AspNet.Identity/ClaimsIdentityFactory.cs b/src/Microsoft.AspNet.Identity/ClaimsIdentityFactory.cs index 13b0d6b473..c788651965 100644 --- a/src/Microsoft.AspNet.Identity/ClaimsIdentityFactory.cs +++ b/src/Microsoft.AspNet.Identity/ClaimsIdentityFactory.cs @@ -18,7 +18,7 @@ namespace Microsoft.AspNet.Identity where TRole : class { public ClaimsIdentityFactory(UserManager userManager, RoleManager roleManager, - IOptionsAccessor optionsAccessor) + IOptions optionsAccessor) { if (userManager == null) { diff --git a/src/Microsoft.AspNet.Identity/IdentityBuilder.cs b/src/Microsoft.AspNet.Identity/IdentityBuilder.cs index 7445fca909..259fc42a95 100644 --- a/src/Microsoft.AspNet.Identity/IdentityBuilder.cs +++ b/src/Microsoft.AspNet.Identity/IdentityBuilder.cs @@ -49,7 +49,7 @@ namespace Microsoft.AspNet.Identity public IdentityBuilder ConfigureIdentity(Action action, int order = 0) { - Services.AddOptionsAction(new OptionsAction(action) { Order = order }); + Services.Configure(action, order); return this; } diff --git a/src/Microsoft.AspNet.Identity/IdentityServiceCollectionExtensions.cs b/src/Microsoft.AspNet.Identity/IdentityServiceCollectionExtensions.cs index bcbfbec92e..015d026561 100644 --- a/src/Microsoft.AspNet.Identity/IdentityServiceCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Identity/IdentityServiceCollectionExtensions.cs @@ -15,7 +15,7 @@ namespace Microsoft.Framework.DependencyInjection { public static IServiceCollection ConfigureIdentity(this IServiceCollection services, Action configure) { - return services.ConfigureOptions(configure); + return services.Configure(configure); } public static IdentityBuilder AddIdentity(this IServiceCollection services, @@ -36,7 +36,7 @@ namespace Microsoft.Framework.DependencyInjection { if (identityConfig != null) { - services.ConfigureOptions(identityConfig); + services.Configure(identityConfig); } if (configureOptions != null) { @@ -50,12 +50,12 @@ namespace Microsoft.Framework.DependencyInjection services.AddScoped>(); services.AddScoped, ClaimsIdentityFactory>(); - services.ConfigureOptions(options => + services.Configure(options => { options.SignInAsAuthenticationType = IdentityOptions.ExternalCookieAuthenticationType; }); - services.ConfigureOptions(options => + services.Configure(options => { options.AuthenticationType = IdentityOptions.ApplicationCookieAuthenticationType; //CookieName = ".AspNet.Identity." + ClaimsIdentityOptions.DefaultAuthenticationType, @@ -66,7 +66,7 @@ namespace Microsoft.Framework.DependencyInjection }; }, IdentityOptions.ApplicationCookieAuthenticationType); - services.ConfigureOptions(options => + services.Configure(options => { options.AuthenticationType = IdentityOptions.ExternalCookieAuthenticationType; options.AuthenticationMode = AuthenticationMode.Passive; @@ -74,14 +74,14 @@ namespace Microsoft.Framework.DependencyInjection options.ExpireTimeSpan = TimeSpan.FromMinutes(5); }, IdentityOptions.ExternalCookieAuthenticationType); - services.ConfigureOptions(options => + services.Configure(options => { options.AuthenticationType = IdentityOptions.TwoFactorRememberMeCookieAuthenticationType; options.AuthenticationMode = AuthenticationMode.Passive; options.CookieName = IdentityOptions.TwoFactorRememberMeCookieAuthenticationType; }, IdentityOptions.TwoFactorRememberMeCookieAuthenticationType); - services.ConfigureOptions(options => + services.Configure(options => { options.AuthenticationType = IdentityOptions.TwoFactorUserIdCookieAuthenticationType; options.AuthenticationMode = AuthenticationMode.Passive; diff --git a/src/Microsoft.AspNet.Identity/SecurityStampValidator.cs b/src/Microsoft.AspNet.Identity/SecurityStampValidator.cs index 6b878d74d7..c9baa4cf4b 100644 --- a/src/Microsoft.AspNet.Identity/SecurityStampValidator.cs +++ b/src/Microsoft.AspNet.Identity/SecurityStampValidator.cs @@ -60,7 +60,7 @@ namespace Microsoft.AspNet.Identity if (issuedUtc != null) { var timeElapsed = currentUtc.Subtract(issuedUtc.Value); - var identityOptions = context.HttpContext.RequestServices.GetService>().Options; + var identityOptions = context.HttpContext.RequestServices.GetService>().Options; validate = timeElapsed > identityOptions.SecurityStampValidationInterval; } if (validate) diff --git a/src/Microsoft.AspNet.Identity/SignInManager.cs b/src/Microsoft.AspNet.Identity/SignInManager.cs index e2eab6b672..38685cc1dd 100644 --- a/src/Microsoft.AspNet.Identity/SignInManager.cs +++ b/src/Microsoft.AspNet.Identity/SignInManager.cs @@ -22,7 +22,7 @@ namespace Microsoft.AspNet.Identity public class SignInManager where TUser : class { public SignInManager(UserManager userManager, IContextAccessor contextAccessor, - IClaimsIdentityFactory claimsFactory, IOptionsAccessor optionsAccessor) + IClaimsIdentityFactory claimsFactory, IOptions optionsAccessor) { if (userManager == null) { @@ -94,6 +94,15 @@ namespace Microsoft.AspNet.Identity return UserManager.SupportsUserLockout && await UserManager.IsLockedOutAsync(user, token); } + private Task ResetLockout(TUser user, CancellationToken token) + { + if (UserManager.SupportsUserLockout) + { + return UserManager.ResetAccessFailedCountAsync(user, token); + } + return Task.FromResult(0); + } + /// /// Validates that the claims identity has a security stamp matching the users /// Returns the user if it matches, null otherwise @@ -131,6 +140,7 @@ namespace Microsoft.AspNet.Identity } if (await UserManager.CheckPasswordAsync(user, password, cancellationToken)) { + await ResetLockout(user, cancellationToken); return await SignInOrTwoFactorAsync(user, isPersistent, cancellationToken); } if (UserManager.SupportsUserLockout && shouldLockout) @@ -224,7 +234,7 @@ namespace Microsoft.AspNet.Identity if (await UserManager.VerifyTwoFactorTokenAsync(user, provider, code, cancellationToken)) { // When token is verified correctly, clear the access failed count used for lockout - await UserManager.ResetAccessFailedCountAsync(user, cancellationToken); + await ResetLockout(user, cancellationToken); // Cleanup external cookie if (twoFactorInfo.LoginProvider != null) { diff --git a/src/Microsoft.AspNet.Identity/UserManager.cs b/src/Microsoft.AspNet.Identity/UserManager.cs index 3a8ac70643..7788b6e0e0 100644 --- a/src/Microsoft.AspNet.Identity/UserManager.cs +++ b/src/Microsoft.AspNet.Identity/UserManager.cs @@ -37,7 +37,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public UserManager(IUserStore store, IOptionsAccessor optionsAccessor, + public UserManager(IUserStore store, IOptions optionsAccessor, IPasswordHasher passwordHasher, IUserValidator userValidator, IPasswordValidator passwordValidator, IUserNameNormalizer userNameNormalizer, IEnumerable> tokenProviders) diff --git a/test/Microsoft.AspNet.Identity.EntityFramework.Test/CustomPocoTest.cs b/test/Microsoft.AspNet.Identity.EntityFramework.Test/CustomPocoTest.cs index 004c48d925..add81005cd 100644 --- a/test/Microsoft.AspNet.Identity.EntityFramework.Test/CustomPocoTest.cs +++ b/test/Microsoft.AspNet.Identity.EntityFramework.Test/CustomPocoTest.cs @@ -33,7 +33,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test public DbSet> Users { get; set; } public CustomDbContext(IServiceProvider services) : - base(services, services.GetService>().Options) + base(services, services.GetService>().Options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) @@ -48,12 +48,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test public CustomDbContext GetContext() where TKey : IEquatable { - var services = new ServiceCollection(); - services.Add(OptionsServices.GetDefaultServices()); - services.AddInstance(new NullLoggerFactory()); - services.AddEntityFramework().AddSqlServer(); - services.ConfigureOptions(options => options.UseSqlServer(ConnectionString)); - var serviceProvider = services.BuildServiceProvider(); + var serviceProvider = UserStoreTest.ConfigureDbServices(ConnectionString).BuildServiceProvider(); return new CustomDbContext(serviceProvider); } diff --git a/test/Microsoft.AspNet.Identity.EntityFramework.Test/DefaultPocoTest.cs b/test/Microsoft.AspNet.Identity.EntityFramework.Test/DefaultPocoTest.cs index 021bb58c3a..d96d0c2351 100644 --- a/test/Microsoft.AspNet.Identity.EntityFramework.Test/DefaultPocoTest.cs +++ b/test/Microsoft.AspNet.Identity.EntityFramework.Test/DefaultPocoTest.cs @@ -21,14 +21,10 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test private readonly string ConnectionString = @"Server=(localdb)\v11.0;Database=DefaultSchemaTest" + DateTime.Now.Month + "-" + DateTime.Now.Day + "-" + DateTime.Now.Year + ";Trusted_Connection=True;"; public IdentityDbContext CreateContext(bool ensureCreated = false) { - var services = new ServiceCollection(); - services.Add(OptionsServices.GetDefaultServices()); - services.AddInstance(new NullLoggerFactory()); - services.AddEntityFramework().AddSqlServer(); - services.ConfigureOptions(options => options.UseSqlServer(ConnectionString)); + var services = UserStoreTest.ConfigureDbServices(ConnectionString); var serviceProvider = services.BuildServiceProvider(); var db = new IdentityDbContext(serviceProvider, - serviceProvider.GetService>().Options); + serviceProvider.GetService>().Options); if (ensureCreated) { db.Database.EnsureCreated(); @@ -55,12 +51,10 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test var context = CreateContext(true); var builder = new ApplicationBuilder(new ServiceCollection().BuildServiceProvider()); - builder.UsePerRequestServices(services => + builder.UseServices(services => { - services.AddEntityFramework().AddSqlServer(); + UserStoreTest.ConfigureDbServices(ConnectionString, services); services.AddIdentitySqlServer(); - services.ConfigureOptions(options => - options.UseSqlServer(ConnectionString)); // todo: constructor resolution doesn't work well with IdentityDbContext since it has 4 constructors services.AddInstance(context); }); diff --git a/test/Microsoft.AspNet.Identity.EntityFramework.Test/SqlStoreTestBase.cs b/test/Microsoft.AspNet.Identity.EntityFramework.Test/SqlStoreTestBase.cs index d1a11a7c12..a17fe8af20 100644 --- a/test/Microsoft.AspNet.Identity.EntityFramework.Test/SqlStoreTestBase.cs +++ b/test/Microsoft.AspNet.Identity.EntityFramework.Test/SqlStoreTestBase.cs @@ -27,7 +27,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test public class ApplicationDbContext : IdentityDbContext { - public ApplicationDbContext(IServiceProvider services, IOptionsAccessor options) : base(services, options.Options) { } + public ApplicationDbContext(IServiceProvider services, IOptions options) : base(services, options.Options) { } } [TestPriority(-1000)] @@ -46,28 +46,17 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test public void DropDb() { - var services = new ServiceCollection(); - services.AddEntityFramework().AddSqlServer(); - services.Add(OptionsServices.GetDefaultServices()); - services.AddInstance(new NullLoggerFactory()); - services.ConfigureOptions(options => - options.UseSqlServer(ConnectionString)); - var serviceProvider = services.BuildServiceProvider(); + var serviceProvider = UserStoreTest.ConfigureDbServices(ConnectionString).BuildServiceProvider(); var db = new ApplicationDbContext(serviceProvider, - serviceProvider.GetService>()); + serviceProvider.GetService>()); db.Database.EnsureDeleted(); } public ApplicationDbContext CreateContext(bool delete = false) { - var services = new ServiceCollection(); - services.AddEntityFramework().AddSqlServer(); - services.Add(OptionsServices.GetDefaultServices()); - services.AddInstance(new NullLoggerFactory()); - services.ConfigureOptions(options => options.UseSqlServer(ConnectionString)); - var serviceProvider = services.BuildServiceProvider(); + var serviceProvider = UserStoreTest.ConfigureDbServices(ConnectionString).BuildServiceProvider(); var db = new ApplicationDbContext(serviceProvider, - serviceProvider.GetService>()); + serviceProvider.GetService>()); if (delete) { db.Database.EnsureDeleted(); @@ -96,7 +85,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test { context = CreateTestContext(); } - var services = new ServiceCollection(); + var services = UserStoreTest.ConfigureDbServices(ConnectionString); services.AddIdentity().AddRoleStore(new RoleStore((ApplicationDbContext)context)); return services.BuildServiceProvider().GetService>(); } @@ -112,13 +101,10 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test EnsureDatabase(); var builder = new ApplicationBuilder(new ServiceCollection().BuildServiceProvider()); - builder.UsePerRequestServices(services => + builder.UseServices(services => { - services.AddInstance(new NullLoggerFactory()); - services.AddEntityFramework().AddSqlServer(); + UserStoreTest.ConfigureDbServices(ConnectionString, services); services.AddIdentitySqlServer(); - services.ConfigureOptions(options => - options.UseSqlServer(ConnectionString)); }); var userStore = builder.ApplicationServices.GetService>(); @@ -140,10 +126,9 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test EnsureDatabase(); var builder = new ApplicationBuilder(new ServiceCollection().BuildServiceProvider()); - builder.UsePerRequestServices(services => + builder.UseServices(services => { - services.AddInstance(new NullLoggerFactory()); - services.AddEntityFramework().AddSqlServer(); + UserStoreTest.ConfigureDbServices(ConnectionString, services); services.AddIdentitySqlServer(); services.ConfigureIdentity(options => { @@ -154,8 +139,6 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test options.Password.RequireDigit = false; options.User.UserNameValidationRegex = null; }); - services.ConfigureOptions(options => - options.UseSqlServer(ConnectionString)); }); var userStore = builder.ApplicationServices.GetService>(); diff --git a/test/Microsoft.AspNet.Identity.EntityFramework.Test/UserStoreGuidKeyTest.cs b/test/Microsoft.AspNet.Identity.EntityFramework.Test/UserStoreGuidKeyTest.cs index 7fbe9911e3..db3dd1f2e5 100644 --- a/test/Microsoft.AspNet.Identity.EntityFramework.Test/UserStoreGuidKeyTest.cs +++ b/test/Microsoft.AspNet.Identity.EntityFramework.Test/UserStoreGuidKeyTest.cs @@ -77,8 +77,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test { context = CreateTestContext(); } - var services = new ServiceCollection(); - services.AddInstance(new NullLoggerFactory()); + var services = UserStoreTest.ConfigureDbServices(ConnectionString); services.AddIdentity().AddRoleStore(new ApplicationRoleStore((ApplicationDbContext)context)); return services.BuildServiceProvider().GetService>(); } diff --git a/test/Microsoft.AspNet.Identity.EntityFramework.Test/UserStoreTest.cs b/test/Microsoft.AspNet.Identity.EntityFramework.Test/UserStoreTest.cs index c00af1c801..a0ba258745 100644 --- a/test/Microsoft.AspNet.Identity.EntityFramework.Test/UserStoreTest.cs +++ b/test/Microsoft.AspNet.Identity.EntityFramework.Test/UserStoreTest.cs @@ -26,7 +26,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test public class ApplicationDbContext : IdentityDbContext { - public ApplicationDbContext(IServiceProvider services, IOptionsAccessor options) : base(services, options.Options) { } + public ApplicationDbContext(IServiceProvider services, IOptions options) : base(services, options.Options) { } } [TestPriority(-1000)] @@ -45,15 +45,9 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test public void DropDb() { - var services = new ServiceCollection(); - services.AddInstance(new NullLoggerFactory()); - services.AddEntityFramework().AddSqlServer(); - services.Add(OptionsServices.GetDefaultServices()); - services.ConfigureOptions(options => - options.UseSqlServer(ConnectionString)); - var serviceProvider = services.BuildServiceProvider(); + var serviceProvider = ConfigureDbServices(ConnectionString).BuildServiceProvider(); var db = new ApplicationDbContext(serviceProvider, - serviceProvider.GetService>()); + serviceProvider.GetService>()); db.Database.EnsureDeleted(); } @@ -63,13 +57,11 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test EnsureDatabase(); var builder = new ApplicationBuilder(new ServiceCollection().BuildServiceProvider()); - builder.UsePerRequestServices(services => + builder.UseServices(services => { - services.AddInstance(new NullLoggerFactory()); - services.AddEntityFramework().AddSqlServer(); + ConfigureDbServices(ConnectionString, services); + services.AddScoped(); services.AddDefaultIdentity(); - services.ConfigureOptions(options => - options.UseSqlServer(ConnectionString)); }); var userStore = builder.ApplicationServices.GetService>(); @@ -91,7 +83,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test EnsureDatabase(); var builder = new ApplicationBuilder(new ServiceCollection().BuildServiceProvider()); - builder.UsePerRequestServices(services => + builder.UseServices(services => { services.AddInstance(new NullLoggerFactory()); services.AddEntityFramework().AddSqlServer(); @@ -103,7 +95,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test options.Password.RequireUppercase = false; options.Password.RequireDigit = false; }); - services.ConfigureOptions(options => + services.Configure(options => options.UseSqlServer(ConnectionString)); }); @@ -135,13 +127,8 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test public IdentityDbContext CreateContext(bool delete = false) { - var services = new ServiceCollection(); - services.AddInstance(new NullLoggerFactory()); - services.AddEntityFramework().AddSqlServer(); - var dbOptions = new DbContextOptions(); - dbOptions.UseSqlServer(ConnectionString); - var serviceProvider = services.BuildServiceProvider(); - var db = new IdentityDbContext(serviceProvider, dbOptions); + var serviceProvider = ConfigureDbServices(ConnectionString).BuildServiceProvider(); + var db = new IdentityDbContext(serviceProvider, serviceProvider.GetService>().Options); if (delete) { db.Database.EnsureDeleted(); @@ -160,16 +147,25 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test CreateContext(); } + public static IServiceCollection ConfigureDbServices(string connectionString, IServiceCollection services = null) + { + if (services == null) + { + services = new ServiceCollection(); + } + services.AddEntityFramework().AddSqlServer(); + services.Add(OptionsServices.GetDefaultServices()); + services.AddInstance(new NullLoggerFactory()); + services.Configure(options => + options.UseSqlServer(connectionString)); + return services; + } + public ApplicationDbContext CreateAppContext() { CreateContext(); - var services = new ServiceCollection(); - services.AddInstance(new NullLoggerFactory()); - services.AddEntityFramework().AddSqlServer(); - services.Add(OptionsServices.GetDefaultServices()); - var serviceProvider = services.BuildServiceProvider(); - - var db = new ApplicationDbContext(serviceProvider, serviceProvider.GetService>()); + var serviceProvider = ConfigureDbServices(ConnectionString).BuildServiceProvider(); + var db = new ApplicationDbContext(serviceProvider, serviceProvider.GetService>()); db.Database.EnsureCreated(); return db; } @@ -188,10 +184,9 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test return CreateManager((DbContext)context); } - public static RoleManager CreateRoleManager(IdentityDbContext context) + public RoleManager CreateRoleManager(IdentityDbContext context) { - var services = new ServiceCollection(); - services.AddInstance(new NullLoggerFactory()); + var services = ConfigureDbServices(ConnectionString); services.AddIdentity().AddRoleStore(new RoleStore(context)); return services.BuildServiceProvider().GetService>(); } diff --git a/test/Microsoft.AspNet.Identity.InMemory.Test/HttpSignInTest.cs b/test/Microsoft.AspNet.Identity.InMemory.Test/HttpSignInTest.cs index d8f3ce95df..deed93526d 100644 --- a/test/Microsoft.AspNet.Identity.InMemory.Test/HttpSignInTest.cs +++ b/test/Microsoft.AspNet.Identity.InMemory.Test/HttpSignInTest.cs @@ -25,13 +25,6 @@ namespace Microsoft.AspNet.Identity.InMemory.Test public async Task VerifyAccountControllerSignIn(bool isPersistent) { var app = new ApplicationBuilder(new ServiceCollection().BuildServiceProvider()); - //app.UseServices(services => - //{ - // services.SetupOptions(options => - // { - // options.AuthenticationType = IdentityOptions.ApplicationCookieAuthenticationType; - // }); - //}); app.UseCookieAuthentication(); var context = new Mock(); @@ -40,7 +33,7 @@ namespace Microsoft.AspNet.Identity.InMemory.Test response.Setup(r => r.SignIn(It.Is(v => v.IsPersistent == isPersistent), It.IsAny())).Verifiable(); var contextAccessor = new Mock>(); contextAccessor.Setup(a => a.Value).Returns(context.Object); - app.UsePerRequestServices(services => + app.UseServices(services => { services.AddInstance(contextAccessor.Object); services.AddIdentity().AddInMemory(); diff --git a/test/Microsoft.AspNet.Identity.InMemory.Test/StartupTest.cs b/test/Microsoft.AspNet.Identity.InMemory.Test/StartupTest.cs index 57f589d50c..899117a67a 100644 --- a/test/Microsoft.AspNet.Identity.InMemory.Test/StartupTest.cs +++ b/test/Microsoft.AspNet.Identity.InMemory.Test/StartupTest.cs @@ -21,7 +21,7 @@ namespace Microsoft.AspNet.Identity.InMemory.Test { var builder = new ApplicationBuilder(new ServiceCollection().BuildServiceProvider()); - builder.UsePerRequestServices(services => services.AddIdentity().AddInMemory()); + builder.UseServices(services => services.AddIdentity().AddInMemory()); var userStore = builder.ApplicationServices.GetService>(); var roleStore = builder.ApplicationServices.GetService>(); @@ -40,7 +40,7 @@ namespace Microsoft.AspNet.Identity.InMemory.Test public void VerifyUseInMemoryLifetimes() { var builder = new ApplicationBuilder(new ServiceCollection().BuildServiceProvider()); - builder.UsePerRequestServices(services => services.AddIdentity().AddInMemory()); + builder.UseServices(services => services.AddIdentity().AddInMemory()); var userStore = builder.ApplicationServices.GetService>(); var roleStore = builder.ApplicationServices.GetService>(); diff --git a/test/Microsoft.AspNet.Identity.Test/ClaimsIdentityFactoryTest.cs b/test/Microsoft.AspNet.Identity.Test/ClaimsIdentityFactoryTest.cs index ed4ceabc61..0693844723 100644 --- a/test/Microsoft.AspNet.Identity.Test/ClaimsIdentityFactoryTest.cs +++ b/test/Microsoft.AspNet.Identity.Test/ClaimsIdentityFactoryTest.cs @@ -19,7 +19,7 @@ namespace Microsoft.AspNet.Identity.Test { var userManager = MockHelpers.MockUserManager().Object; var roleManager = MockHelpers.MockRoleManager().Object; - var options = new Mock>(); + var options = new Mock>(); Assert.Throws("optionsAccessor", () => new ClaimsIdentityFactory(userManager, roleManager, options.Object)); var identityOptions = new IdentityOptions(); @@ -71,7 +71,7 @@ namespace Microsoft.AspNet.Identity.Test roleManager.Setup(m => m.GetClaimsAsync(local, CancellationToken.None)).ReturnsAsync(localClaims); } - var options = new Mock>(); + var options = new Mock>(); var identityOptions = new IdentityOptions(); options.Setup(a => a.Options).Returns(identityOptions); var factory = new ClaimsIdentityFactory(userManager.Object, roleManager.Object, options.Object); diff --git a/test/Microsoft.AspNet.Identity.Test/IdentityOptionsTest.cs b/test/Microsoft.AspNet.Identity.Test/IdentityOptionsTest.cs index 730d7d7ea3..83f13416c2 100644 --- a/test/Microsoft.AspNet.Identity.Test/IdentityOptionsTest.cs +++ b/test/Microsoft.AspNet.Identity.Test/IdentityOptionsTest.cs @@ -66,7 +66,7 @@ namespace Microsoft.AspNet.Identity.Test var services = new ServiceCollection {OptionsServices.GetDefaultServices()}; services.AddIdentity(config.GetSubKey("identity")); - var accessor = services.BuildServiceProvider().GetService>(); + var accessor = services.BuildServiceProvider().GetService>(); Assert.NotNull(accessor); var options = accessor.Options; Assert.Equal(roleClaimType, options.ClaimsIdentity.RoleClaimType); @@ -96,14 +96,14 @@ namespace Microsoft.AspNet.Identity.Test var services = new ServiceCollection { OptionsServices.GetDefaultServices() }; services.AddIdentity(config.GetSubKey("identity"), o => { o.User.RequireUniqueEmail = false; o.Lockout.MaxFailedAccessAttempts++; }); - var accessor = services.BuildServiceProvider().GetService>(); + var accessor = services.BuildServiceProvider().GetService>(); Assert.NotNull(accessor); var options = accessor.Options; Assert.False(options.User.RequireUniqueEmail); Assert.Equal(1001, options.Lockout.MaxFailedAccessAttempts); } - public class PasswordsNegativeLengthSetup : OptionsAction + public class PasswordsNegativeLengthSetup : ConfigureOptions { public PasswordsNegativeLengthSetup() : base(options => options.Password.RequiredLength = -1) @@ -114,15 +114,15 @@ namespace Microsoft.AspNet.Identity.Test public void CanCustomizeIdentityOptions() { var builder = new ApplicationBuilder(new ServiceCollection().BuildServiceProvider()); - builder.UsePerRequestServices(services => + builder.UseServices(services => { services.AddIdentity(); - services.AddOptionsAction(); + services.ConfigureOptions(); }); - var setup = builder.ApplicationServices.GetService>(); + var setup = builder.ApplicationServices.GetService>(); Assert.IsType(typeof(PasswordsNegativeLengthSetup), setup); - var optionsGetter = builder.ApplicationServices.GetService>(); + var optionsGetter = builder.ApplicationServices.GetService>(); Assert.NotNull(optionsGetter); var myOptions = optionsGetter.Options; Assert.True(myOptions.Password.RequireLowercase); @@ -136,12 +136,12 @@ namespace Microsoft.AspNet.Identity.Test public void CanSetupIdentityOptions() { var app = new ApplicationBuilder(new ServiceCollection().BuildServiceProvider()); - app.UsePerRequestServices(services => + app.UseServices(services => { services.AddIdentity().ConfigureIdentity(options => options.User.RequireUniqueEmail = true); }); - var optionsGetter = app.ApplicationServices.GetService>(); + var optionsGetter = app.ApplicationServices.GetService>(); Assert.NotNull(optionsGetter); var myOptions = optionsGetter.Options; diff --git a/test/Microsoft.AspNet.Identity.Test/SecurityStampValidatorTest.cs b/test/Microsoft.AspNet.Identity.Test/SecurityStampValidatorTest.cs index ac56c76e9f..96cf3cc0cb 100644 --- a/test/Microsoft.AspNet.Identity.Test/SecurityStampValidatorTest.cs +++ b/test/Microsoft.AspNet.Identity.Test/SecurityStampValidatorTest.cs @@ -39,7 +39,7 @@ namespace Microsoft.AspNet.Identity.Test var userManager = MockHelpers.MockUserManager(); var claimsManager = new Mock>(); var identityOptions = new IdentityOptions { SecurityStampValidationInterval = TimeSpan.Zero }; - var options = new Mock>(); + var options = new Mock>(); options.Setup(a => a.Options).Returns(identityOptions); var httpContext = new Mock(); var contextAccessor = new Mock>(); @@ -74,7 +74,7 @@ namespace Microsoft.AspNet.Identity.Test var userManager = MockHelpers.MockUserManager(); var claimsManager = new Mock>(); var identityOptions = new IdentityOptions { SecurityStampValidationInterval = TimeSpan.Zero }; - var options = new Mock>(); + var options = new Mock>(); options.Setup(a => a.Options).Returns(identityOptions); var httpContext = new Mock(); var contextAccessor = new Mock>(); @@ -109,7 +109,7 @@ namespace Microsoft.AspNet.Identity.Test var userManager = MockHelpers.MockUserManager(); var claimsManager = new Mock>(); var identityOptions = new IdentityOptions { SecurityStampValidationInterval = TimeSpan.Zero }; - var options = new Mock>(); + var options = new Mock>(); options.Setup(a => a.Options).Returns(identityOptions); var contextAccessor = new Mock>(); contextAccessor.Setup(a => a.Value).Returns(httpContext.Object); @@ -143,7 +143,7 @@ namespace Microsoft.AspNet.Identity.Test var userManager = MockHelpers.MockUserManager(); var claimsManager = new Mock>(); var identityOptions = new IdentityOptions { SecurityStampValidationInterval = TimeSpan.FromDays(1) }; - var options = new Mock>(); + var options = new Mock>(); options.Setup(a => a.Options).Returns(identityOptions); var contextAccessor = new Mock>(); contextAccessor.Setup(a => a.Value).Returns(httpContext.Object); diff --git a/test/Microsoft.AspNet.Identity.Test/SignInManagerTest.cs b/test/Microsoft.AspNet.Identity.Test/SignInManagerTest.cs index 798235da57..b1d56f25d7 100644 --- a/test/Microsoft.AspNet.Identity.Test/SignInManagerTest.cs +++ b/test/Microsoft.AspNet.Identity.Test/SignInManagerTest.cs @@ -123,7 +123,7 @@ namespace Microsoft.AspNet.Identity.Test contextAccessor.Setup(a => a.Value).Returns(context.Object); var roleManager = MockHelpers.MockRoleManager(); var identityOptions = new IdentityOptions(); - var options = new Mock>(); + var options = new Mock>(); options.Setup(a => a.Options).Returns(identityOptions); var claimsFactory = new Mock>(manager.Object, roleManager.Object, options.Object); var helper = new SignInManager(manager.Object, contextAccessor.Object, claimsFactory.Object, options.Object); @@ -148,6 +148,7 @@ namespace Microsoft.AspNet.Identity.Test manager.Setup(m => m.IsLockedOutAsync(user, CancellationToken.None)).ReturnsAsync(false).Verifiable(); manager.Setup(m => m.FindByNameAsync(user.UserName, CancellationToken.None)).ReturnsAsync(user).Verifiable(); manager.Setup(m => m.CheckPasswordAsync(user, "password", CancellationToken.None)).ReturnsAsync(true).Verifiable(); + manager.Setup(m => m.ResetAccessFailedCountAsync(user, CancellationToken.None)).ReturnsAsync(IdentityResult.Success).Verifiable(); var context = new Mock(); var response = new Mock(); context.Setup(c => c.Response).Returns(response.Object).Verifiable(); @@ -156,7 +157,7 @@ namespace Microsoft.AspNet.Identity.Test contextAccessor.Setup(a => a.Value).Returns(context.Object); var roleManager = MockHelpers.MockRoleManager(); var identityOptions = new IdentityOptions(); - var options = new Mock>(); + var options = new Mock>(); options.Setup(a => a.Options).Returns(identityOptions); var claimsFactory = new Mock>(manager.Object, roleManager.Object, options.Object); claimsFactory.Setup(m => m.CreateAsync(user, CancellationToken.None)).ReturnsAsync(new ClaimsIdentity("Microsoft.AspNet.Identity")).Verifiable(); @@ -184,6 +185,7 @@ namespace Microsoft.AspNet.Identity.Test manager.Setup(m => m.IsLockedOutAsync(user, CancellationToken.None)).ReturnsAsync(false).Verifiable(); manager.Setup(m => m.FindByNameAsync(user.UserName, CancellationToken.None)).ReturnsAsync(user).Verifiable(); manager.Setup(m => m.CheckPasswordAsync(user, "password", CancellationToken.None)).ReturnsAsync(true).Verifiable(); + manager.Setup(m => m.ResetAccessFailedCountAsync(user, CancellationToken.None)).ReturnsAsync(IdentityResult.Success).Verifiable(); var context = new Mock(); var response = new Mock(); response.Setup(r => r.SignIn(It.IsAny(), It.IsAny())).Verifiable(); @@ -192,7 +194,7 @@ namespace Microsoft.AspNet.Identity.Test contextAccessor.Setup(a => a.Value).Returns(context.Object); var roleManager = MockHelpers.MockRoleManager(); var identityOptions = new IdentityOptions(); - var options = new Mock>(); + var options = new Mock>(); options.Setup(a => a.Options).Returns(identityOptions); var claimsFactory = new Mock>(manager.Object, roleManager.Object, options.Object); var helper = new SignInManager(manager.Object, contextAccessor.Object, claimsFactory.Object, options.Object); @@ -229,6 +231,10 @@ namespace Microsoft.AspNet.Identity.Test manager.Setup(m => m.FindByNameAsync(user.UserName, CancellationToken.None)).ReturnsAsync(user).Verifiable(); manager.Setup(m => m.GetUserIdAsync(user, CancellationToken.None)).ReturnsAsync(user.Id).Verifiable(); manager.Setup(m => m.CheckPasswordAsync(user, "password", CancellationToken.None)).ReturnsAsync(true).Verifiable(); + if (supportsLockout) + { + manager.Setup(m => m.ResetAccessFailedCountAsync(user, CancellationToken.None)).ReturnsAsync(IdentityResult.Success).Verifiable(); + } var context = new Mock(); var response = new Mock(); response.Setup(r => r.SignIn(It.Is(id => id.Name == user.Id))).Verifiable(); @@ -237,7 +243,7 @@ namespace Microsoft.AspNet.Identity.Test contextAccessor.Setup(a => a.Value).Returns(context.Object); var roleManager = MockHelpers.MockRoleManager(); var identityOptions = new IdentityOptions(); - var options = new Mock>(); + var options = new Mock>(); options.Setup(a => a.Options).Returns(identityOptions); var helper = new SignInManager(manager.Object, contextAccessor.Object, new ClaimsIdentityFactory(manager.Object, roleManager.Object, options.Object), options.Object); @@ -281,7 +287,7 @@ namespace Microsoft.AspNet.Identity.Test var roleManager = MockHelpers.MockRoleManager(); var identityOptions = new IdentityOptions(); response.Setup(r => r.SignOut(IdentityOptions.ExternalCookieAuthenticationType)).Verifiable(); - var options = new Mock>(); + var options = new Mock>(); options.Setup(a => a.Options).Returns(identityOptions); var claimsFactory = new Mock>(manager.Object, roleManager.Object, options.Object); claimsFactory.Setup(m => m.CreateAsync(user, CancellationToken.None)).ReturnsAsync(new ClaimsIdentity("Microsoft.AspNet.Identity")).Verifiable(); @@ -328,6 +334,7 @@ namespace Microsoft.AspNet.Identity.Test if (supportsLockout) { manager.Setup(m => m.IsLockedOutAsync(user, CancellationToken.None)).ReturnsAsync(false).Verifiable(); + manager.Setup(m => m.ResetAccessFailedCountAsync(user, CancellationToken.None)).ReturnsAsync(IdentityResult.Success).Verifiable(); } manager.Setup(m => m.FindByIdAsync(user.Id, CancellationToken.None)).ReturnsAsync(user).Verifiable(); manager.Setup(m => m.VerifyTwoFactorTokenAsync(user, provider, code, CancellationToken.None)).ReturnsAsync(true).Verifiable(); @@ -342,7 +349,7 @@ namespace Microsoft.AspNet.Identity.Test var authResult = new AuthenticationResult(id, new AuthenticationProperties(), new AuthenticationDescription()); var roleManager = MockHelpers.MockRoleManager(); var identityOptions = new IdentityOptions(); - var options = new Mock>(); + var options = new Mock>(); options.Setup(a => a.Options).Returns(identityOptions); var claimsFactory = new ClaimsIdentityFactory(manager.Object, roleManager.Object, options.Object); if (externalLogin) @@ -393,7 +400,7 @@ namespace Microsoft.AspNet.Identity.Test var contextAccessor = new Mock>(); var roleManager = MockHelpers.MockRoleManager(); var identityOptions = new IdentityOptions(); - var options = new Mock>(); + var options = new Mock>(); options.Setup(a => a.Options).Returns(identityOptions); var claimsFactory = new ClaimsIdentityFactory(manager.Object, roleManager.Object, options.Object); @@ -449,7 +456,7 @@ namespace Microsoft.AspNet.Identity.Test contextAccessor.Setup(a => a.Value).Returns(context.Object); var roleManager = MockHelpers.MockRoleManager(); var identityOptions = new IdentityOptions(); - var options = new Mock>(); + var options = new Mock>(); options.Setup(a => a.Options).Returns(identityOptions); var claimsFactory = new Mock>(manager.Object, roleManager.Object, options.Object); claimsFactory.Setup(m => m.CreateAsync(user, CancellationToken.None)).ReturnsAsync(new ClaimsIdentity(IdentityOptions.ApplicationCookieAuthenticationType)).Verifiable(); @@ -482,7 +489,7 @@ namespace Microsoft.AspNet.Identity.Test contextAccessor.Setup(a => a.Value).Returns(context.Object); var roleManager = MockHelpers.MockRoleManager(); var identityOptions = new IdentityOptions(); - var options = new Mock>(); + var options = new Mock>(); options.Setup(a => a.Options).Returns(identityOptions); IdentityOptions.ApplicationCookieAuthenticationType = authenticationType; var claimsFactory = new Mock>(manager.Object, roleManager.Object, options.Object); @@ -511,7 +518,7 @@ namespace Microsoft.AspNet.Identity.Test contextAccessor.Setup(a => a.Value).Returns(context.Object); var roleManager = MockHelpers.MockRoleManager(); var identityOptions = new IdentityOptions(); - var options = new Mock>(); + var options = new Mock>(); options.Setup(a => a.Options).Returns(identityOptions); var claimsFactory = new Mock>(manager.Object, roleManager.Object, options.Object); var helper = new SignInManager(manager.Object, contextAccessor.Object, claimsFactory.Object, options.Object); @@ -534,7 +541,7 @@ namespace Microsoft.AspNet.Identity.Test contextAccessor.Setup(a => a.Value).Returns(context.Object); var roleManager = MockHelpers.MockRoleManager(); var identityOptions = new IdentityOptions(); - var options = new Mock>(); + var options = new Mock>(); options.Setup(a => a.Options).Returns(identityOptions); var claimsFactory = new Mock>(manager.Object, roleManager.Object, options.Object); var helper = new SignInManager(manager.Object, contextAccessor.Object, claimsFactory.Object, options.Object); @@ -568,7 +575,7 @@ namespace Microsoft.AspNet.Identity.Test contextAccessor.Setup(a => a.Value).Returns(context.Object); var roleManager = MockHelpers.MockRoleManager(); var identityOptions = new IdentityOptions(); - var options = new Mock>(); + var options = new Mock>(); options.Setup(a => a.Options).Returns(identityOptions); var claimsFactory = new Mock>(manager.Object, roleManager.Object, options.Object); var helper = new SignInManager(manager.Object, contextAccessor.Object, claimsFactory.Object, options.Object); @@ -580,5 +587,6 @@ namespace Microsoft.AspNet.Identity.Test Assert.Equal(SignInStatus.LockedOut, result); manager.VerifyAll(); } + } } diff --git a/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs b/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs index 980f9027c9..342229a2ec 100644 --- a/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs +++ b/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs @@ -21,7 +21,7 @@ namespace Microsoft.AspNet.Identity.Test { public IUserStore StorePublic { get { return Store; } } - public TestManager(IUserStore store, IOptionsAccessor optionsAccessor, + public TestManager(IUserStore store, IOptions optionsAccessor, IPasswordHasher passwordHasher, IUserValidator userValidator, IPasswordValidator passwordValidator) : base(store, optionsAccessor, passwordHasher, userValidator, passwordValidator, null, null) { } @@ -517,7 +517,7 @@ namespace Microsoft.AspNet.Identity.Test public async Task ManagerPublicNullChecks() { var store = new NotImplementedStore(); - var optionsAccessor = new OptionsAccessor(null); + var optionsAccessor = new OptionsManager(null); var passwordHasher = new PasswordHasher(); var userValidator = new UserValidator(); var passwordValidator = new PasswordValidator(); diff --git a/test/Shared/MockHelpers.cs b/test/Shared/MockHelpers.cs index 3601bbad0e..01d5acc89c 100644 --- a/test/Shared/MockHelpers.cs +++ b/test/Shared/MockHelpers.cs @@ -33,7 +33,7 @@ namespace Microsoft.AspNet.Identity.Test public static Mock> MockUserManager() where TUser : class { var store = new Mock>(); - var options = new OptionsAccessor(null); + var options = new OptionsManager(null); return new Mock>( store.Object, options, @@ -57,7 +57,7 @@ namespace Microsoft.AspNet.Identity.Test public static UserManager TestUserManager(IUserStore store) where TUser : class { - var options = new OptionsAccessor(null); + var options = new OptionsManager(null); var validator = new Mock>(); var userManager = new UserManager(store, options, new PasswordHasher(), validator.Object, new PasswordValidator(), new UpperInvariantUserNameNormalizer(), null);