Make IHttpContextAccessor Optional

This commit is contained in:
Hao Kung 2016-01-07 14:21:31 -08:00
parent 042588e1b2
commit 167bb54c8d
6 changed files with 29 additions and 13 deletions

View File

@ -41,7 +41,7 @@ namespace Microsoft.AspNet.Identity
{
throw new ArgumentNullException(nameof(userManager));
}
if (contextAccessor == null || contextAccessor.HttpContext == null)
if (contextAccessor == null)
{
throw new ArgumentNullException(nameof(contextAccessor));
}
@ -51,12 +51,15 @@ namespace Microsoft.AspNet.Identity
}
UserManager = userManager;
Context = contextAccessor.HttpContext;
_contextAccessor = contextAccessor;
ClaimsFactory = claimsFactory;
Options = optionsAccessor?.Value ?? new IdentityOptions();
Logger = logger;
}
private readonly IHttpContextAccessor _contextAccessor;
private HttpContext _context;
/// <summary>
/// Gets the <see cref="ILogger"/> used to log messages from the manager.
/// </summary>
@ -65,10 +68,26 @@ namespace Microsoft.AspNet.Identity
/// </value>
protected internal virtual ILogger Logger { get; set; }
protected internal UserManager<TUser> UserManager { get; set; }
internal HttpContext Context { get; set; }
internal IUserClaimsPrincipalFactory<TUser> ClaimsFactory { get; set; }
internal IdentityOptions Options { get; set; }
internal HttpContext Context {
get
{
var context = _context ?? _contextAccessor?.HttpContext;
if (context == null)
{
throw new InvalidOperationException("HttpContext must not be null.");
}
return context;
}
set
{
_context = value;
}
}
/// <summary>
/// Creates a <see cref="ClaimsPrincipal"/> for the specified <paramref name="user"/>, as an asynchronous operation.
/// </summary>

View File

@ -54,8 +54,7 @@ namespace Microsoft.AspNet.Identity
ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors,
IServiceProvider services,
ILogger<UserManager<TUser>> logger,
IHttpContextAccessor contextAccessor)
ILogger<UserManager<TUser>> logger)
{
if (store == null)
{
@ -63,7 +62,6 @@ namespace Microsoft.AspNet.Identity
}
Store = store;
Options = optionsAccessor?.Value ?? new IdentityOptions();
_context = contextAccessor?.HttpContext;
PasswordHasher = passwordHasher;
KeyNormalizer = keyNormalizer;
ErrorDescriber = errors;
@ -86,6 +84,7 @@ namespace Microsoft.AspNet.Identity
if (services != null)
{
_context = services.GetService<IHttpContextAccessor>()?.HttpContext;
foreach (var providerName in Options.Tokens.ProviderMap.Keys)
{
var provider = services.GetRequiredService(Options.Tokens.ProviderMap[providerName].ProviderType) as IUserTokenProvider<TUser>;

View File

@ -255,7 +255,7 @@ namespace Microsoft.AspNet.Identity.Test
private class MyUserManager : UserManager<TestUser>
{
public MyUserManager(IUserStore<TestUser> store) : base(store, null, null, null, null, null, null, null, null, null) { }
public MyUserManager(IUserStore<TestUser> store) : base(store, null, null, null, null, null, null, null, null) { }
}
private class MyRoleManager : RoleManager<TestRole>

View File

@ -73,7 +73,6 @@ namespace Microsoft.AspNet.Identity.Test
var userManager = MockHelpers.MockUserManager<TestUser>().Object;
Assert.Throws<ArgumentNullException>("contextAccessor", () => new SignInManager<TestUser>(userManager, null, null, null, null));
var contextAccessor = new Mock<IHttpContextAccessor>();
Assert.Throws<ArgumentNullException>("contextAccessor", () => new SignInManager<TestUser>(userManager, contextAccessor.Object, null, null, null));
var context = new Mock<HttpContext>();
contextAccessor.Setup(a => a.HttpContext).Returns(context.Object);
Assert.Throws<ArgumentNullException>("claimsFactory", () => new SignInManager<TestUser>(userManager, contextAccessor.Object, null, null, null));

View File

@ -50,7 +50,7 @@ namespace Microsoft.AspNet.Identity.Test
public class CustomUserManager : UserManager<TestUser>
{
public CustomUserManager() : base(new Mock<IUserStore<TestUser>>().Object, null, null, null, null, null, null, null, null, null)
public CustomUserManager() : base(new Mock<IUserStore<TestUser>>().Object, null, null, null, null, null, null, null, null)
{ }
}
@ -694,7 +694,7 @@ namespace Microsoft.AspNet.Identity.Test
public async Task ManagerPublicNullChecks()
{
Assert.Throws<ArgumentNullException>("store",
() => new UserManager<TestUser>(null, null, null, null, null, null, null, null, null, null));
() => new UserManager<TestUser>(null, null, null, null, null, null, null, null, null));
var manager = MockHelpers.TestUserManager(new NotImplementedStore());

View File

@ -18,7 +18,7 @@ namespace Microsoft.AspNet.Identity.Test
public static Mock<UserManager<TUser>> MockUserManager<TUser>() where TUser : class
{
var store = new Mock<IUserStore<TUser>>();
var mgr = new Mock<UserManager<TUser>>(store.Object, null, null, null, null, null, null, null, null, null);
var mgr = new Mock<UserManager<TUser>>(store.Object, null, null, null, null, null, null, null, null);
mgr.Object.UserValidators.Add(new UserValidator<TUser>());
mgr.Object.PasswordValidators.Add(new PasswordValidator<TUser>());
return mgr;
@ -76,8 +76,7 @@ namespace Microsoft.AspNet.Identity.Test
var userManager = new UserManager<TUser>(store, options.Object, new PasswordHasher<TUser>(),
userValidators, pwdValidators, new UpperInvariantLookupNormalizer(),
new IdentityErrorDescriber(), null,
new Mock<ILogger<UserManager<TUser>>>().Object,
null);
new Mock<ILogger<UserManager<TUser>>>().Object);
validator.Setup(v => v.ValidateAsync(userManager, It.IsAny<TUser>()))
.Returns(Task.FromResult(IdentityResult.Success)).Verifiable();
return userManager;