You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 06:05:19