Fixes #11405 - Adds AuthenticationProperties to ExternalLoginInfo (#12074)

* Fixes #11405 - Adds AuthenticationProperties to ExternalLoginInfo in SignInManager.GetExternalLoginInfoAsync().

* Public API changed; ran dotnet msbuild /t:GenerateReferenceSource in src/Identity/Core/src per docs/ReferenceAssemblies.md.

* Add unit test to verify SignInManager.GetExternalLoginInfoAsync() can return CustomValue from ExternalLoginInfo.AuthenticationProperties.Items.
This commit is contained in:
Brian Chavez 2019-07-12 16:01:12 -07:00 committed by Hao Kung
parent 5458a102e6
commit 32782cb421
4 changed files with 43 additions and 1 deletions

View File

@ -35,6 +35,7 @@ namespace Microsoft.AspNetCore.Identity
public partial class ExternalLoginInfo : Microsoft.AspNetCore.Identity.UserLoginInfo
{
public ExternalLoginInfo(System.Security.Claims.ClaimsPrincipal principal, string loginProvider, string providerKey, string displayName) : base (default(string), default(string), default(string)) { }
public Microsoft.AspNetCore.Authentication.AuthenticationProperties AuthenticationProperties { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authentication.AuthenticationToken> AuthenticationTokens { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public System.Security.Claims.ClaimsPrincipal Principal { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
}

View File

@ -35,5 +35,10 @@ namespace Microsoft.AspNetCore.Identity
/// The <see cref="AuthenticationToken"/>s associated with this login.
/// </summary>
public IEnumerable<AuthenticationToken> AuthenticationTokens { get; set; }
/// <summary>
/// The <see cref="Authentication.AuthenticationProperties"/> associated with this login.
/// </summary>
public AuthenticationProperties AuthenticationProperties { get; set; }
}
}

View File

@ -668,7 +668,8 @@ namespace Microsoft.AspNetCore.Identity
?? provider;
return new ExternalLoginInfo(auth.Principal, provider, providerKey, providerDisplayName)
{
AuthenticationTokens = auth.Properties.GetTokens()
AuthenticationTokens = auth.Properties.GetTokens(),
AuthenticationProperties = auth.Properties
};
}

View File

@ -979,5 +979,40 @@ namespace Microsoft.AspNetCore.Identity.Test
// Assert
Assert.Equal("Blah blah", externalLoginInfo.ProviderDisplayName);
}
[Fact]
public async Task ExternalLoginInfoAsyncReturnsAuthenticationPropertiesWithCustomValue()
{
// 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";
properties.Items["CustomValue"] = "fizzbuzz";
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<IAuthenticationSchemeProvider>();
var handler = new Mock<IAuthenticationHandler>();
schemeProvider.Setup(s => s.GetAllSchemesAsync())
.ReturnsAsync(new[]
{
new AuthenticationScheme("blah", "Blah blah", handler.Object.GetType())
});
var signInManager = SetupSignInManager(userManager.Object, context, schemeProvider: schemeProvider.Object);
var externalLoginInfo = await signInManager.GetExternalLoginInfoAsync();
// Act
var externalProperties = externalLoginInfo.AuthenticationProperties;
var customValue = externalProperties?.Items["CustomValue"];
// Assert
Assert.NotNull(externalProperties);
Assert.Equal("fizzbuzz", customValue);
}
}
}