// Copyright (c) .NET Foundation. 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.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Xunit; namespace Microsoft.AspNetCore.Identity.Test { public class IdentityBuilderTest { [Fact] public void CanOverrideUserStore() { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); services.AddIdentity().AddUserStore(); var thingy = services.BuildServiceProvider().GetRequiredService>() as MyUberThingy; Assert.NotNull(thingy); } [Fact] public void CanOverrideRoleStore() { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); services.AddIdentity().AddRoleStore(); var thingy = services.BuildServiceProvider().GetRequiredService>() as MyUberThingy; Assert.NotNull(thingy); } [Fact] public void CanOverridePrincipalFactory() { var services = new ServiceCollection() .AddLogging() .AddSingleton(new ConfigurationBuilder().Build()); services.AddIdentity() .AddClaimsPrincipalFactory() .AddUserManager() .AddUserStore() .AddRoleStore(); var thingy = services.BuildServiceProvider().GetRequiredService>() as MyClaimsPrincipalFactory; Assert.NotNull(thingy); } [Fact] public void CanOverrideRoleValidator() { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); services.AddIdentity().AddRoleValidator(); var thingy = services.BuildServiceProvider().GetRequiredService>() as MyUberThingy; Assert.NotNull(thingy); } [Fact] public void CanOverrideUserValidator() { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); services.AddIdentity().AddUserValidator(); var thingy = services.BuildServiceProvider().GetRequiredService>() as MyUberThingy; Assert.NotNull(thingy); } [Fact] public void CanOverridePasswordValidator() { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); services.AddIdentity().AddPasswordValidator(); var thingy = services.BuildServiceProvider().GetRequiredService>() as MyUberThingy; Assert.NotNull(thingy); } [Fact] public void CanOverrideUserManager() { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); services.AddIdentity() .AddUserStore() .AddUserManager(); var myUserManager = services.BuildServiceProvider().GetRequiredService(typeof(UserManager)) as MyUserManager; Assert.NotNull(myUserManager); } [Fact] public void CanOverrideRoleManager() { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); services.AddIdentity() .AddRoleStore() .AddRoleManager(); var myRoleManager = services.BuildServiceProvider().GetRequiredService>() as MyRoleManager; Assert.NotNull(myRoleManager); } [Fact] public void CanOverrideSignInManager() { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()) .AddSingleton() .AddLogging(); services.AddIdentity() .AddUserStore() .AddRoleStore() .AddUserManager() .AddClaimsPrincipalFactory() .AddSignInManager(); var myUserManager = services.BuildServiceProvider().GetRequiredService(typeof(SignInManager)) as MySignInManager; Assert.NotNull(myUserManager); } [Fact] public void EnsureDefaultServices() { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); services.AddIdentity(); var provider = services.BuildServiceProvider(); var userValidator = provider.GetRequiredService>() as UserValidator; Assert.NotNull(userValidator); var pwdValidator = provider.GetRequiredService>() as PasswordValidator; Assert.NotNull(pwdValidator); var hasher = provider.GetRequiredService>() as PasswordHasher; Assert.NotNull(hasher); } [Fact] public void EnsureDefaultTokenProviders() { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); services.AddIdentity().AddDefaultTokenProviders(); var provider = services.BuildServiceProvider(); var tokenProviders = provider.GetRequiredService>().Value.Tokens.ProviderMap.Values; Assert.Equal(4, tokenProviders.Count()); } [Fact] public void AddManagerWithWrongTypesThrows() { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); var builder = services.AddIdentity(); Assert.Throws(() => builder.AddUserManager>()); Assert.Throws(() => builder.AddRoleManager>()); Assert.Throws(() => builder.AddSignInManager>()); Assert.Throws(() => builder.AddUserManager()); Assert.Throws(() => builder.AddRoleManager()); Assert.Throws(() => builder.AddSignInManager()); } [Fact] public void AddTokenProviderWithWrongTypesThrows() { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); var builder = services.AddIdentity(); Assert.Throws(() => builder.AddTokenProvider("whatevs")); Assert.Throws(() => builder.AddTokenProvider("whatevs", typeof(object))); } private class MyUberThingy : IUserValidator, IPasswordValidator, IRoleValidator, IUserStore, IRoleStore { public Task CreateAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } public Task CreateAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } public Task DeleteAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } public Task DeleteAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } public void Dispose() { throw new NotImplementedException(); } public Task FindByIdAsync(string userId, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } public Task FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } public Task GetNormalizedRoleNameAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } public Task GetNormalizedUserNameAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } public Task GetRoleIdAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } public Task GetRoleNameAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } public Task GetUserIdAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } public Task GetUserNameAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } public Task SetNormalizedRoleNameAsync(TestRole role, string normalizedName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } public Task SetNormalizedUserNameAsync(TestUser user, string normalizedName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } public Task SetRoleNameAsync(TestRole role, string roleName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } public Task SetUserNameAsync(TestUser user, string userName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } public Task UpdateAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } public Task UpdateAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } public Task ValidateAsync(RoleManager manager, TestRole role) { throw new NotImplementedException(); } public Task ValidateAsync(UserManager manager, TestUser user) { throw new NotImplementedException(); } public Task ValidateAsync(UserManager manager, TestUser user, string password) { throw new NotImplementedException(); } Task IRoleStore.FindByIdAsync(string roleId, CancellationToken cancellationToken) { throw new NotImplementedException(); } Task IRoleStore.FindByNameAsync(string roleName, CancellationToken cancellationToken) { throw new NotImplementedException(); } } private class MySignInManager : SignInManager { public MySignInManager(UserManager manager, IHttpContextAccessor context, IUserClaimsPrincipalFactory claimsFactory) : base(manager, context, claimsFactory, null, null, null) { } } private class MyUserManager : UserManager { public MyUserManager(IUserStore store) : base(store, null, null, null, null, null, null, null, null) { } } private class MyClaimsPrincipalFactory : UserClaimsPrincipalFactory { public MyClaimsPrincipalFactory(UserManager userManager, RoleManager roleManager, IOptions optionsAccessor) : base(userManager, roleManager, optionsAccessor) { } } private class MyRoleManager : RoleManager { public MyRoleManager(IRoleStore store, IEnumerable> roleValidators) : base(store, null, null, null, null, null) { } } } }