diff --git a/src/Microsoft.AspNet.Identity/SignInManager.cs b/src/Microsoft.AspNet.Identity/SignInManager.cs
index bd7caf8bc3..aa65b8d1e0 100644
--- a/src/Microsoft.AspNet.Identity/SignInManager.cs
+++ b/src/Microsoft.AspNet.Identity/SignInManager.cs
@@ -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;
+
///
/// Gets the used to log messages from the manager.
///
@@ -65,10 +68,26 @@ namespace Microsoft.AspNet.Identity
///
protected internal virtual ILogger Logger { get; set; }
protected internal UserManager UserManager { get; set; }
- internal HttpContext Context { get; set; }
internal IUserClaimsPrincipalFactory 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;
+ }
+ }
+
+
///
/// Creates a for the specified , as an asynchronous operation.
///
diff --git a/src/Microsoft.AspNet.Identity/UserManager.cs b/src/Microsoft.AspNet.Identity/UserManager.cs
index 248c75f0b0..ece46126ab 100644
--- a/src/Microsoft.AspNet.Identity/UserManager.cs
+++ b/src/Microsoft.AspNet.Identity/UserManager.cs
@@ -54,8 +54,7 @@ namespace Microsoft.AspNet.Identity
ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors,
IServiceProvider services,
- ILogger> logger,
- IHttpContextAccessor contextAccessor)
+ ILogger> 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()?.HttpContext;
foreach (var providerName in Options.Tokens.ProviderMap.Keys)
{
var provider = services.GetRequiredService(Options.Tokens.ProviderMap[providerName].ProviderType) as IUserTokenProvider;
diff --git a/test/Microsoft.AspNet.Identity.Test/IdentityBuilderTest.cs b/test/Microsoft.AspNet.Identity.Test/IdentityBuilderTest.cs
index 386aad9dec..b39053624c 100644
--- a/test/Microsoft.AspNet.Identity.Test/IdentityBuilderTest.cs
+++ b/test/Microsoft.AspNet.Identity.Test/IdentityBuilderTest.cs
@@ -255,7 +255,7 @@ namespace Microsoft.AspNet.Identity.Test
private class MyUserManager : UserManager
{
- public MyUserManager(IUserStore store) : base(store, null, null, null, null, null, null, null, null, null) { }
+ public MyUserManager(IUserStore store) : base(store, null, null, null, null, null, null, null, null) { }
}
private class MyRoleManager : RoleManager
diff --git a/test/Microsoft.AspNet.Identity.Test/SignInManagerTest.cs b/test/Microsoft.AspNet.Identity.Test/SignInManagerTest.cs
index ac8eeae8c9..b86e04bb41 100644
--- a/test/Microsoft.AspNet.Identity.Test/SignInManagerTest.cs
+++ b/test/Microsoft.AspNet.Identity.Test/SignInManagerTest.cs
@@ -73,7 +73,6 @@ namespace Microsoft.AspNet.Identity.Test
var userManager = MockHelpers.MockUserManager().Object;
Assert.Throws("contextAccessor", () => new SignInManager(userManager, null, null, null, null));
var contextAccessor = new Mock();
- Assert.Throws("contextAccessor", () => new SignInManager(userManager, contextAccessor.Object, null, null, null));
var context = new Mock();
contextAccessor.Setup(a => a.HttpContext).Returns(context.Object);
Assert.Throws("claimsFactory", () => new SignInManager(userManager, contextAccessor.Object, null, null, null));
diff --git a/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs b/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs
index 6f132068d7..ae700ea251 100644
--- a/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs
+++ b/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs
@@ -50,7 +50,7 @@ namespace Microsoft.AspNet.Identity.Test
public class CustomUserManager : UserManager
{
- public CustomUserManager() : base(new Mock>().Object, null, null, null, null, null, null, null, null, null)
+ public CustomUserManager() : base(new Mock>().Object, null, null, null, null, null, null, null, null)
{ }
}
@@ -694,7 +694,7 @@ namespace Microsoft.AspNet.Identity.Test
public async Task ManagerPublicNullChecks()
{
Assert.Throws("store",
- () => new UserManager(null, null, null, null, null, null, null, null, null, null));
+ () => new UserManager(null, null, null, null, null, null, null, null, null));
var manager = MockHelpers.TestUserManager(new NotImplementedStore());
diff --git a/test/Shared/MockHelpers.cs b/test/Shared/MockHelpers.cs
index a905b6ef64..543087af6c 100644
--- a/test/Shared/MockHelpers.cs
+++ b/test/Shared/MockHelpers.cs
@@ -18,7 +18,7 @@ namespace Microsoft.AspNet.Identity.Test
public static Mock> MockUserManager() where TUser : class
{
var store = new Mock>();
- var mgr = new Mock>(store.Object, null, null, null, null, null, null, null, null, null);
+ var mgr = new Mock>(store.Object, null, null, null, null, null, null, null, null);
mgr.Object.UserValidators.Add(new UserValidator());
mgr.Object.PasswordValidators.Add(new PasswordValidator());
return mgr;
@@ -76,8 +76,7 @@ namespace Microsoft.AspNet.Identity.Test
var userManager = new UserManager(store, options.Object, new PasswordHasher(),
userValidators, pwdValidators, new UpperInvariantLookupNormalizer(),
new IdentityErrorDescriber(), null,
- new Mock>>().Object,
- null);
+ new Mock>>().Object);
validator.Setup(v => v.ValidateAsync(userManager, It.IsAny()))
.Returns(Task.FromResult(IdentityResult.Success)).Verifiable();
return userManager;