'AuthController'를 활성화하는 동안 'Microsoft.AspNetCore.Identity.UserManager'유형에 대한 서비스를 확인할 수 없습니다.


95

로그인 컨트롤러에서이 오류가 발생합니다.

InvalidOperationException : 'Automobile.Server.Controllers.AuthController'활성화를 시도하는 동안 'Microsoft.AspNetCore.Identity.UserManager`1 [Automobile.Models.Account]'유형에 대한 서비스를 확인할 수 없습니다.

다음은 인증 컨트롤러 생성자입니다.

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

다음은 startup.cs의 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;
        });

    }

21
당신이 등록되는 날 것으로 보인다 IdentityUser기본 사용자 클래스로하지만 당신이 사용하는 Automobile.Models.Account물론, ASP.NET 정체성 어디서나 등록되지 않은,
페데리코 Dipuma

@FedericoDipuma 정말 감사합니다 :) 해결되었습니다.
OMID

어떻게 해결 하셨나요 ..?
Rafael

4
services.AddIdentity에서 @Lobato 당신의 신원 사용자 클래스와 IdentityUser 교체
OMID

1
@OMID 왜 당신이 저를 저장하지만, 답변으로 의견을 게시하지 않습니다 RND의 심각한 두통 .. 후
널 포인터

답변:


89

SignInManager, UserManager 및 services.AddIdentity에서 동일한 사용자 데이터 모델을 사용해야합니다. 고유 한 사용자 지정 응용 프로그램 역할 모델 클래스를 사용하는 경우 동일한 주체가 적용됩니다.

그래서 변경

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

2
비슷한 문제가 있습니다. 고객 사용자와 역할이 AddIdentity 메서드에 정의되어 있는데 여전히 동일한 오류가 발생합니다. 왜 그런지 아세요? 별도의 스레드에 코드를 게시 할 수 있습니다.
devC

1
실제로 그 문제를 해결했지만 이제는 DB 연결을 만드는 데 문제가 있습니다. 문제를 게시하겠습니다.
devC


연결 문자열이 올바르게 설정되지 않은 것 같습니다. 게시물에서 내 대답을 확인하십시오.
HojjatK

49

답을 명확히하기 위해 :

ApplicationUserstartup.cs 에서 클래스를 사용하는 경우 :services.AddIdentity<ApplicationUser, IdentityRole>()

그런 다음 컨트롤러를 삽입 할 때 동일한 클래스를 사용해야합니다.

public AccountController(UserManager<ApplicationUser> userManager)

다음과 같은 다른 클래스를 사용하는 경우 :

public AccountController(UserManager<IdentityUser> userManager)

그러면이 오류가 발생합니다.

InvalidOperationException : 'Microsoft.AspNetCore.Identity.UserManager`1 [IdentityUser]'유형에 대한 서비스를 확인할 수 없습니다.

ApplicationUser시작에 사용 IdentityUser했기 때문에이 유형은 주입 시스템에 등록되지 않았습니다.


6
이는 모든 참조에 포함되므로 이전 ID 시스템을 대체하기 위해 asp.net 코어 2.1에 대한 새 Razor ID를 구현하는 경우 사용되는 위치에 관계없이 SignInManager <IdentityUser>와 같은 항목의 자동 구현을 SignInManager <ApplicationUser>로 대체해야합니다. 이것은 성 가실 수 있습니다. 또한 일반 / 계정에서 다시 노선 / 로그인 / 신원 / 계정 필요 / 로그인 등 도움이 단지 몇 가지 팁)
요한 Herstad

14

이것은 원본 게시물과 약간 관련이 없지만 Google이 여기로 가져 오기 때문에 ...이 오류가 발생하고 다음을 사용하는 경우 :

services.AddIdentityCore<YourAppUser>()

그런 다음 https://github.com/aspnet/Identity/blob/feedcb5c53444f716ef5121d3add56e11c7b71e5/src/Identity/IdentityServiceCollectionExtensions.cs#L79AddIdentity 에서 찾을 수있는 항목 을 수동으로 등록해야합니다 .

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

TUserTRole이를 해당 구현 또는 기본값 으로 교체해야합니다 IdentityUser.IdentityRole


사용자 지정 SignInManager를 만들어야했고이 문제가 해결되었습니다. 그렇게 할 계획이라면 github.com/dotnet/docs/issues/14828
perustaja

나는 원래이 경로를 시작했지만 여기 ( stackoverflow.com/a/60752194/1146862 )에서 더 직접적인 해결책을 찾았습니다 . 단지 내가 다시 주문 후 (했습니다 변경 AddIdentity하고 AddJwtBearer난 단지 사용 된 것, 예와 같이 세 가지 옵션을 설정하는 것이 었습니다 DefaultAuthenticationScheme난 아직 로그인시 쿠키 등을 얻을 수 있지만. [Authorize]지금을 지정하지 않고 JWT 토큰 작동 AuthenticationSchema.
Aaron

4

ConfigureServices에서 역할 관리자를 추가하는 것을 잊지 마십시오.

services.AddDefaultIdentity<IdentityUser>()
    .AddRoles<IdentityRole>() // <--------
    .AddDefaultUI(UIFramework.Bootstrap4)
    .AddEntityFrameworkStores<ApplicationDbContext>();

3

아래와 같이 Startup 클래스 내의 ConfigureServices에서 IdentityUser 및 IdentityRole을 개별적으로 설정할 수 있습니다.

services.AddDefaultIdentity<IdentityUser>()
    .AddRoles<IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

또는

AddIdentity에 직접 구성 할 수 있습니다.

services.AddIdentity<IdentityUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>();

4
코드 전용 답변으로 OP와 다른 사람들은 문제에 대해 거의 배우지 않을 것입니다. 답변을 편집하고 설명을 추가하는 것을 고려하십시오
Cleptus

0

"IdentityServer"를 사용하는 경우 IdentityServer가 사용자를 인증하고 클라이언트에 권한을 부여합니다. 기본적으로 IdentityServer는 실제로 사용자 관리에 관한 것이 아닙니다. 그러나 asp.net Identity에 대한 일부 지원이 있습니다.

따라서 다음을 추가해야합니다.

services.AddIdentityServer()
    .AddAspNetIdentity<ApplicationUser>();

0

아래와 같이 Statup.cs 클래스를 업데이트해야합니다.

services.AddIdentity <ApplicationUser, IdentityRole> () .AddEntityFrameworkStores ();

여기 : ApplicationUser는 내 사용자 정의 모델 클래스입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.