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

View File

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

View File

@ -73,7 +73,6 @@ namespace Microsoft.AspNet.Identity.Test
var userManager = MockHelpers.MockUserManager<TestUser>().Object; var userManager = MockHelpers.MockUserManager<TestUser>().Object;
Assert.Throws<ArgumentNullException>("contextAccessor", () => new SignInManager<TestUser>(userManager, null, null, null, null)); Assert.Throws<ArgumentNullException>("contextAccessor", () => new SignInManager<TestUser>(userManager, null, null, null, null));
var contextAccessor = new Mock<IHttpContextAccessor>(); var contextAccessor = new Mock<IHttpContextAccessor>();
Assert.Throws<ArgumentNullException>("contextAccessor", () => new SignInManager<TestUser>(userManager, contextAccessor.Object, null, null, null));
var context = new Mock<HttpContext>(); var context = new Mock<HttpContext>();
contextAccessor.Setup(a => a.HttpContext).Returns(context.Object); contextAccessor.Setup(a => a.HttpContext).Returns(context.Object);
Assert.Throws<ArgumentNullException>("claimsFactory", () => new SignInManager<TestUser>(userManager, contextAccessor.Object, null, null, null)); 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 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() public async Task ManagerPublicNullChecks()
{ {
Assert.Throws<ArgumentNullException>("store", 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()); 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 public static Mock<UserManager<TUser>> MockUserManager<TUser>() where TUser : class
{ {
var store = new Mock<IUserStore<TUser>>(); 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.UserValidators.Add(new UserValidator<TUser>());
mgr.Object.PasswordValidators.Add(new PasswordValidator<TUser>()); mgr.Object.PasswordValidators.Add(new PasswordValidator<TUser>());
return mgr; return mgr;
@ -76,8 +76,7 @@ namespace Microsoft.AspNet.Identity.Test
var userManager = new UserManager<TUser>(store, options.Object, new PasswordHasher<TUser>(), var userManager = new UserManager<TUser>(store, options.Object, new PasswordHasher<TUser>(),
userValidators, pwdValidators, new UpperInvariantLookupNormalizer(), userValidators, pwdValidators, new UpperInvariantLookupNormalizer(),
new IdentityErrorDescriber(), null, new IdentityErrorDescriber(), null,
new Mock<ILogger<UserManager<TUser>>>().Object, new Mock<ILogger<UserManager<TUser>>>().Object);
null);
validator.Setup(v => v.ValidateAsync(userManager, It.IsAny<TUser>())) validator.Setup(v => v.ValidateAsync(userManager, It.IsAny<TUser>()))
.Returns(Task.FromResult(IdentityResult.Success)).Verifiable(); .Returns(Task.FromResult(IdentityResult.Success)).Verifiable();
return userManager; return userManager;