7

Tôi có một ứng dụng ASP.NET Core sử dụng danh tính. Nó hoạt động, nhưng khi tôi cố gắng thêm các vai trò tùy chỉnh vào cơ sở dữ liệu, tôi gặp phải các vấn đề.Bản sắc lõi ASP.NET: Không có dịch vụ cho người quản lý vai trò

Trong Startup ConfigureServices Tôi đã thêm danh tính và người quản lý vai trò như một dịch vụ scoped như thế này:

services.AddIdentity<Entities.DB.User, IdentityRole<int>>() 
       .AddEntityFrameworkStores<MyDBContext, int>(); 

services.AddScoped<RoleManager<IdentityRole>>(); 

và trong Startup Configure tôi tiêm RoleManager và vượt qua nó đến lớp tùy chỉnh của tôi RolesData:

public void Configure(
     IApplicationBuilder app, 
     IHostingEnvironment env, 
     ILoggerFactory loggerFactory, 
     RoleManager<IdentityRole> roleManager 
    ) 
    { 

    app.UseIdentity(); 
    RolesData.SeedRoles(roleManager).Wait(); 
    app.UseMvc(); 

Đây là lớp RolesData:

public static class RolesData 
{ 

    private static readonly string[] roles = new[] { 
     "role1", 
     "role2", 
     "role3" 
    }; 

    public static async Task SeedRoles(RoleManager<IdentityRole> roleManager) 
    { 

     foreach (var role in roles) 
     { 

      if (!await roleManager.RoleExistsAsync(role)) 
      { 
       var create = await roleManager.CreateAsync(new IdentityRole(role)); 

       if (!create.Succeeded) 
       { 

        throw new Exception("Failed to create role"); 

       } 
      } 

     } 

    } 

} 

Ứng dụng được xây dựng mà không có lỗi, nhưng khi cố gắng truy cập vào nó tôi nhận được lỗi sau:

Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IRoleStore`1[Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole]' while attempting to activate 'Microsoft.AspNetCore.Identity.RoleManager

Tôi đang làm gì sai? Ruột của tôi nói có điều gì đó sai trái với cách tôi thêm RoleManager như một dịch vụ.

PS: Tôi đã sử dụng "Không xác thực" khi tạo dự án để tìm hiểu Danh tính từ đầu.

+0

Tôi đề xuất tạo một dự án khác bằng tài khoản người dùng cá nhân để bạn có thể so sánh với những gì được thiết lập cho bạn khi bạn sử dụng mẫu bao gồm nhận dạng –

+0

Một dự án hoàn toàn mới với "tài khoản người dùng cá nhân" được thêm vào không chứa bất kỳ mã nào được thiết lập vai trò. –

+0

không có, nhưng nó có thể có một số mã dây lên phụ thuộc bạn đã không dây lên một cách chính xác –

Trả lời

7

What am I doing wrong? My gut says there's something wrong with how I add the RoleManager as a service.

Phần đăng ký là thực sự tốt, tho' bạn nên loại bỏ services.AddScoped<RoleManager<IdentityRole>>(), như người quản lý vai trò đã được thêm vào cho bạn bằng cách services.AddIdentity().

vấn đề của bạn rất có thể gây ra bởi một loại không phù hợp chung: khi bạn gọi services.AddIdentity() với IdentityRole<int>, bạn cố gắng để giải quyết RoleManager với IdentityRole, mà là một tương đương với IdentityRole<string> (string là loại chìa khóa mặc định trong ASP.NET Lõi nhận dạng).

Cập nhật phương thức Configure của bạn để tham số RoleManager<IdentityRole<int>> và nó sẽ hoạt động.

+0

Có! Cảm ơn ngài! Bây giờ nó hoạt động tốt. –

+0

Đây là một sửa chữa tuyệt vời và rất hữu ích. Tôi cũng khuyên bạn nên gọi SeedRoles từ một DatabaseInitializer để các CreateUsers và các vai trò không đồng bộ từ khởi động một cái gì đó như 'code' public async Task SeedAsync() {await CreateUsersAsync(); await RolesData.SeedRoles (_roleManager);} – RussHooker

Các vấn đề liên quan