当前位置: 首页 > 知识库问答 >
问题:

无法解析类型为“Microsoft”的服务。AspNetCore。身份UserManager`试图激活“AuthController”

司寇正志
2023-03-14

登录控制器中出现此错误。

无效操作异常:在尝试激活“汽车。服务器。控制器。AuthController”时,无法解析类型为“Microsoft. AspNetCore。身份。UserManager'1[汽车。模型。帐户]”的服务。

这是Auth Controller构造函数:

private SignInManager<Automobile.Models.Account> _signManager;
    private UserManager<Automobile.Models.Account> _userManager;

    public AuthController(UserManager<Models.Account> userManager,
                          SignInManager<Automobile.Models.Account> signManager)
    {
        this._userManager = userManager;
        this._signManager = signManager;
    }

这里是启动中的ConfigureServices。反恐精英:

public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddApplicationInsightsTelemetry(Configuration);
        services.Configure<AppConfig>(Configuration.GetSection("AppSettings"));

        //var provider = HttpContext.ApplicationServices;
        //var someService = provider.GetService(typeof(ISomeService));


        services.AddDbContext<Providers.Database.EFProvider.DataContext>(options => options
            .UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
                 b => b.MigrationsAssembly("Automobile.Server")
            ));


        services.AddIdentity<IdentityUser, IdentityRole>(options =>
        {
            options.User.RequireUniqueEmail = false;
        })
        .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>()
        .AddDefaultTokenProviders(); 
        //services.AddScoped<SignInManager<Automobile.Models.Account>, SignInManager<Automobile.Models.Account>>();
        //services.AddScoped<UserManager<Automobile.Models.Account>, UserManager<Automobile.Models.Account>>();

        services.AddMvc();
        App.Service = services.BuildServiceProvider();

        // Adds a default in-memory implementation of IDistributedCache.
        services.AddDistributedMemoryCache();

        services.AddSession(options =>
        {
            // Set a short timeout for easy testing.
            options.IdleTimeout = TimeSpan.FromSeconds(10);
            options.CookieHttpOnly = true;
        });

    }

共有3个答案

赏开宇
2023-03-14

这与原始帖子有点无关,但由于Google将您带到这里......如果您收到此错误并正在使用:

services.AddIdentityCore<YourAppUser>()

然后,您需要手动注册AddIdentity所做的工作,可以在此处找到:https://github.com/aspnet/Identity/blob/feedcb5c53444f716ef5121d3add56e11c7b71e5/src/Identity/IdentityServiceCollectionExtensions.cs#L79

        services.AddHttpContextAccessor();
        // Identity services
        services.TryAddScoped<IUserValidator<TUser>, UserValidator<TUser>>();
        services.TryAddScoped<IPasswordValidator<TUser>, PasswordValidator<TUser>>();
        services.TryAddScoped<IPasswordHasher<TUser>, PasswordHasher<TUser>>();
        services.TryAddScoped<ILookupNormalizer, UpperInvariantLookupNormalizer>();
        services.TryAddScoped<IRoleValidator<TRole>, RoleValidator<TRole>>();
        // No interface for the error describer so we can add errors without rev'ing the interface
        services.TryAddScoped<IdentityErrorDescriber>();
        services.TryAddScoped<ISecurityStampValidator, SecurityStampValidator<TUser>>();
        services.TryAddScoped<ITwoFactorSecurityStampValidator, TwoFactorSecurityStampValidator<TUser>>();
        services.TryAddScoped<IUserClaimsPrincipalFactory<TUser>, UserClaimsPrincipalFactory<TUser, TRole>>();
        services.TryAddScoped<UserManager<TUser>>();
        services.TryAddScoped<SignInManager<TUser>>();
        services.TryAddScoped<RoleManager<TRole>>();

您需要用这些工具的实现来替换TUser和TRole,或者使用默认的IdentityUser、IdentityRole

公西翊歌
2023-03-14

只是想弄清楚答案:

如果在启动时使用类ApplicationUser。cs:服务。额外性

然后,在注入控制器时,必须在控制器中使用相同的类:

public AccountController(UserManager<ApplicationUser> userManager)

如果使用其他类,例如:

public AccountController(UserManager<IdentityUser> userManager)

然后您将得到以下错误:

无效操作异常:无法解析类型为“Microsoft”的服务。AspNetCore。身份。UserManager'1[标识用户]'

因为您在启动时使用了Application ationUser,而不是IdtyUser,所以此类型未在注入系统中注册。

余善
2023-03-14

您需要在SignInManager、UserManager和services中使用相同的用户数据模型。额外性。如果您使用自己的自定义应用程序角色模型类,则相同的主体为真。

所以,改变

services.AddIdentity<IdentityUser, IdentityRole>(options =>
    {
        options.User.RequireUniqueEmail = false;
    })
    .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>()
    .AddDefaultTokenProviders();

services.AddIdentity<Automobile.Models.Account, IdentityRole>(options =>
    {
        options.User.RequireUniqueEmail = false;
    })
    .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>()
    .AddDefaultTokenProviders();
 类似资料:
  • 在我的ASP. NET Core应用程序中,我收到以下错误: 无效操作异常:在尝试激活“城市”时无法解析类型“城市”的服务。模型。IRepository。控制器。HomeController。 我是家庭控制器,我试图将城市的getter传递给视图,如下所示: 我有一个文件存储库。cs包含一个接口及其实现,如下所示: 我的启动类包含从模板生成的默认代码。我做了任何更改:

  • 我创建了一个。NET核心MVC应用程序,并使用依赖项注入和存储库模式将存储库注入控制器。但是,我得到一个错误: 无法解析类型WebApplication ation1的服务。数据。BloggerRepository'同时尝试激活'WebApplication 1.控制器。BlogController'. 型号(Blog.cs) DbContext(BloggingContext.cs) 存储库(I

  • 我正在尝试创建ASP。NET核心应用程序使用通用存储库模式,使用实体框架和服务层。然而,每当我启动项目时,都会遇到以下错误: 无法解析“GameSource”类型的服务。数据存储库。GameRepository“正在尝试激活”GameSource。服务。游戏服务'。 游戏控制器。反恐精英: 游戏服务。反恐精英: 游戏存储库。反恐精英: BaseRepository。反恐精英: GameSource

  • 我创建了一个.NETCoreMVC应用程序,并使用依赖注入和存储库模式将存储库注入我的控制器。然而,我得到一个错误: 无法解析类型WebApplication1.Data.BloggerRepository的服务,而试图激活WebApplication1.Controllers.BlogController。 存储 库: 控制器: 启动. cs: 我不知道我做错了什么。有什么想法吗?

  • 我的基本要求是公开一些REST资源的Web API。访问任何资源都需要身份验证,我希望这通过Microsoft帐户进行。这是一个用于编程访问的Web api。 我沿着这条路开始:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/microsoft-logins?view=aspnetcore-2.

  • 问题内容: 这是我得到的错误: 这是我的代码: 另外,我在一个单独的类中声明了这一点: 是什么导致此错误,我该如何解决? 编辑:缩进,空格,命名约定和可读性问题已得到解决。 问题答案: 问题在于,这似乎是一个内部类(很难说,您的缩进是不好的),并且由于它不是静态的,因此您无法单独实例化它。 您要么需要自己创建一个类,要么使其成为一个类并将其实例化为(或者无论父类是什么,您的缩进在这里实际上都没有帮