More DI-ify identity

Follow K patterns for DI
- IdentityBuilder
- IServiceProvider constructor
- Unit tests for Startup usage/new DI builder
- Move template default configuration into DefaultServices
This commit is contained in:
Hao Kung 2014-04-22 13:31:23 -07:00
parent 389678042f
commit d827b9fff2
21 changed files with 727 additions and 98 deletions

View File

@ -2,6 +2,10 @@
"version": "0.1-alpha-*",
"dependencies": {
"Microsoft.AspNet.Identity": "0.1-alpha-*",
"Microsoft.AspNet.Abstractions" : "0.1-alpha-*",
"Microsoft.AspNet.ConfigurationModel" : "0.1-alpha-*",
"Microsoft.AspNet.DependencyInjection" : "0.1-alpha-*",
"Microsoft.AspNet.RequestContainer" : "0.1-alpha-*",
"System.Security.Claims": "0.1-alpha-*"
},
"configurations": {

View File

@ -17,7 +17,6 @@ namespace Microsoft.AspNet.Identity.Security
public UserManager<TUser> UserManager { get; set; }
public HttpContext Context { get; set; }
public virtual async Task<ClaimsIdentity> CreateUserIdentityAsync(TUser user)
{
if (UserManager == null)

View File

@ -0,0 +1,71 @@
using Microsoft.AspNet.DependencyInjection;
using System;
namespace Microsoft.AspNet.Identity
{
public class IdentityBuilder<TUser, TRole> where TUser : class where TRole : class
{
private ServiceCollection Services { get; set; }
public IdentityBuilder(ServiceCollection services)
{
Services = services;
}
public IdentityBuilder<TUser, TRole> Use<T>(Func<T> func)
{
Services.AddInstance<T>(func());
return this;
}
public IdentityBuilder<TUser, TRole> UseIdentity()
{
Services.Add(IdentityServices.GetDefaultUserServices<TUser>());
Services.Add(IdentityServices.GetDefaultRoleServices<TRole>());
return this;
}
public IdentityBuilder<TUser, TRole> UseUserStore(Func<IUserStore<TUser>> func)
{
return Use(func);
}
public IdentityBuilder<TUser, TRole> UseRoleStore(Func<IRoleStore<TRole>> func)
{
return Use(func);
}
public IdentityBuilder<TUser, TRole> UsePasswordValidator(Func<IPasswordValidator> func)
{
return Use(func);
}
public IdentityBuilder<TUser, TRole> UseUserValidator(Func<IUserValidator<TUser>> func)
{
return Use(func);
}
public IdentityBuilder<TUser, TRole> UseUserManager<TManager>() where TManager : UserManager<TUser>
{
Services.AddScoped<TManager, TManager>();
return this;
}
public IdentityBuilder<TUser, TRole> UseRoleManager<TManager>() where TManager : RoleManager<TRole>
{
Services.AddScoped<TManager, TManager>();
return this;
}
//public IdentityBuilder<TUser, TRole> UseTwoFactorProviders(Func<IDictionary<string, IUserTokenProvider<TUser>>> func)
//{
// return Use(func);
//}
public IdentityBuilder<TUser, TRole> UseLockoutPolicy(Func<LockoutPolicy> func)
{
return Use(func);
}
}
}

View File

@ -0,0 +1,27 @@
using Microsoft.AspNet.Identity;
using System;
namespace Microsoft.AspNet.DependencyInjection
{
public static class IdentityServiceCollectionExtensions
{
public static ServiceCollection AddIdentity<TUser, TRole>(this ServiceCollection services, Action<IdentityBuilder<TUser, TRole>> actionBuilder)
where TUser : class
where TRole : class
{
services.Add(IdentityServices.GetDefaultUserServices<TUser>());
services.Add(IdentityServices.GetDefaultRoleServices<TRole>());
actionBuilder(new IdentityBuilder<TUser, TRole>(services));
return services;
}
public static ServiceCollection AddIdentity<TUser>(this ServiceCollection services, Action<IdentityBuilder<TUser, IdentityRole>> actionBuilder)
where TUser : class
{
services.Add(IdentityServices.GetDefaultUserServices<TUser>());
services.Add(IdentityServices.GetDefaultRoleServices<IdentityRole>());
actionBuilder(new IdentityBuilder<TUser, IdentityRole>(services));
return services;
}
}
}

View File

@ -0,0 +1,59 @@
using Microsoft.AspNet.ConfigurationModel;
using Microsoft.AspNet.DependencyInjection;
using System;
using System.Collections.Generic;
namespace Microsoft.AspNet.Identity
{
/// <summary>
/// Default services used by UserManager and RoleManager
/// </summary>
public class IdentityServices
{
public static IEnumerable<IServiceDescriptor> GetDefaultUserServices<TUser>() where TUser : class
{
return GetDefaultUserServices<TUser>(new Configuration());
}
public static IEnumerable<IServiceDescriptor> GetDefaultUserServices<TUser>(IConfiguration configuration) where TUser : class
{
var describe = new ServiceDescriber(configuration);
// TODO: review defaults for validators should get picked up from config?
yield return describe.Instance<IUserValidator<TUser>>(new UserValidator<TUser>());
yield return describe.Instance<IPasswordValidator>(new PasswordValidator()
{
RequiredLength = 6,
RequireDigit = true,
RequireLowercase = true,
RequireNonLetterOrDigit = true,
RequireUppercase = true
});
yield return describe.Instance<IPasswordHasher>(new PasswordHasher());
yield return describe.Instance<IClaimsIdentityFactory<TUser>>(new ClaimsIdentityFactory<TUser>());
yield return describe.Instance<LockoutPolicy>(new LockoutPolicy
{
UserLockoutEnabledByDefault = false,
DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5),
MaxFailedAccessAttemptsBeforeLockout = 5
});
// TODO: rationalize email/sms/usertoken services
// TODO: configure lockout from config?
}
public static IEnumerable<IServiceDescriptor> GetDefaultRoleServices<TRole>() where TRole : class
{
return GetDefaultRoleServices<TRole>(new Configuration());
}
public static IEnumerable<IServiceDescriptor> GetDefaultRoleServices<TRole>(IConfiguration configuration) where TRole : class
{
var describe = new ServiceDescriber(configuration);
// TODO: review defaults for validators should get picked up from config?
yield return describe.Instance<IRoleValidator<TRole>>(new RoleValidator<TRole>());
}
}
}

View File

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Microsoft.AspNet.Identity
{
/// <summary>
/// Configuration for lockout
/// </summary>
public class LockoutPolicy
{
/// <summary>
/// If true, will enable user lockout when users are created
/// </summary>
public bool UserLockoutEnabledByDefault { get; set; }
/// <summary>
/// Number of access attempts allowed for a user before lockout (if enabled)
/// </summary>
public int MaxFailedAccessAttemptsBeforeLockout { get; set; }
/// <summary>
/// Default amount of time an user is locked out for after MaxFailedAccessAttempsBeforeLockout is reached
/// </summary>
public TimeSpan DefaultAccountLockoutTimeSpan { get; set; }
}
}

View File

@ -2,6 +2,8 @@ using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNet.DependencyInjection;
using Microsoft.AspNet.DependencyInjection.Fallback;
namespace Microsoft.AspNet.Identity
{
@ -13,6 +15,11 @@ namespace Microsoft.AspNet.Identity
{
private bool _disposed;
public RoleManager(IServiceProvider services)
{
Initialize(services);
}
/// <summary>
/// Constructor
/// </summary>
@ -23,8 +30,9 @@ namespace Microsoft.AspNet.Identity
{
throw new ArgumentNullException("store");
}
Store = store;
RoleValidator = new RoleValidator<TRole>();
var services = new ServiceCollection { IdentityServices.GetDefaultRoleServices<TRole>() };
services.AddInstance<IRoleStore<TRole>>(store);
Initialize(services.BuildServiceProvider());
}
/// <summary>
@ -65,6 +73,21 @@ namespace Microsoft.AspNet.Identity
}
}
public void Initialize(IServiceProvider services)
{
if (services == null)
{
throw new ArgumentNullException("services");
}
Store = services.GetService<IRoleStore<TRole>>();
if (Store == null)
{
// TODO: what is the right way to enforce required services
throw new InvalidOperationException();
}
RoleValidator = services.GetService<IRoleValidator<TRole>>();
}
/// <summary>
/// Dispose this object
/// </summary>

View File

@ -7,6 +7,7 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNet.DependencyInjection;
using Microsoft.AspNet.DependencyInjection.Fallback;
namespace Microsoft.AspNet.Identity
{
@ -23,25 +24,18 @@ namespace Microsoft.AspNet.Identity
private TimeSpan _defaultLockout = TimeSpan.Zero;
private bool _disposed;
private IPasswordHasher _passwordHasher;
private LockoutPolicy _lockoutPolicy;
// Needed for mock unit tests
public UserManager() { }
/// <summary>
/// Constructor which takes a service provider to find the default interfaces to hook up
/// Constructor which takes a service provider
/// </summary>
/// <param name="serviceProvider"></param>
public UserManager(IServiceProvider serviceProvider)
{
if (serviceProvider == null)
{
throw new ArgumentNullException("serviceProvider");
}
PasswordHasher = serviceProvider.GetService<IPasswordHasher>();
UserValidator = serviceProvider.GetService<IUserValidator<TUser>>();
PasswordValidator = serviceProvider.GetService<IPasswordValidator>();
ClaimsIdentityFactory = serviceProvider.GetService<IClaimsIdentityFactory<TUser>>();
Store = serviceProvider.GetService<IUserStore<TUser>>();
// TODO: maybe each optional store as well? Email and SMS services?
Initialize(serviceProvider);
}
/// <summary>
@ -54,10 +48,29 @@ namespace Microsoft.AspNet.Identity
{
throw new ArgumentNullException("store");
}
Store = store;
UserValidator = new UserValidator<TUser>();
PasswordHasher = new PasswordHasher();
ClaimsIdentityFactory = new ClaimsIdentityFactory<TUser>();
var services = new ServiceCollection { IdentityServices.GetDefaultUserServices<TUser>() };
services.AddInstance<IUserStore<TUser>>(store);
Initialize(services.BuildServiceProvider());
}
public void Initialize(IServiceProvider serviceProvider)
{
if (serviceProvider == null)
{
throw new ArgumentNullException("serviceProvider");
}
PasswordHasher = serviceProvider.GetService<IPasswordHasher>();
UserValidator = serviceProvider.GetService<IUserValidator<TUser>>();
PasswordValidator = serviceProvider.GetService<IPasswordValidator>();
ClaimsIdentityFactory = serviceProvider.GetService<IClaimsIdentityFactory<TUser>>();
LockoutPolicy = serviceProvider.GetService<LockoutPolicy>();
Store = serviceProvider.GetService<IUserStore<TUser>>();
if (Store == null)
{
// TODO: what is the right way to enforce required services
throw new InvalidOperationException();
}
// TODO: Email/Sms/Token services
}
/// <summary>
@ -132,23 +145,30 @@ namespace Microsoft.AspNet.Identity
/// </summary>
public IUserTokenProvider<TUser> UserTokenProvider { get; set; }
/// <summary>
/// If true, will enable user lockout when users are created
/// </summary>
public bool UserLockoutEnabledByDefault { get; set; }
public LockoutPolicy LockoutPolicy { get; set; }
/// <summary>
/// Number of access attempts allowed for a user before lockout (if enabled)
/// </summary>
public int MaxFailedAccessAttemptsBeforeLockout { get; set; }
/// <summary>
/// Default amount of time an user is locked out for after MaxFailedAccessAttempsBeforeLockout is reached
/// </summary>
public TimeSpan DefaultAccountLockoutTimeSpan
private bool UserLockoutEnabledByDefault
{
get { return _defaultLockout; }
set { _defaultLockout = value; }
get
{
return LockoutPolicy != null && LockoutPolicy.UserLockoutEnabledByDefault;
}
}
private int MaxFailedAccessAttemptsBeforeLockout
{
get
{
return LockoutPolicy != null ? LockoutPolicy.MaxFailedAccessAttemptsBeforeLockout : 0;
}
}
private TimeSpan DefaultAccountLockoutTimeSpan
{
get
{
return LockoutPolicy != null ? LockoutPolicy.DefaultAccountLockoutTimeSpan : TimeSpan.FromMinutes(5);
}
}
/// <summary>

View File

@ -1,6 +1,7 @@
{
"version": "0.1-alpha-*",
"dependencies": {
"Microsoft.AspNet.ConfigurationModel": "0.1-alpha-*",
"Microsoft.AspNet.DependencyInjection" : "0.1-alpha-*",
"System.Security.Claims" : "0.1-alpha-*",
"Microsoft.AspNet.HttpFeature" : "0.1-alpha-*",

130
temp/Identity45.sln Normal file
View File

@ -0,0 +1,130 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.30408.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Identity.net45", "..\src\Microsoft.AspNet.Identity\Microsoft.AspNet.Identity.net45.csproj", "{4D061067-3FE9-442D-81D3-29658DA2FF8F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{31019886-9CDA-4072-B3D9-E513122CECD0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Identity.Entity.net45", "..\src\Microsoft.AspNet.Identity.Entity\Microsoft.AspNet.Identity.Entity.net45.csproj", "{1832A433-ABB4-4D87-B7CE-E80E9A3E8CA7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Identity.InMemory.net45", "..\src\Microsoft.AspNet.Identity.InMemory\Microsoft.AspNet.Identity.InMemory.net45.csproj", "{173CABE9-9FDF-43A0-AF9B-409F8AA2BE56}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Identity.Security.net45", "..\src\Microsoft.AspNet.Identity.Security\Microsoft.AspNet.Identity.Security.net45.csproj", "{720B2280-085C-441D-98CD-B241145A1C12}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{394C0E59-7E24-453E-993C-7B914C62110A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Identity.Test.net45", "..\test\Microsoft.AspNet.Identity.Test\Microsoft.AspNet.Identity.Test.net45.csproj", "{B3A5D740-2C31-4EBC-AADB-356263965C1F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Identity.Security.Test.net45", "..\test\Microsoft.AspNet.Identity.Security.Test\Microsoft.AspNet.Identity.Security.Test.net45.csproj", "{9F67914A-1F35-4068-A21A-F279C4053ADD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Identity.InMemory.Test.net45", "..\test\Microsoft.AspNet.Identity.InMemory.Test\Microsoft.AspNet.Identity.InMemory.Test.net45.csproj", "{E2154446-8A68-478B-927F-FD05251C8452}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Identity.Entity.Test.net45", "..\test\Microsoft.AspNet.Identity.Entity.Test\Microsoft.AspNet.Identity.Entity.Test.net45.csproj", "{CFCEFA4C-548D-459A-A051-1DBE3F2FF91F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|Mixed Platforms = Debug|Mixed Platforms
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|Mixed Platforms = Release|Mixed Platforms
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{4D061067-3FE9-442D-81D3-29658DA2FF8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4D061067-3FE9-442D-81D3-29658DA2FF8F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4D061067-3FE9-442D-81D3-29658DA2FF8F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{4D061067-3FE9-442D-81D3-29658DA2FF8F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{4D061067-3FE9-442D-81D3-29658DA2FF8F}.Debug|x86.ActiveCfg = Debug|Any CPU
{4D061067-3FE9-442D-81D3-29658DA2FF8F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4D061067-3FE9-442D-81D3-29658DA2FF8F}.Release|Any CPU.Build.0 = Release|Any CPU
{4D061067-3FE9-442D-81D3-29658DA2FF8F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{4D061067-3FE9-442D-81D3-29658DA2FF8F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{4D061067-3FE9-442D-81D3-29658DA2FF8F}.Release|x86.ActiveCfg = Release|Any CPU
{1832A433-ABB4-4D87-B7CE-E80E9A3E8CA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1832A433-ABB4-4D87-B7CE-E80E9A3E8CA7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1832A433-ABB4-4D87-B7CE-E80E9A3E8CA7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{1832A433-ABB4-4D87-B7CE-E80E9A3E8CA7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{1832A433-ABB4-4D87-B7CE-E80E9A3E8CA7}.Debug|x86.ActiveCfg = Debug|Any CPU
{1832A433-ABB4-4D87-B7CE-E80E9A3E8CA7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1832A433-ABB4-4D87-B7CE-E80E9A3E8CA7}.Release|Any CPU.Build.0 = Release|Any CPU
{1832A433-ABB4-4D87-B7CE-E80E9A3E8CA7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{1832A433-ABB4-4D87-B7CE-E80E9A3E8CA7}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{1832A433-ABB4-4D87-B7CE-E80E9A3E8CA7}.Release|x86.ActiveCfg = Release|Any CPU
{173CABE9-9FDF-43A0-AF9B-409F8AA2BE56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{173CABE9-9FDF-43A0-AF9B-409F8AA2BE56}.Debug|Any CPU.Build.0 = Debug|Any CPU
{173CABE9-9FDF-43A0-AF9B-409F8AA2BE56}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{173CABE9-9FDF-43A0-AF9B-409F8AA2BE56}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{173CABE9-9FDF-43A0-AF9B-409F8AA2BE56}.Debug|x86.ActiveCfg = Debug|Any CPU
{173CABE9-9FDF-43A0-AF9B-409F8AA2BE56}.Release|Any CPU.ActiveCfg = Release|Any CPU
{173CABE9-9FDF-43A0-AF9B-409F8AA2BE56}.Release|Any CPU.Build.0 = Release|Any CPU
{173CABE9-9FDF-43A0-AF9B-409F8AA2BE56}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{173CABE9-9FDF-43A0-AF9B-409F8AA2BE56}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{173CABE9-9FDF-43A0-AF9B-409F8AA2BE56}.Release|x86.ActiveCfg = Release|Any CPU
{720B2280-085C-441D-98CD-B241145A1C12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{720B2280-085C-441D-98CD-B241145A1C12}.Debug|Any CPU.Build.0 = Debug|Any CPU
{720B2280-085C-441D-98CD-B241145A1C12}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{720B2280-085C-441D-98CD-B241145A1C12}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{720B2280-085C-441D-98CD-B241145A1C12}.Debug|x86.ActiveCfg = Debug|Any CPU
{720B2280-085C-441D-98CD-B241145A1C12}.Release|Any CPU.ActiveCfg = Release|Any CPU
{720B2280-085C-441D-98CD-B241145A1C12}.Release|Any CPU.Build.0 = Release|Any CPU
{720B2280-085C-441D-98CD-B241145A1C12}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{720B2280-085C-441D-98CD-B241145A1C12}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{720B2280-085C-441D-98CD-B241145A1C12}.Release|x86.ActiveCfg = Release|Any CPU
{B3A5D740-2C31-4EBC-AADB-356263965C1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B3A5D740-2C31-4EBC-AADB-356263965C1F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B3A5D740-2C31-4EBC-AADB-356263965C1F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{B3A5D740-2C31-4EBC-AADB-356263965C1F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{B3A5D740-2C31-4EBC-AADB-356263965C1F}.Debug|x86.ActiveCfg = Debug|Any CPU
{B3A5D740-2C31-4EBC-AADB-356263965C1F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B3A5D740-2C31-4EBC-AADB-356263965C1F}.Release|Any CPU.Build.0 = Release|Any CPU
{B3A5D740-2C31-4EBC-AADB-356263965C1F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{B3A5D740-2C31-4EBC-AADB-356263965C1F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{B3A5D740-2C31-4EBC-AADB-356263965C1F}.Release|x86.ActiveCfg = Release|Any CPU
{9F67914A-1F35-4068-A21A-F279C4053ADD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9F67914A-1F35-4068-A21A-F279C4053ADD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9F67914A-1F35-4068-A21A-F279C4053ADD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{9F67914A-1F35-4068-A21A-F279C4053ADD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{9F67914A-1F35-4068-A21A-F279C4053ADD}.Debug|x86.ActiveCfg = Debug|Any CPU
{9F67914A-1F35-4068-A21A-F279C4053ADD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9F67914A-1F35-4068-A21A-F279C4053ADD}.Release|Any CPU.Build.0 = Release|Any CPU
{9F67914A-1F35-4068-A21A-F279C4053ADD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{9F67914A-1F35-4068-A21A-F279C4053ADD}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{9F67914A-1F35-4068-A21A-F279C4053ADD}.Release|x86.ActiveCfg = Release|Any CPU
{E2154446-8A68-478B-927F-FD05251C8452}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E2154446-8A68-478B-927F-FD05251C8452}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E2154446-8A68-478B-927F-FD05251C8452}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{E2154446-8A68-478B-927F-FD05251C8452}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{E2154446-8A68-478B-927F-FD05251C8452}.Debug|x86.ActiveCfg = Debug|Any CPU
{E2154446-8A68-478B-927F-FD05251C8452}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E2154446-8A68-478B-927F-FD05251C8452}.Release|Any CPU.Build.0 = Release|Any CPU
{E2154446-8A68-478B-927F-FD05251C8452}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{E2154446-8A68-478B-927F-FD05251C8452}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{E2154446-8A68-478B-927F-FD05251C8452}.Release|x86.ActiveCfg = Release|Any CPU
{CFCEFA4C-548D-459A-A051-1DBE3F2FF91F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CFCEFA4C-548D-459A-A051-1DBE3F2FF91F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CFCEFA4C-548D-459A-A051-1DBE3F2FF91F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{CFCEFA4C-548D-459A-A051-1DBE3F2FF91F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{CFCEFA4C-548D-459A-A051-1DBE3F2FF91F}.Debug|x86.ActiveCfg = Debug|Any CPU
{CFCEFA4C-548D-459A-A051-1DBE3F2FF91F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CFCEFA4C-548D-459A-A051-1DBE3F2FF91F}.Release|Any CPU.Build.0 = Release|Any CPU
{CFCEFA4C-548D-459A-A051-1DBE3F2FF91F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{CFCEFA4C-548D-459A-A051-1DBE3F2FF91F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{CFCEFA4C-548D-459A-A051-1DBE3F2FF91F}.Release|x86.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{4D061067-3FE9-442D-81D3-29658DA2FF8F} = {31019886-9CDA-4072-B3D9-E513122CECD0}
{1832A433-ABB4-4D87-B7CE-E80E9A3E8CA7} = {31019886-9CDA-4072-B3D9-E513122CECD0}
{173CABE9-9FDF-43A0-AF9B-409F8AA2BE56} = {31019886-9CDA-4072-B3D9-E513122CECD0}
{720B2280-085C-441D-98CD-B241145A1C12} = {31019886-9CDA-4072-B3D9-E513122CECD0}
{B3A5D740-2C31-4EBC-AADB-356263965C1F} = {394C0E59-7E24-453E-993C-7B914C62110A}
{9F67914A-1F35-4068-A21A-F279C4053ADD} = {394C0E59-7E24-453E-993C-7B914C62110A}
{E2154446-8A68-478B-927F-FD05251C8452} = {394C0E59-7E24-453E-993C-7B914C62110A}
{CFCEFA4C-548D-459A-A051-1DBE3F2FF91F} = {394C0E59-7E24-453E-993C-7B914C62110A}
EndGlobalSection
EndGlobal

View File

@ -81,7 +81,12 @@ namespace Microsoft.AspNet.Identity.Entity.Test
public static UserManager<EntityUser> CreateManager(EntityContext context)
{
return new UserManager<EntityUser>(new UserStore(context));
var manager = new UserManager<EntityUser>(new UserStore(context))
{
UserValidator = new UserValidator<EntityUser>(),
PasswordValidator = new PasswordValidator()
};
return manager;
}
public static UserManager<EntityUser> CreateManager()

View File

@ -16,6 +16,58 @@ namespace Microsoft.AspNet.Identity.Entity.Test
{
public class UserStoreTest
{
class ApplicationUserManager : UserManager<EntityUser>
{
public ApplicationUserManager(IServiceProvider services) : base(services) { }
}
[Fact]
public async Task CanUseAddedManagerInstance()
{
var services = new ServiceCollection();
var store = new UserStore(new IdentityContext());
services.AddInstance<UserManager<EntityUser>>(new UserManager<EntityUser>(store));
var provider = services.BuildServiceProvider();
var manager = provider.GetService<UserManager<EntityUser>>();
Assert.NotNull(manager);
IdentityResultAssert.IsSuccess(await manager.CreateAsync(new EntityUser("hello")));
}
[Fact]
public async Task CanUseSingletonManagerInstance()
{
var services = new ServiceCollection();
var store = new UserStore(new IdentityContext());
services.AddIdentity<EntityUser, EntityRole>(s =>
{
s.UseUserStore(() => store);
s.UseUserManager<ApplicationUserManager>();
});
//services.AddSingleton<ApplicationUserManager, ApplicationUserManager>();
var provider = services.BuildServiceProvider();
var manager = provider.GetService<ApplicationUserManager>();
Assert.NotNull(manager);
IdentityResultAssert.IsSuccess(await manager.CreateAsync(new EntityUser("hello")));
}
//[Fact]
//public async Task CanUseSingletonGenericManagerInstance()
//{
// var services = new ServiceCollection();
// var store = new UserStore(new IdentityContext());
// services.AddIdentity<EntityUser>(s =>
// {
// s.UseStore(() => store);
// s.UseManager<UserManager<EntityUser>>();
// });
// var provider = services.BuildServiceProvider();
// var manager = provider.GetService<UserManager<EntityUser>>();
// Assert.NotNull(manager);
// IdentityResultAssert.IsSuccess(await manager.CreateAsync(new EntityUser("hello")));
//}
[Fact]
public async Task UserStoreMethodsThrowWhenDisposedTest()
{
@ -723,8 +775,11 @@ namespace Microsoft.AspNet.Identity.Entity.Test
public async Task SingleFailureLockout()
{
var mgr = TestIdentityFactory.CreateManager();
mgr.DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1);
mgr.UserLockoutEnabledByDefault = true;
mgr.LockoutPolicy = new LockoutPolicy
{
DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1),
UserLockoutEnabledByDefault = true,
};
var user = new EntityUser("fastLockout");
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
Assert.True(await mgr.GetLockoutEnabledAsync(user));
@ -740,9 +795,12 @@ namespace Microsoft.AspNet.Identity.Entity.Test
public async Task TwoFailureLockout()
{
var mgr = TestIdentityFactory.CreateManager();
mgr.DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1);
mgr.UserLockoutEnabledByDefault = true;
mgr.MaxFailedAccessAttemptsBeforeLockout = 2;
mgr.LockoutPolicy = new LockoutPolicy
{
DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1),
UserLockoutEnabledByDefault = true,
MaxFailedAccessAttemptsBeforeLockout = 2
};
var user = new EntityUser("twoFailureLockout");
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
Assert.True(await mgr.GetLockoutEnabledAsync(user));
@ -762,9 +820,12 @@ namespace Microsoft.AspNet.Identity.Entity.Test
public async Task ResetAccessCountPreventsLockout()
{
var mgr = TestIdentityFactory.CreateManager();
mgr.DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1);
mgr.UserLockoutEnabledByDefault = true;
mgr.MaxFailedAccessAttemptsBeforeLockout = 2;
mgr.LockoutPolicy = new LockoutPolicy
{
DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1),
UserLockoutEnabledByDefault = true,
MaxFailedAccessAttemptsBeforeLockout = 2
};
var user = new EntityUser("resetLockout");
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
Assert.True(await mgr.GetLockoutEnabledAsync(user));
@ -788,8 +849,11 @@ namespace Microsoft.AspNet.Identity.Entity.Test
public async Task CanEnableLockoutManuallyAndLockout()
{
var mgr = TestIdentityFactory.CreateManager();
mgr.DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1);
mgr.MaxFailedAccessAttemptsBeforeLockout = 2;
mgr.LockoutPolicy = new LockoutPolicy
{
DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1),
MaxFailedAccessAttemptsBeforeLockout = 2
};
var user = new EntityUser("manualLockout");
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
Assert.False(await mgr.GetLockoutEnabledAsync(user));
@ -812,7 +876,10 @@ namespace Microsoft.AspNet.Identity.Entity.Test
public async Task UserNotLockedOutWithNullDateTimeAndIsSetToNullDate()
{
var mgr = TestIdentityFactory.CreateManager();
mgr.UserLockoutEnabledByDefault = true;
mgr.LockoutPolicy = new LockoutPolicy
{
UserLockoutEnabledByDefault = true,
};
var user = new EntityUser("LockoutTest");
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
Assert.True(await mgr.GetLockoutEnabledAsync(user));
@ -840,7 +907,10 @@ namespace Microsoft.AspNet.Identity.Entity.Test
public async Task LockoutEndToUtcNowMinus1SecInUserShouldNotBeLockedOut()
{
var mgr = TestIdentityFactory.CreateManager();
mgr.UserLockoutEnabledByDefault = true;
mgr.LockoutPolicy = new LockoutPolicy
{
UserLockoutEnabledByDefault = true,
};
var user = new EntityUser("LockoutUtcNowTest") { LockoutEnd = DateTime.UtcNow.AddSeconds(-1) };
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
Assert.True(await mgr.GetLockoutEnabledAsync(user));
@ -852,7 +922,10 @@ namespace Microsoft.AspNet.Identity.Entity.Test
public async Task LockoutEndToUtcNowSubOneSecondWithManagerShouldNotBeLockedOut()
{
var mgr = TestIdentityFactory.CreateManager();
mgr.UserLockoutEnabledByDefault = true;
mgr.LockoutPolicy = new LockoutPolicy
{
UserLockoutEnabledByDefault = true,
};
var user = new EntityUser("LockoutUtcNowTest");
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
Assert.True(await mgr.GetLockoutEnabledAsync(user));
@ -865,7 +938,10 @@ namespace Microsoft.AspNet.Identity.Entity.Test
public async Task LockoutEndToUtcNowPlus5ShouldBeLockedOut()
{
var mgr = TestIdentityFactory.CreateManager();
mgr.UserLockoutEnabledByDefault = true;
mgr.LockoutPolicy = new LockoutPolicy
{
UserLockoutEnabledByDefault = true,
};
var user = new EntityUser("LockoutUtcNowTest") { LockoutEnd = DateTime.UtcNow.AddMinutes(5) };
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
Assert.True(await mgr.GetLockoutEnabledAsync(user));
@ -877,7 +953,10 @@ namespace Microsoft.AspNet.Identity.Entity.Test
public async Task UserLockedOutWithDateTimeLocalKindNowPlus30()
{
var mgr = TestIdentityFactory.CreateManager();
mgr.UserLockoutEnabledByDefault = true;
mgr.LockoutPolicy = new LockoutPolicy
{
UserLockoutEnabledByDefault = true,
};
var user = new EntityUser("LockoutTest");
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
Assert.True(await mgr.GetLockoutEnabledAsync(user));

View File

@ -6,14 +6,15 @@
"Microsoft.AspNet.ConfigurationModel": "0.1-alpha-*",
"Microsoft.AspNet.Identity": "",
"Microsoft.AspNet.Identity.Entity": "",
"Microsoft.AspNet.DependencyInjection": "0.1-alpha-*",
"Microsoft.AspNet.PipelineCore": "0.1-alpha-*",
"Microsoft.AspNet.Logging": "0.1-alpha-*",
"Microsoft.AspNet.RequestContainer": "0.1-alpha-*",
"Microsoft.AspNet.Security.DataProtection": "0.1-alpha-*",
"Microsoft.AspNet.Testing": "0.1-alpha-*",
"Microsoft.Data.Entity": "0.1-alpha-*",
"Microsoft.Data.InMemory": "0.1-alpha-*",
"Microsoft.Data.Relational": "0.1-alpha-*",
"Microsoft.Data.SqlServer": "0.1-pre-*",
"Remotion.Linq": "1.16-alpha",
"System.Security.Claims": "0.1-alpha-*",
"Xunit.KRunner": "0.1-alpha-*",
"xunit.abstractions": "2.0.0-aspnet-*",

View File

@ -559,8 +559,11 @@ namespace Microsoft.AspNet.Identity.InMemory.Test
public async Task SingleFailureLockout()
{
var mgr = CreateManager();
mgr.DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1);
mgr.UserLockoutEnabledByDefault = true;
mgr.LockoutPolicy = new LockoutPolicy
{
DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1),
UserLockoutEnabledByDefault = true
};
var user = new IdentityUser("fastLockout");
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
Assert.True(await mgr.GetLockoutEnabledAsync(user));
@ -576,9 +579,12 @@ namespace Microsoft.AspNet.Identity.InMemory.Test
public async Task TwoFailureLockout()
{
var mgr = CreateManager();
mgr.DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1);
mgr.UserLockoutEnabledByDefault = true;
mgr.MaxFailedAccessAttemptsBeforeLockout = 2;
mgr.LockoutPolicy = new LockoutPolicy
{
DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1),
UserLockoutEnabledByDefault = true,
MaxFailedAccessAttemptsBeforeLockout = 2
};
var user = new IdentityUser("twoFailureLockout");
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
Assert.True(await mgr.GetLockoutEnabledAsync(user));
@ -598,9 +604,12 @@ namespace Microsoft.AspNet.Identity.InMemory.Test
public async Task ResetAccessCountPreventsLockout()
{
var mgr = CreateManager();
mgr.DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1);
mgr.UserLockoutEnabledByDefault = true;
mgr.MaxFailedAccessAttemptsBeforeLockout = 2;
mgr.LockoutPolicy = new LockoutPolicy
{
DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1),
UserLockoutEnabledByDefault = true,
MaxFailedAccessAttemptsBeforeLockout = 2
};
var user = new IdentityUser("resetLockout");
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
Assert.True(await mgr.GetLockoutEnabledAsync(user));
@ -624,8 +633,11 @@ namespace Microsoft.AspNet.Identity.InMemory.Test
public async Task CanEnableLockoutManuallyAndLockout()
{
var mgr = CreateManager();
mgr.DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1);
mgr.MaxFailedAccessAttemptsBeforeLockout = 2;
mgr.LockoutPolicy = new LockoutPolicy
{
DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1),
MaxFailedAccessAttemptsBeforeLockout = 2
};
var user = new IdentityUser("manualLockout");
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
Assert.False(await mgr.GetLockoutEnabledAsync(user));
@ -648,7 +660,10 @@ namespace Microsoft.AspNet.Identity.InMemory.Test
public async Task UserNotLockedOutWithNullDateTimeAndIsSetToNullDate()
{
var mgr = CreateManager();
mgr.UserLockoutEnabledByDefault = true;
mgr.LockoutPolicy = new LockoutPolicy
{
UserLockoutEnabledByDefault = true,
};
var user = new IdentityUser("LockoutTest");
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
Assert.True(await mgr.GetLockoutEnabledAsync(user));
@ -676,8 +691,11 @@ namespace Microsoft.AspNet.Identity.InMemory.Test
public async Task LockoutEndToUtcNowMinus1SecInUserShouldNotBeLockedOut()
{
var mgr = CreateManager();
mgr.UserLockoutEnabledByDefault = true;
var user = new IdentityUser("LockoutUtcNowTest") {LockoutEnd = DateTimeOffset.UtcNow.AddSeconds(-1)};
mgr.LockoutPolicy = new LockoutPolicy
{
UserLockoutEnabledByDefault = true,
};
var user = new IdentityUser("LockoutUtcNowTest") { LockoutEnd = DateTimeOffset.UtcNow.AddSeconds(-1) };
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
Assert.True(await mgr.GetLockoutEnabledAsync(user));
Assert.True(user.LockoutEnabled);
@ -688,7 +706,10 @@ namespace Microsoft.AspNet.Identity.InMemory.Test
public async Task LockoutEndToUtcNowSubOneSecondWithManagerShouldNotBeLockedOut()
{
var mgr = CreateManager();
mgr.UserLockoutEnabledByDefault = true;
mgr.LockoutPolicy = new LockoutPolicy
{
UserLockoutEnabledByDefault = true,
};
var user = new IdentityUser("LockoutUtcNowTest");
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
Assert.True(await mgr.GetLockoutEnabledAsync(user));
@ -701,8 +722,11 @@ namespace Microsoft.AspNet.Identity.InMemory.Test
public async Task LockoutEndToUtcNowPlus5ShouldBeLockedOut()
{
var mgr = CreateManager();
mgr.UserLockoutEnabledByDefault = true;
var user = new IdentityUser("LockoutUtcNowTest") {LockoutEnd = DateTimeOffset.UtcNow.AddMinutes(5)};
mgr.LockoutPolicy = new LockoutPolicy
{
UserLockoutEnabledByDefault = true,
};
var user = new IdentityUser("LockoutUtcNowTest") { LockoutEnd = DateTimeOffset.UtcNow.AddMinutes(5) };
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
Assert.True(await mgr.GetLockoutEnabledAsync(user));
Assert.True(user.LockoutEnabled);
@ -713,7 +737,10 @@ namespace Microsoft.AspNet.Identity.InMemory.Test
public async Task UserLockedOutWithDateTimeLocalKindNowPlus30()
{
var mgr = CreateManager();
mgr.UserLockoutEnabledByDefault = true;
mgr.LockoutPolicy = new LockoutPolicy
{
UserLockoutEnabledByDefault = true,
};
var user = new IdentityUser("LockoutTest");
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
Assert.True(await mgr.GetLockoutEnabledAsync(user));
@ -1431,7 +1458,12 @@ namespace Microsoft.AspNet.Identity.InMemory.Test
private static UserManager<IdentityUser> CreateManager()
{
return new UserManager<IdentityUser>(new InMemoryUserStore<IdentityUser>());
var manager = new UserManager<IdentityUser>(new InMemoryUserStore<IdentityUser>())
{
UserValidator = new UserValidator<IdentityUser>(),
PasswordValidator = new PasswordValidator()
};
return manager;
}
private static RoleManager<IdentityRole> CreateRoleManager()

View File

@ -0,0 +1,70 @@
using Microsoft.AspNet.Abstractions;
using Microsoft.AspNet.DependencyInjection;
using Microsoft.AspNet.DependencyInjection.Fallback;
using Microsoft.AspNet.PipelineCore;
using System;
using System.Threading.Tasks;
using Xunit;
namespace Microsoft.AspNet.Identity.InMemory.Test
{
public class StartupTest
{
[Fact]
public async Task EnsureStartupUsageWorks()
{
IBuilder builder = new Builder(new ServiceCollection().BuildServiceProvider());
builder.UseServices(services => services.AddIdentity<ApplicationUser>(s =>
{
s.UseUserStore(() => new InMemoryUserStore<ApplicationUser>());
s.UseUserManager<ApplicationUserManager>();
s.UseRoleStore(() => new InMemoryRoleStore<IdentityRole>());
s.UseRoleManager<ApplicationRoleManager>();
}));
var userStore = builder.ApplicationServices.GetService<IUserStore<ApplicationUser>>();
var roleStore = builder.ApplicationServices.GetService<IRoleStore<IdentityRole>>();
var userManager = builder.ApplicationServices.GetService<ApplicationUserManager>();
var roleManager = builder.ApplicationServices.GetService<ApplicationRoleManager>();
Assert.NotNull(userStore);
Assert.NotNull(userManager);
Assert.NotNull(roleStore);
Assert.NotNull(roleManager);
await CreateAdminUser(builder.ApplicationServices);
}
private static async Task CreateAdminUser(IServiceProvider serviceProvider)
{
const string userName = "admin";
const string roleName = "Admins";
const string password = "1qaz@WSX";
var userManager = serviceProvider.GetService<ApplicationUserManager>();
var roleManager = serviceProvider.GetService<ApplicationRoleManager>();
var user = new ApplicationUser { UserName = userName };
IdentityResultAssert.IsSuccess(await userManager.CreateAsync(user, password));
IdentityResultAssert.IsSuccess(await roleManager.CreateAsync(new IdentityRole { Name = roleName }));
IdentityResultAssert.IsSuccess(await userManager.AddToRoleAsync(user, roleName));
}
public class ApplicationUserManager : UserManager<ApplicationUser>
{
public ApplicationUserManager(IServiceProvider services) : base(services) { }
}
public class ApplicationRoleManager : RoleManager<IdentityRole>
{
public ApplicationRoleManager(IServiceProvider services) : base(services) { }
}
public class ApplicationUser : IdentityUser
{
}
}
}

View File

@ -1,9 +1,13 @@
{
"version": "0.1-alpha-*",
"dependencies": {
"Microsoft.AspNet.Identity" : "",
"Microsoft.AspNet.Identity.InMemory" : "",
"Microsoft.AspNet.Abstractions" : "0.1-alpha-*",
"Microsoft.AspNet.ConfigurationModel" : "0.1-alpha-*",
"Microsoft.AspNet.DependencyInjection" : "0.1-alpha-*",
"Microsoft.AspNet.Identity" : "0.1-alpha-*",
"Microsoft.AspNet.Identity.InMemory" : "0.1-alpha-*",
"Microsoft.AspNet.PipelineCore" : "0.1-alpha-*",
"Microsoft.AspNet.RequestContainer" : "0.1-alpha-*",
"Microsoft.AspNet.Testing" : "0.1-alpha-*",
"Xunit.KRunner": "0.1-alpha-*",
"xunit.abstractions": "2.0.0-aspnet-*",

View File

@ -0,0 +1,90 @@
using System.Security.Claims;
using Microsoft.AspNet.DependencyInjection;
using Microsoft.AspNet.DependencyInjection.Fallback;
using Xunit;
namespace Microsoft.AspNet.Identity.Test
{
public class IdentityBuilderTest
{
[Fact]
public void CanSpecifyUserValidatorInstance()
{
var services = new ServiceCollection();
var validator = new UserValidator<IdentityUser>();
services.AddIdentity<IdentityUser>(b => b.UseUserValidator(() => validator));
Assert.Equal(validator, services.BuildServiceProvider().GetService<IUserValidator<IdentityUser>>());
}
[Fact]
public void CanSpecifyPasswordValidatorInstance()
{
var services = new ServiceCollection();
var validator = new PasswordValidator();
services.AddIdentity<IdentityUser>(b => b.UsePasswordValidator(() => validator));
Assert.Equal(validator, services.BuildServiceProvider().GetService<IPasswordValidator>());
}
[Fact]
public void CanSpecifyLockoutPolicyInstance()
{
var services = new ServiceCollection();
var policy = new LockoutPolicy();
services.AddIdentity<IdentityUser>(b => b.UseLockoutPolicy(() => policy));
Assert.Equal(policy, services.BuildServiceProvider().GetService<LockoutPolicy>());
}
[Fact]
public void CanSpecifyPasswordHasherInstance()
{
CanOverride<IPasswordHasher, PasswordHasher>();
}
[Fact]
public void CanSpecifyClaimsIdentityFactoryInstance()
{
CanOverride<IClaimsIdentityFactory<IdentityUser>, ClaimsIdentityFactory<IdentityUser>>();
}
[Fact]
public void EnsureDefaultServices()
{
var services = new ServiceCollection();
var builder = new IdentityBuilder<IdentityUser, IdentityRole>(services);
builder.UseIdentity();
var provider = services.BuildServiceProvider();
var userValidator = provider.GetService<IUserValidator<IdentityUser>>() as UserValidator<IdentityUser>;
Assert.NotNull(userValidator);
Assert.True(userValidator.AllowOnlyAlphanumericUserNames);
Assert.False(userValidator.RequireUniqueEmail);
var pwdValidator = provider.GetService<IPasswordValidator>() as PasswordValidator;
Assert.NotNull(userValidator);
Assert.True(pwdValidator.RequireDigit);
Assert.True(pwdValidator.RequireLowercase);
Assert.True(pwdValidator.RequireNonLetterOrDigit);
Assert.True(pwdValidator.RequireUppercase);
Assert.Equal(6, pwdValidator.RequiredLength);
var hasher = provider.GetService<IPasswordHasher>() as PasswordHasher;
Assert.NotNull(hasher);
var claimsFactory = provider.GetService<IClaimsIdentityFactory<IdentityUser>>() as ClaimsIdentityFactory<IdentityUser>;
Assert.NotNull(claimsFactory);
Assert.Equal(ClaimTypes.Role, claimsFactory.RoleClaimType);
Assert.Equal(ClaimsIdentityFactory<IdentityUser>.DefaultSecurityStampClaimType, claimsFactory.SecurityStampClaimType);
Assert.Equal(ClaimTypes.Name, claimsFactory.UserNameClaimType);
Assert.Equal(ClaimTypes.NameIdentifier, claimsFactory.UserIdClaimType);
}
private static void CanOverride<TService, TImplementation>() where TImplementation : TService,new()
{
var services = new ServiceCollection();
var instance = new TImplementation();
services.AddIdentity<IdentityUser>(b => b.Use<TService>(() => instance));
Assert.Equal(instance, services.BuildServiceProvider().GetService<TService>());
}
}
}

View File

@ -11,7 +11,7 @@ namespace Microsoft.AspNet.Identity.Test
[Fact]
public void ConstructorThrowsWithNullStore()
{
Assert.Throws<ArgumentNullException>("store", () => new RoleManager<TestRole>(null));
Assert.Throws<ArgumentNullException>("store", () => new RoleManager<TestRole>((IRoleStore<TestRole>)null));
}
[Fact]
@ -34,8 +34,9 @@ namespace Microsoft.AspNet.Identity.Test
public async Task RoleManagerPublicNullChecks()
{
Assert.Throws<ArgumentNullException>("store",
() => new RoleManager<TestRole>(null));
() => new RoleManager<TestRole>((IRoleStore<TestRole>)null));
var manager = new RoleManager<TestRole>(new NotImplementedStore());
Assert.Throws<ArgumentNullException>("services", () => manager.Initialize(null));
await Assert.ThrowsAsync<ArgumentNullException>("role", async () => await manager.CreateAsync(null));
await Assert.ThrowsAsync<ArgumentNullException>("role", async () => await manager.UpdateAsync(null));
await Assert.ThrowsAsync<ArgumentNullException>("role", async () => await manager.DeleteAsync(null));

View File

@ -1,20 +0,0 @@
using Microsoft.AspNet.DependencyInjection;
using System.Collections.Generic;
namespace Microsoft.AspNet.Identity.Test
{
public static class TestServices
{
public static IEnumerable<IServiceDescriptor> DefaultServices<TUser, TKey>()
where TUser : class
{
var describer = new ServiceDescriber();
yield return describer.Transient<IPasswordValidator, PasswordValidator>();
yield return describer.Transient<IUserValidator<TUser>, UserValidator<TUser>>();
yield return describer.Transient<IPasswordHasher, PasswordHasher>();
yield return describer.Transient<IClaimsIdentityFactory<TUser>, ClaimsIdentityFactory<TUser>>();
yield return describer.Transient<IUserStore<TUser>, NoopUserStore>();
}
}
}

View File

@ -1,3 +1,4 @@
using Microsoft.AspNet.DependencyInjection;
using Microsoft.AspNet.DependencyInjection.Fallback;
using Moq;
using System;
@ -20,13 +21,19 @@ namespace Microsoft.AspNet.Identity.Test
}
[Fact]
public void ServiceProviderWireupTest()
public void EnsureDefaultServicesDefaultsWithStoreWorks()
{
var manager = new TestManager(TestServices.DefaultServices<TestUser, string>().BuildServiceProvider());
var services = new ServiceCollection {IdentityServices.GetDefaultUserServices<TestUser>()};
services.AddInstance<IUserStore<TestUser>>(new NoopUserStore());
var manager = new TestManager(services.BuildServiceProvider());
Assert.NotNull(manager.PasswordHasher);
Assert.NotNull(manager.PasswordValidator);
Assert.NotNull(manager.UserValidator);
Assert.NotNull(manager.StorePublic);
Assert.NotNull(manager.LockoutPolicy);
Assert.Equal(TimeSpan.FromMinutes(5), manager.LockoutPolicy.DefaultAccountLockoutTimeSpan);
Assert.Equal(5, manager.LockoutPolicy.MaxFailedAccessAttemptsBeforeLockout);
Assert.False(manager.LockoutPolicy.UserLockoutEnabledByDefault);
}
#if NET45
@ -419,13 +426,12 @@ namespace Microsoft.AspNet.Identity.Test
[Fact]
public async Task ManagerPublicNullChecks()
{
Assert.Throws<ArgumentNullException>("store",
() => new UserManager<TestUser>((IUserStore<TestUser>) null));
Assert.Throws<ArgumentNullException>("serviceProvider",
() => new UserManager<TestUser>((IServiceProvider)null));
var manager = new UserManager<TestUser>(new NotImplementedStore());
Assert.Throws<ArgumentNullException>(() => manager.ClaimsIdentityFactory = null);
Assert.Throws<ArgumentNullException>(() => manager.PasswordHasher = null);
Assert.Throws<ArgumentNullException>("serviceProvider", () => manager.Initialize(null));
await
Assert.ThrowsAsync<ArgumentNullException>("user",
async () => await manager.CreateIdentityAsync(null, "whatever"));

View File

@ -3,7 +3,7 @@
"dependencies": {
"Microsoft.AspNet.ConfigurationModel" : "0.1-alpha-*",
"Microsoft.AspNet.DependencyInjection" : "0.1-alpha-*",
"Microsoft.AspNet.Identity" : "",
"Microsoft.AspNet.Identity" : "0.1-alpha-*",
"Microsoft.AspNet.Testing" : "0.1-alpha-*",
"Xunit.KRunner": "0.1-alpha-*",
"xunit.abstractions": "2.0.0-aspnet-*",