.NET Core 7获取UserManager实例遇MissingMethodException问题求助
问题排查:.NET Core 7中获取UserManager实例时的MissingMethodException错误
错误信息
System.MissingMethodException HResult=0x80131513 Message=Method not found: 'Void Microsoft.AspNetCore.Identity.DataProtectorTokenProvider`1..ctor(Microsoft.AspNetCore.DataProtection.IDataProtectionProvider, Microsoft.Extensions.Options.IOptions`1<Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions>)'.
问题背景
原本可正常获取UserManager<AppUser>实例的代码:
var userManager = scope.ServiceProvider .GetRequiredService<UserManager<AppUser>>();
在添加邮箱确认功能、修改Identity配置后触发上述错误。修改的配置代码如下:
services.AddIdentity<AppUser, IdentityRole>(opt => { opt.Lockout.AllowedForNewUsers = true; opt.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(2); opt.Lockout.MaxFailedAccessAttempts = 5; opt.SignIn.RequireConfirmedEmail = true; opt.User.RequireUniqueEmail = true; opt.Tokens.EmailConfirmationTokenProvider = "emailconfirmation"; }) .AddEntityFrameworkStores<MeerkatContext>() .AddDefaultTokenProviders() .AddTokenProvider<EmailConfirmationTokenProvider<AppUser>>("emailconfirmation"); services.Configure<DataProtectionTokenProviderOptions>(opt => opt.TokenLifespan = TimeSpan.FromHours(2)); services.Configure<EmailConfirmationTokenProviderOptions>(opt => opt.TokenLifespan = TimeSpan.FromDays(3));
自定义的EmailConfirmationTokenProvider类:
using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Options; public class EmailConfirmationTokenProvider<TUser> : DataProtectorTokenProvider<TUser> where TUser : class { public EmailConfirmationTokenProvider(IDataProtectionProvider dataProtectionProvider, IOptions<EmailConfirmationTokenProviderOptions> options) : base(dataProtectionProvider, options) { } }
问题原因
DataProtectorTokenProvider<TUser>的构造函数要求传入IOptions<DataProtectionTokenProviderOptions>类型参数,但自定义EmailConfirmationTokenProvider的构造函数传入的是IOptions<EmailConfirmationTokenProviderOptions>,两者类型不匹配,导致运行时无法找到对应父类构造方法,抛出MissingMethodException。
解决方法
让自定义的EmailConfirmationTokenProviderOptions继承自DataProtectionTokenProviderOptions,使参数类型与父类构造函数匹配:
public class EmailConfirmationTokenProviderOptions : DataProtectionTokenProviderOptions { // 无需额外代码,继承父类的TokenLifespan等属性即可 }
修改后,EmailConfirmationTokenProvider调用base(dataProtectionProvider, options)时,因EmailConfirmationTokenProviderOptions是DataProtectionTokenProviderOptions的子类,可被正确转换,匹配父类构造方法,错误即可修复。
内容的提问来源于stack exchange,提问作者Amokachi
相关产品推荐
相关产品推荐

