From 167bb54c8d7aaafa12983164f8033cc25d0af39e Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 7 Jan 2016 14:21:31 -0800 Subject: [PATCH] Make IHttpContextAccessor Optional --- .../SignInManager.cs | 25 ++++++++++++++++--- src/Microsoft.AspNet.Identity/UserManager.cs | 5 ++-- .../IdentityBuilderTest.cs | 2 +- .../SignInManagerTest.cs | 1 - .../UserManagerTest.cs | 4 +-- test/Shared/MockHelpers.cs | 5 ++-- 6 files changed, 29 insertions(+), 13 deletions(-) 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;