'AuthController'ı etkinleştirmeye çalışırken' Microsoft.AspNetCore.Identity.UserManager` türü hizmet çözümlenemiyor


95

Bu hatayı Login Controller'da alıyorum.

InvalidOperationException: 'Automobile.Server.Controllers.AuthController' etkinleştirilmeye çalışılırken 'Microsoft.AspNetCore.Identity.UserManager`1 [Automobile.Models.Account]' türü hizmet çözümlenemiyor.

Auth Controller kurucusu:

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

ve burada startup.cs içindeki ConfigureServices var:

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
Bana öyle geliyor ki IdentityUser, temel kullanıcı sınıfı olarak kayıt oluyorsunuz ama o zaman kullanıyorsunuz Automobile.Models.Account, ki bu tabii ki ASP.NET Identity
Federico Dipuma

@FedericoDipuma Çok teşekkür ederim :) Çözüldü.
OMID

Nasıl çözdünüz ..?
Rafael

4
@Lobato in services.AddIdentity sadece IdentityUser yerine Identity User sınıfınız
OMID

1
@OMID neden yorumunuzu cevap olarak göndermiyorsunuz, bu beni kurtardı ama ciddi bir RnD baş ağrısından sonra ..
Null Pointer

Yanıtlar:


89

SignInManager, UserManager ve services.AddIdentity'de aynı kullanıcı veri modelini kullanmanız gerekir. Kendi özel uygulama rol modeli sınıfınızı kullanıyorsanız, aynı esas geçerlidir.

Öyleyse değiştir

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

-e

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

2
Benzer bir problemim var, müşteri kullanıcım ve rolüm AddIdentity yönteminde tanımlı ve hala aynı hatayı alıyorum. Herhangi bir fikrin neden? Kodumu ayrı bir başlıkta gönderebilirim.
devC

1
Aslında, bu sorunu çözdüm, ancak şimdi DB bağlantısını oluştururken bir sorunla karşılaştım. Sorunu göndereceğim.
devC


Bağlantı dizeniz doğru ayarlanmamış gibi görünüyor, gönderinizdeki cevabıma bakın.
HojjatK

49

Cevap konusunda net olmak gerekirse:

Sınıfı ApplicationUserstartup.cs dosyasında kullanırsanız:services.AddIdentity<ApplicationUser, IdentityRole>()

daha sonra, enjekte ederken denetleyicinizde aynı sınıfı kullanmanız gerekir:

public AccountController(UserManager<ApplicationUser> userManager)

Aşağıdakiler gibi başka bir sınıf kullanıyorsanız:

public AccountController(UserManager<IdentityUser> userManager)

o zaman bu hatayı alacaksınız:

InvalidOperationException: 'Microsoft.AspNetCore.Identity.UserManager`1 [IdentityUser]' türü hizmet çözümlenemiyor

çünkü ApplicationUserbaşlangıçta kullandın , değilIdentityUser nedenle bu tür enjeksiyon sistemine kaydedilmemiştir.


6
Bu, tüm referanslar için geçerli olduğundan, eski kimlik sisteminizi değiştirmek üzere asp.net core 2.1 için yeni Razor kimliğini uygularsanız, SignInManager <IdentityUser> gibi öğelerin otomatik uygulamasını, kullanıldığı her yerde SignInManager <ApplicationUser> olarak değiştirmeniz gerekir. Bu can sıkıcı olabilir. Ayrıca normal / Hesap / Oturum
Açma'dan

14

Bu, orijinal gönderiyle biraz ilgisizdir, ancak Google sizi buraya getirdiğinden ... bu hatayı alıyorsanız ve kullanıyorsanız:

services.AddIdentityCore<YourAppUser>()

Daha sonra AddIdentity, burada bulunan şeyleri manuel olarak kaydetmeniz gerekecektir : 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>>();

Değiştirmeniz gerekecek TUserve TRolebunların uygulamalarınızla veya varsayılan olarak IdentityUser,IdentityRole


Özel bir SignInManager oluşturmanız gerekiyordu ve bu sorunu düzeltti, bunu yapmayı planlıyorsanız github.com/dotnet/docs/issues/14828
perustaja

Başlangıçta bu rotaya başladım, ancak çözümü burada ( stackoverflow.com/a/60752194/1146862 ) daha doğrudan buldum ; Keşke yeniden sipariş sonra (yapmak zorunda değiştirmek AddIdentityve AddJwtBearersadece kullanmakta ederim; örnekte gösterilen her üç seçeneklerini ayarlamak için oldu DefaultAuthenticationSchemeben hala girişte çerez geri almak, ama. [Authorize]Şimdi bir belirtmeden JWT simgeleri için çalışıyor AuthenticationSchema.
Aaron,

4

ConfigureServices'e rol yöneticisi eklemeyi unutmayın

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

3

IdentityUser ve IdentityRole'u Başlangıç ​​sınıfı içindeki ConfigureServices içinde aşağıda gösterildiği gibi ayrı ayrı ayarlayabilirsiniz:

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

VEYA

doğrudan AddIdentity'de yapılandırabilirsiniz:

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

4
Yalnızca kod
cevabıyla

0

"IdentityServer" kullanıyorsanız, bu nedenle IdentityServer kullanıcının kimliğini doğrular ve istemciyi yetkilendirir. Varsayılan olarak, IdentityServer aslında kullanıcı yönetimi ile ilgili değildir. Ancak asp.net Kimliği için biraz destek var

Yani eklemeniz gerekiyor:

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

0

Statup.cs sınıfınızı aşağıdaki ile güncellemeniz gerekiyor

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

Burada: ApplicationUser benim özel model sınıfım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.