টাইপ 'মাইক্রোসফ্ট.এএসপনেটকোর.ইডেন্টিটি.উজারম্যানেজার'-এর জন্য পরিষেবাটি সমাধান করতে অক্ষম


95

আমি লগইন কন্ট্রোলারে এই ত্রুটিটি পাচ্ছি।

অবৈধ অপারেশন এক্সসেপশন: 'অটোমোবাইল.সভার.কন্ট্রোলার.আথকন্ট্রোলার' সক্রিয় করার চেষ্টা করার সময় 'মাইক্রোসফ্ট.এএসপনেটকোর.ইডেন্টিটি.উজারম্যানেজারser1 [অটোমোবাইল.মোডেলস.অ্যাকউন্ট]' টাইপের জন্য পরিষেবাটি সমাধান করতে অক্ষম।

এখানে আথ কন্ট্রোলার কনস্ট্রাক্টর রয়েছে:

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 এ কনফিগার সার্ভিসগুলি রয়েছে:

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, যা অবশ্যই, এএসপি দ্বারা কোথাও নিবন্ধভুক্ত নয়
ET

@ ফেডেরিকো ডিপুমা আপনাকে অনেক ধন্যবাদ :) সমাধান করা হয়েছে।
ওমিড

কীভাবে সমাধান করলেন আপনি ..?
রাফায়েল 15

4
পরিষেবাদিগুলিতে লোবাটো.আড্ডিডেন্টিটি কেবল পরিচয় ব্যবহারকারীকে আপনার পরিচয় ব্যবহারকারী শ্রেণির সাথে প্রতিস্থাপন করুন
ওমিড

4
@ ওআইএমআইডি কেন আপনি উত্তর হিসাবে আপনার মন্তব্য পোস্ট করবেন না, এটি আমাকে রক্ষা করেছে তবে আরএনডি-র কিছুটা গুরুতর মাথাব্যথার পরে ..
নুল পয়েন্টার

উত্তর:


89

আপনাকে একই ব্যবহারকারীর ডেটা মডেল ব্যবহার করতে হবে SignInManager, ব্যবহারকারী ম্যানেজার এবং পরিষেবাদিগুলিতে .এডডিনটিটি। আপনি যদি নিজস্ব কাস্টম অ্যাপ্লিকেশন রোল মডেল ক্লাস ব্যবহার করেন তবে একই অধ্যক্ষটি সত্য।

সুতরাং, পরিবর্তন

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

4
আমার অনুরূপ সমস্যা রয়েছে, আমার গ্রাহক ব্যবহারকারী এবং ভূমিকাটি অ্যাডআইডেন্টিটি পদ্ধতিতে সংজ্ঞায়িত হয়েছে এবং আমি এখনও একই ত্রুটি পেয়েছি। কোন ধারণা কেন? আমি আমার কোডটি একটি আলাদা থ্রেডে পোস্ট করতে পারি।
devC

4
আসলে, আমি এই সমস্যাটি সমাধান করেছি, তবে এখন ডিবি সংযোগ তৈরি করতে কোনও সমস্যার মুখোমুখি। আমি সমস্যা পোস্ট করব।
devC


আপনার সংযোগের স্ট্রিং সঠিকভাবে সেট করা হয়নি বলে মনে হচ্ছে, আপনার পোস্টে আমার উত্তরটি দেখুন।
হোজ্জাতক

49

শুধু উত্তর সম্পর্কে পরিষ্কার হতে:

আপনি যদি ক্লাসটি ApplicationUserstartup.cs এ ব্যবহার করেন :services.AddIdentity<ApplicationUser, IdentityRole>()

তারপরে ইনজেক্ট করার সময় আপনাকে অবশ্যই আপনার নিয়ামকের একই ক্লাসটি ব্যবহার করতে হবে:

public AccountController(UserManager<ApplicationUser> userManager)

আপনি যদি অন্য কোনও শ্রেণি ব্যবহার করেন যেমন:

public AccountController(UserManager<IdentityUser> userManager)

তাহলে আপনি এই ত্রুটি পাবেন:

অবৈধ অপারেশন এক্সসেপশন: 'মাইক্রোসফ্ট.এএসপনেটকোর.ইডেন্টিটি.উজারম্যানেজার`1 [আইডেন্টিটি ব্যবহারকারী]' এর জন্য পরিষেবাটি সমাধান করতে অক্ষম

কারণ আপনি ApplicationUserপ্রারম্ভকালে ব্যবহার করেছেন, IdentityUserতাই নয় এই ধরণের ইনজেকশন সিস্টেমের সাথে নিবন্ধভুক্ত নয়।


6
এটি সমস্ত রেফারেন্সের জন্য গণনা করা হয়, সুতরাং যদি আপনি আপনার পুরানো পরিচয় ব্যবস্থাটি প্রতিস্থাপনের জন্য এসপ নেট কোর ২.১ এর জন্য নতুন রেজার পরিচয়টি প্রয়োগ করেন তবে আপনাকে যেখানেই ব্যবহৃত হবে সেখানেই সাইনইম্যানেজার <IdentityUser> এর মতো তাদের স্বয়ংক্রিয় প্রয়োগের স্থান পরিবর্তন করতে হবে it এটি বিরক্তিকর হতে পারে। এছাড়াও আপনাকে সাধারণ / অ্যাকাউন্ট / লগইন / আইডেন্টিটি / অ্যাকাউন্ট / লগইন ইত্যাদি থেকে পুনরায় রুট করতে হবে সহায়তার জন্য কিছু টিপস;)
জোহান হার্সটাদ

14

এটি মূল পোস্টের সাথে কিছুটা সম্পর্কিত নয় তবে যেহেতু গুগল আপনাকে এখানে এনেছে ... আপনি যদি এই ত্রুটিটি পেয়ে থাকেন এবং ব্যবহার করছেন:

services.AddIdentityCore<YourAppUser>()

তারপরে আপনাকে ম্যানুয়ালি সেই স্টাফগুলি নিবন্ধভুক্ত AddIdentityকরতে হবে যা এখানে পাওয়া যাবে: https://github.com/aspnet/Identity/blob/feedcb5c53444f716ef5121d3add56e11c7b71e5/src/Identity/IdentityS सर्विस কলোশনএক্সটেনশন।

        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


একটি কাস্টম SignInManager তৈরি করতে ছিল এবং এই এটা সুনির্দিষ্ট করা থাকে, যদি আপনি তা চেক করছেন করার পরিকল্পনা github.com/dotnet/docs/issues/14828
perustaja

আমি মূলত এই রুটটি দিয়েই শুরু করেছিলাম তবে সমাধানটি এখানে ( স্ট্যাকওভারফ্লো.com / a / 60752194 / 1146862 ) আরও সোজা এগিয়ে পেয়েছি ; শুধুমাত্র পরিবর্তন আমি (পুনরায় ক্রম পরে করা ছিল AddIdentityএবং AddJwtBearerতিনটি অপশন উদাহরণে দেখানো সেট করতে ছিল; আমি শুধু ব্যবহার করা হয়েছে চাই DefaultAuthenticationScheme। আমি এখনও লগইনে কুকি ফিরে পেতে, কিন্তু [Authorize]এখন একটি নির্দিষ্ট না করে JWT টোকেন জন্য কাজ করে AuthenticationSchema।
হারুন

4

কনফিগার সার্ভিসগুলিতে রোল ম্যানেজার যুক্ত করতে ভুলবেন না

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

3

আপনি নীচের চিত্রের মতো আলাদা আলাদাভাবে স্টার্টআপ ক্লাসের ভিতরে কনফিগার সার্ভিসে আইডেন্টিটি ব্যবহারকারী এবং আইডেন্টিটি রোল সেট করতে পারেন:

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

বা

আপনি সরাসরি অ্যাডআইডেন্টিটিতে কনফিগার করতে পারেন:

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

4
একটি কোডের উত্তরের সাথেই, ওপি এবং অন্যরা সমস্যাটি খুব কমই শিখবে, আপনার উত্তরটি সম্পাদনা করার এবং একটি ব্যাখ্যা যুক্ত করার বিষয়ে বিবেচনা করবে
ক্লিপটাস

0

আপনি যদি "আইডেন্টিটি সার্ভার" ব্যবহার করেন তবে আইডেন্টিটি সার্ভারটি ব্যবহারকারীকে অনুমোদন দেয় এবং ক্লায়েন্টকে অনুমোদন দেয় default ডিফল্টরূপে, আইডেন্টিটি সার্ভারটি আসলে ব্যবহারকারীর পরিচালনার বিষয়ে নয়। তবে এসপ নেট আইডেন্টিটির জন্য কিছু সমর্থন রয়েছে

সুতরাং আপনার যোগ করতে হবে:

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

0

নীচের সাথে আপনার স্ট্যাটআপ.সি ক্লাস আপডেট করা দরকার

পরিষেবাদি। অ্যাডিডেনটিটি <অ্যাপ্লিকেশন ব্যবহারকারী, আইডেন্টিটি রোল> () .এডএন্টি ফ্রেমওয়ার্ক স্টোরস ();

এখানে: অ্যাপ্লিকেশন ব্যবহারকারীটি আমার কাস্টম মডেল শ্রেণি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.