Add ProviderInstance for use in 2FA TokenProvider
This commit is contained in:
parent
b166c47235
commit
d18ae5cad1
|
|
@ -23,5 +23,10 @@ namespace Microsoft.AspNetCore.Identity
|
|||
/// The type that will be used for this token provider.
|
||||
/// </summary>
|
||||
public Type ProviderType { get; }
|
||||
|
||||
/// <summary>
|
||||
/// If specified, the instance to be used for the token provider.
|
||||
/// </summary>
|
||||
public object ProviderInstance { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
@ -98,7 +98,10 @@ namespace Microsoft.AspNetCore.Identity
|
|||
_context = services.GetService<IHttpContextAccessor>()?.HttpContext;
|
||||
foreach (var providerName in Options.Tokens.ProviderMap.Keys)
|
||||
{
|
||||
var provider = services.GetRequiredService(Options.Tokens.ProviderMap[providerName].ProviderType) as IUserTwoFactorTokenProvider<TUser>;
|
||||
var description = Options.Tokens.ProviderMap[providerName];
|
||||
|
||||
var provider = (description.ProviderInstance ?? services.GetRequiredService(description.ProviderType))
|
||||
as IUserTwoFactorTokenProvider<TUser>;
|
||||
if (provider != null)
|
||||
{
|
||||
RegisterTokenProvider(providerName, provider);
|
||||
|
|
|
|||
|
|
@ -623,6 +623,52 @@ namespace Microsoft.AspNetCore.Identity.Test
|
|||
await Assert.ThrowsAsync<NotSupportedException>(async () => await manager.GetClaimsAsync(null));
|
||||
}
|
||||
|
||||
private class ATokenProvider : IUserTwoFactorTokenProvider<TestUser>
|
||||
{
|
||||
public Task<bool> CanGenerateTwoFactorTokenAsync(UserManager<TestUser> manager, TestUser user)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public Task<string> GenerateAsync(string purpose, UserManager<TestUser> manager, TestUser user)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public Task<bool> ValidateAsync(string purpose, string token, UserManager<TestUser> manager, TestUser user)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void UserManagerWillUseTokenProviderInstance()
|
||||
{
|
||||
var services = new ServiceCollection();
|
||||
var provider = new ATokenProvider();
|
||||
services.AddLogging()
|
||||
.AddIdentity<TestUser, TestRole>(o => o.Tokens.ProviderMap.Add("A", new TokenProviderDescriptor(typeof(ATokenProvider))
|
||||
{
|
||||
ProviderInstance = provider
|
||||
})).AddUserStore<NoopUserStore>();
|
||||
var manager = services.BuildServiceProvider().GetService<UserManager<TestUser>>();
|
||||
Assert.ThrowsAsync<NotImplementedException>(() => manager.GenerateUserTokenAsync(new TestUser(), "A", "purpose"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void UserManagerWillUseTokenProviderInstanceOverDefaults()
|
||||
{
|
||||
var services = new ServiceCollection();
|
||||
var provider = new ATokenProvider();
|
||||
services.AddLogging()
|
||||
.AddIdentity<TestUser, TestRole>(o => o.Tokens.ProviderMap.Add(TokenOptions.DefaultProvider, new TokenProviderDescriptor(typeof(ATokenProvider))
|
||||
{
|
||||
ProviderInstance = provider
|
||||
})).AddUserStore<NoopUserStore>().AddDefaultTokenProviders();
|
||||
var manager = services.BuildServiceProvider().GetService<UserManager<TestUser>>();
|
||||
Assert.ThrowsAsync<NotImplementedException>(() => manager.GenerateUserTokenAsync(new TestUser(), TokenOptions.DefaultProvider, "purpose"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task TwoFactorStoreMethodsFailWhenStoreNotImplemented()
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue