Add ProviderInstance for use in 2FA TokenProvider

This commit is contained in:
Hao Kung 2016-09-28 13:33:17 -07:00
parent b166c47235
commit d18ae5cad1
3 changed files with 55 additions and 1 deletions

View File

@ -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; }
}
}

View File

@ -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);

View File

@ -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()
{