Không thể giải quyết dịch vụ cho loại 'Microsoft.AspNetCore.Identity.UserManager` trong khi cố gắng kích hoạt' AuthController '


95

Tôi gặp lỗi này trong Bộ điều khiển đăng nhập.

Không hợp lệ

đây là hàm tạo 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;
    }

và đây là ConfigureServices trong 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
Dường như với tôi rằng bạn đang đăng ký IdentityUserlà lớp người dùng cơ bản nhưng sau đó bạn đang sử dụng Automobile.Models.Account, trong đó, tất nhiên, không được đăng ký bất cứ nơi nào bằng ASP.NET nhận dạng
Federico Dipuma

@FedericoDipuma Cảm ơn bạn rất nhiều :) Đã giải quyết.
OMID

Bạn đã giải quyết nó như thế nào ..?
Rafael,

4
@Lobato trong services.AddIdentity chỉ cần thay thế IdentityUser với nhận dạng lớp người dùng của bạn
Omid

1
@OMID tại sao bạn không gửi nhận xét của bạn là câu trả lời, điều này đã cứu tôi nhưng sau khi một số nhức đầu nghiêm trọng của rnd ..
Null Pointer

Câu trả lời:


89

Bạn cần sử dụng cùng một mô hình dữ liệu người dùng trong SignInManager, UserManager và services.AddIdentity. Điều tương tự cũng đúng nếu bạn đang sử dụng lớp mô hình vai trò ứng dụng tùy chỉnh của riêng mình.

Vì vậy, hãy thay đổi

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

đến

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

2
Tôi gặp sự cố tương tự, tôi đã xác định vai trò và người dùng khách hàng của mình trong phương thức AddIdentity và tôi vẫn gặp lỗi tương tự. Bất kỳ ý tưởng tại sao? Tôi có thể đăng mã của mình trong một chủ đề riêng biệt.
devC

1
Trên thực tế, tôi đã giải quyết vấn đề đó, nhưng bây giờ gặp sự cố với việc tạo kết nối DB. Tôi sẽ đăng vấn đề.
devC


Có vẻ như chuỗi kết nối của bạn chưa được đặt đúng, hãy xem câu trả lời của tôi trong bài đăng của bạn.
HojjatK

49

Chỉ để rõ ràng về câu trả lời:

Nếu bạn sử dụng lớp ApplicationUsertrong startup.cs:services.AddIdentity<ApplicationUser, IdentityRole>()

thì bạn phải sử dụng cùng một lớp trong bộ điều khiển của mình khi tiêm nó:

public AccountController(UserManager<ApplicationUser> userManager)

Nếu bạn sử dụng một số lớp khác như:

public AccountController(UserManager<IdentityUser> userManager)

thì bạn sẽ gặp lỗi này:

InvalidOperationException: Không thể giải quyết dịch vụ cho loại 'Microsoft.AspNetCore.Identity.UserManager`1 [IdentityUser]'

bởi vì bạn đã sử dụng ApplicationUserkhi khởi động, không phải IdentityUservì vậy loại này không được đăng ký với hệ thống tiêm.


6
Điều này được tính cho tất cả các tham chiếu, vì vậy nếu bạn triển khai danh tính Razor mới cho asp.net core 2.1 để thay thế hệ thống nhận dạng cũ của mình, bạn cần thay thế việc triển khai tự động của chúng bằng những thứ như SignInManager <IdentityUser> thành SignInManager <ApplicationUser> ở bất kỳ nơi nào nó được sử dụng. Điều này có thể gây khó chịu. Ngoài ra, bạn cần phải định tuyến lại từ bình thường / Tài khoản / Đăng nhập đến / Danh tính / Tài khoản / Đăng nhập, v.v. chỉ cần một số mẹo để trợ giúp;)
Johan Herstad

14

Điều này hơi không liên quan đến bài đăng gốc nhưng vì Google đưa bạn đến đây ... nếu bạn đang gặp lỗi này và đang sử dụng:

services.AddIdentityCore<YourAppUser>()

Sau đó, bạn sẽ cần phải đăng ký thủ công nội dung đó AddIdentity, có thể tìm thấy tại đây: 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>>();

Bạn sẽ cần phải thay thế TUserTRolevới việc triển khai của bạn của những người, hoặc mặc định IdentityUser,IdentityRole


Phải tạo SignInManager tùy chỉnh và điều này đã sửa nó, nếu bạn định làm như vậy, hãy kiểm tra github.com/dotnet/docs/issues/14828
perustaja

Ban đầu tôi bắt đầu theo lộ trình này nhưng đã tìm thấy giải pháp ở đây ( stackoverflow.com/a/60752194/1146862 ) dễ dàng hơn; Thay đổi duy nhất mà tôi phải thực hiện (sau khi đặt hàng lại AddIdentityAddJwtBearerđặt tất cả ba tùy chọn được hiển thị trong ví dụ; tôi chỉ đang sử dụng DefaultAuthenticationScheme. Tôi vẫn lấy lại cookie khi đăng nhập, nhưng [Authorize]giờ hoạt động cho các mã thông báo JWT mà không chỉ định AuthenticationSchema.
Aaron

4

đừng quên thêm người quản lý vai trò trong ConfigureServices

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

3

Bạn có thể đặt IdentityUser và IdentityRole trong ConfigureServices bên trong lớp Khởi động riêng lẻ như hình dưới đây:

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

HOẶC LÀ

bạn có thể định cấu hình trực tiếp vào AddIdentity:

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

4
Với câu trả lời chỉ có mã, OP và những người khác sẽ khó tìm hiểu về vấn đề, hãy cân nhắc chỉnh sửa câu trả lời của bạn và thêm lời giải thích
Cleptus

0

Nếu bạn đang sử dụng "IdentityServer" để IdentityServer xác thực người dùng và cấp quyền cho khách hàng. Theo mặc định, IdentityServer thực sự không phải về quản lý người dùng. Nhưng có một số hỗ trợ cho asp.net Identity

Vì vậy, bạn cần thêm:

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

0

Bạn cần cập nhật lớp Statup.cs của mình với bên dưới

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

Đây: ApplicationUser là lớp mô hình tùy chỉnh của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.