我一直在.NET Core 2.2中使用两个具有身份的自定义令牌提供程序。迁移到3.1后,我遇到了此异常
System.Exception: Could not resolve a service of type 'Microsoft.AspNetCore.Identity.UserManager`1[[App.Domain.Entities.AppUser, App.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' for the parameter 'userManager' of method 'Configure' on type 'App.API.Startup'.
---> System.MissingMethodException: Method not found: 'Void Microsoft.AspNetCore.Identity.DataProtectorTokenProvider`1..ctor(Microsoft.AspNetCore.DataProtection.IDataProtectionProvider, Microsoft.Extensions.Options.IOptions`1<Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions>)'.
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
我认为这是UserManager
构造函数中试图解析所有令牌提供者的部分。
这里是身份配置
namespace App.Identity
{
public static class IdentityExtensions
{
public static IServiceCollection AddAppIdentity(this IServiceCollection services, IConfiguration configuration)
{
services.AddIdentity<AppUser, AppRole>(options =>
{
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Tokens.EmailConfirmationTokenProvider = EmailConfirmationTokenProviderOptions.ProviderName;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders()
.AddEmailConfirmationTokenProvider()
.AddMagicLinkLoginTokenProvider();
return services;
}
private static IdentityBuilder AddMagicLinkLoginTokenProvider(this IdentityBuilder builder)
{
return builder.AddTokenProvider(
MagicLinkLoginTokenProviderOptions.ProviderName,
typeof(MagicLinkLoginTokenProvider<>).MakeGenericType(builder.UserType)
);
}
private static IdentityBuilder AddEmailConfirmationTokenProvider(this IdentityBuilder builder)
{
return builder.AddTokenProvider(
EmailConfirmationTokenProviderOptions.ProviderName,
typeof(EmailConfirmationTokenProvider<>).MakeGenericType(builder.UserType)
);
}
}
}
UPDATE:
[经过一些调查后,我注意到最新的DataProtectorTokenProvider
具有包含ILogger
的构造函数签名,而我的(Microsoft.AspNetCore.Identity v2.2)仅具有dataProtectionProvider
和options
。我是引用错误的软件包还是?