'AuthController' को सक्रिय करने का प्रयास करते हुए 'Microsoft.AspNetCore.Identity.UserManager' प्रकार के लिए सेवा को हल करने में असमर्थ


95

मुझे लॉगिन कंट्रोलर में यह त्रुटि मिल रही है।

InvalidOperationException: 'Microsoft.AspNetCore.Identity.UserManager`1 [ऑटोमोबाइल.Models.Account] टाइप के लिए सेवा को हल करने में असमर्थ' ऑटोमोबाइल.Server.Contverers.AuthController 'को सक्रिय करने का प्रयास करते हुए।

यहाँ प्रामाणिक नियंत्रक निर्माता है:

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

और यहां स्टार्टअप में कॉन्फ़िगर कॉन्फ़िगर करें।

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 पहचान द्वारा कहीं भी पंजीकृत नहीं है
Federico Dipuma

@FedericoDipuma बहुत बहुत धन्यवाद :) हल किया।
OMID

आपने इसे कैसे हल किया ..?
राफेल

4
@Lobato in Services.AddIdentity को केवल IdentityUser से
बदलकर

1
@OMID आप अपनी टिप्पणी को उत्तर के रूप में क्यों नहीं पोस्ट करते हैं, इसने मुझे बचाया लेकिन RnD के कुछ गंभीर सिरदर्द के बाद ..
Null Pointer

जवाबों:


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
दरअसल, मैंने उस मुद्दे को सुलझा लिया, लेकिन अब डीबी कनेक्शन बनाने में समस्या का सामना करना पड़ रहा है। मैं समस्या पोस्ट करूँगा।
devC


लगता है कि आपका कनेक्शन स्ट्रिंग सही तरीके से सेट नहीं किया गया है, अपनी पोस्ट में मेरा उत्तर देखें।
होजजत्क

49

बस उत्तर के बारे में स्पष्ट होना चाहिए:

यदि आप ApplicationUserस्टार्टअप में वर्ग का उपयोग करते हैं।services.AddIdentity<ApplicationUser, IdentityRole>()

तब आपको अपने नियंत्रक में उसी वर्ग का उपयोग करना होगा जब इसे इंजेक्ट करें:

public AccountController(UserManager<ApplicationUser> userManager)

यदि आप कुछ अन्य वर्ग का उपयोग करते हैं जैसे:

public AccountController(UserManager<IdentityUser> userManager)

तब आपको यह त्रुटि मिलेगी:

InvalidOperationException: 'Microsoft.AspNetCore.Identity.UserManager`1 [IdentityUser]' प्रकार के लिए सेवा को हल करने में असमर्थ

क्योंकि आपने ApplicationUserस्टार्टअप में उपयोग किया है, IdentityUserइसलिए नहीं कि यह प्रकार इंजेक्शन प्रणाली के साथ पंजीकृत नहीं है।


6
यह सभी संदर्भों के लिए मायने रखता है, इसलिए यदि आप अपने पुराने पहचान प्रणाली को बदलने के लिए asp.net core 2.1 के लिए नई रेजर पहचान को लागू करते हैं, तो आपको साइन इनमेन्जर <IdentityUser> जैसे SignInManager <Applicationserser> जहां भी इसका उपयोग किया जाता है, उनके स्वचालित कार्यान्वयन को बदलने की आवश्यकता है। यह कष्टप्रद हो सकता है। इसके अलावा, आपको सामान्य / खाता / लॉगिन / / पहचान / खाता / लॉगिन आदि से पुन: रूट करने की आवश्यकता है। बस मदद के लिए कुछ सुझाव।)
जोहान हरस्टैड

14

यह मूल पोस्ट से थोड़ा असंबंधित है लेकिन चूंकि Google आपको यहां लाता है ... यदि आपको यह त्रुटि मिल रही है और उपयोग कर रहे हैं:

services.AddIdentityCore<YourAppUser>()

फिर आपको मैन्युअल रूप से उस सामान को पंजीकृत करना होगा AddIdentity, जो यहां पाया जा सकता है: https://github.com/aspnet/Identity/blob/feedcb5c53444f716ef5121d3add56n11c7b71e5/src/Identity/IdentityServiceCollectionExtensions

        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


एक कस्टम साइनइनमैनेजर बनाना था और इसे ठीक कर दिया, अगर आप ऐसा करने की योजना बनाते हैं तो github.com/dotnet/docs/issues/14828
perustaja

मैंने मूल रूप से इस मार्ग को शुरू किया था, लेकिन यहां समाधान पाया गया ( stackoverflow.com/a/60752194/1146862 ) अधिक सीधे आगे; एकमात्र बदलाव जो मुझे करना था (फिर से आदेश देने के बाद AddIdentityऔर AddJwtBearerउदाहरण में दिखाए गए सभी तीन विकल्पों को सेट करना था; मैं केवल उपयोग कर DefaultAuthenticationSchemeरहा हूं। मैं अभी भी कुकी को लॉगिन पर वापस लाता हूं, लेकिन [Authorize]अब JWT टोकन के लिए काम करता है बिना किसी निर्दिष्ट के ऑथेंटिकेशनस्चेम।
हारून

4

ConfigureServices में भूमिका प्रबंधक जोड़ना न भूलें

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

3

आप नीचे दिए गए अनुसार व्यक्तिगत रूप से IdentupUser और IdentityRole को Startup class के अंदर ConfigureServices में सेट कर सकते हैं:

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

या

आप सीधे AddIdentity में कॉन्फ़िगर कर सकते हैं:

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

4
केवल एक कोड के साथ उत्तर, ओपी और अन्य लोग शायद ही समस्या के बारे में जानेंगे, अपने उत्तर को संपादित करने और एक स्पष्टीकरण जोड़ने पर विचार करें
क्लेप्टस प्लस

0

यदि आप "IdentityServer" का उपयोग कर रहे हैं, तो IdentityServer उपयोगकर्ता को प्रमाणित करता है और क्लाइंट को अधिकृत करता है। डिफ़ॉल्ट रूप से, IdentityServer वास्तव में उपयोगकर्ता प्रबंधन के बारे में नहीं है। लेकिन asp.net Identity के लिए कुछ सपोर्ट है

तो आपको जोड़ने की आवश्यकता है:

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

0

आपको नीचे अपना Statup.cs वर्ग अपडेट करना होगा

सेवाएं। अतिरिक्तता <ApplicationUser, IdentityRole>)

यहाँ: ApplicationUser मेरा कस्टम मॉडल वर्ग है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.