diff --git a/src/Identity/SignInManager.cs b/src/Identity/SignInManager.cs index d553cd71c9..edef639426 100644 --- a/src/Identity/SignInManager.cs +++ b/src/Identity/SignInManager.cs @@ -613,8 +613,10 @@ namespace Microsoft.AspNetCore.Identity { return null; } - // TODO: display name gone?. Add [] indexer for Authproperties - return new ExternalLoginInfo(auth.Principal, provider, providerKey, provider) + + var providerDisplayName = (await GetExternalAuthenticationSchemesAsync()).FirstOrDefault(p => p.Name == provider)?.DisplayName + ?? provider; + return new ExternalLoginInfo(auth.Principal, provider, providerKey, providerDisplayName) { AuthenticationTokens = auth.Properties.GetTokens() }; diff --git a/test/Identity.Test/SignInManagerTest.cs b/test/Identity.Test/SignInManagerTest.cs index 392e0e9ac5..316f4b8d0b 100644 --- a/test/Identity.Test/SignInManagerTest.cs +++ b/test/Identity.Test/SignInManagerTest.cs @@ -176,7 +176,7 @@ namespace Microsoft.AspNetCore.Identity.Test return manager; } - private static SignInManager SetupSignInManager(UserManager manager, HttpContext context, StringBuilder logStore = null, IdentityOptions identityOptions = null) + private static SignInManager SetupSignInManager(UserManager manager, HttpContext context, StringBuilder logStore = null, IdentityOptions identityOptions = null, IAuthenticationSchemeProvider schemeProvider = null) { var contextAccessor = new Mock(); contextAccessor.Setup(a => a.HttpContext).Returns(context); @@ -185,7 +185,8 @@ namespace Microsoft.AspNetCore.Identity.Test var options = new Mock>(); options.Setup(a => a.Value).Returns(identityOptions); var claimsFactory = new UserClaimsPrincipalFactory(manager, roleManager.Object, options.Object); - var sm = new SignInManager(manager, contextAccessor.Object, claimsFactory, options.Object, null, new Mock().Object); + schemeProvider = schemeProvider ?? new Mock().Object; + var sm = new SignInManager(manager, contextAccessor.Object, claimsFactory, options.Object, null, schemeProvider); sm.Logger = MockHelpers.MockILogger>(logStore ?? new StringBuilder()).Object; return sm; } @@ -924,5 +925,36 @@ namespace Microsoft.AspNetCore.Identity.Test manager.Verify(); auth.Verify(); } + + [Fact] + public async Task GetExternalLoginInfoAsyncReturnsCorrectProviderDisplayName() + { + // Arrange + var user = new PocoUser { Id = "foo", UserName = "Foo" }; + var userManager = SetupUserManager(user); + var context = new DefaultHttpContext(); + var identity = new ClaimsIdentity(); + identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, "bar")); + var principal = new ClaimsPrincipal(identity); + var properties = new AuthenticationProperties(); + properties.Items["LoginProvider"] = "blah"; + var authResult = AuthenticateResult.Success(new AuthenticationTicket(principal, properties, "blah")); + var auth = MockAuth(context); + auth.Setup(s => s.AuthenticateAsync(context, IdentityConstants.ExternalScheme)).ReturnsAsync(authResult); + var schemeProvider = new Mock(); + var handler = new Mock(); + schemeProvider.Setup(s => s.GetAllSchemesAsync()) + .ReturnsAsync(new[] + { + new AuthenticationScheme("blah", "Blah blah", handler.Object.GetType()) + }); + var signInManager = SetupSignInManager(userManager.Object, context, schemeProvider: schemeProvider.Object); + + // Act + var externalLoginInfo = await signInManager.GetExternalLoginInfoAsync(); + + // Assert + Assert.Equal("Blah blah", externalLoginInfo.ProviderDisplayName); + } } }