2016-03-23 23 views
14

Tôi đang cố gắng định cấu hình xác thực và ủy quyền bằng cơ sở dữ liệu và bảng hiện có của mình mà không cần sử dụng Entity Framework (sử dụng Dapper).Xác thực và ủy quyền không có khung thực thể trong ASP.NET 5 MVC 6

Tôi đã định cấu hình Dapper chính xác, bây giờ tôi đang cố gắng kết nối SignInManager và UserManager để gọi cơ sở dữ liệu của tôi qua Dapper, nhưng trước khi điều đó có thể xảy ra, tôi đang gặp một số lỗi với vai trò tùy chỉnh của mình cửa hàng.

Dưới đây là những lỗi mà tôi nhận được khi tôi nhấp vào nút "Đăng ký" trên trang web (đây chỉ là một dự án đơn giản với tất cả các tài khoản được xác định trước vv thứ out of the box)

InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNet.Identity.IRoleStore`1[TestAsyncWebsite.Configuration.WrestleStatRole]' while attempting to activate 'Microsoft.AspNet.Identity.RoleManager`1[TestAsyncWebsite.Configuration.WrestleStatRole]' 

Cho đến nay, đây là cách tôi đã cấu hình người dùng tùy chỉnh, vai trò, userstore, vai trò lưu trữ, UserManager, và rolemanager tôi:

public class WrestleStatUser : ApplicationUser 
    { 
     public WrestleStatUser() : base() 
     { 

     } 
    } 

    public class WrestleStatRole : IdentityRole 
    { 

    } 

public class WrestleStatUserStore : IUserStore<WrestleStatUser> 
{ 
    // all methods implemented 
} 

public class WrestleStatRoleStore : IRoleStore<WrestleStatRole> 
{ 
    // all methods implemented 
} 

    public class WrestleStatUserManager : UserManager<WrestleStatUser> 
    { 
     public WrestleStatUserManager(IUserStore<WrestleStatUser> store, IOptions<IdentityOptions> optionsAccessor, IPasswordHasher<WrestleStatUser> passwordHasher, IEnumerable<IUserValidator<WrestleStatUser>> userValidators, IEnumerable<IPasswordValidator<WrestleStatUser>> passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IEnumerable<IUserTokenProvider<WrestleStatUser>> tokenProviders, ILogger<UserManager<WrestleStatUser>> logger, IHttpContextAccessor contextAccessor) 
      : base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, tokenProviders, logger, contextAccessor) 
     { 
     } 
    } 

public class WrestleStatRoleManager : RoleManager<WrestleStatRole> 
{ 
    public WrestleStatRoleManager(IRoleStore<WrestleStatRole> store, IEnumerable<IRoleValidator<WrestleStatRole>> roleValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, ILogger<RoleManager<WrestleStatRole>> logger, IHttpContextAccessor contextAccessor) : base(store, roleValidators, keyNormalizer, errors, logger, contextAccessor) 
    { 
    } 
} 

và đây là startup.cs tôi:

services.AddIdentity<WrestleStatUser, WrestleStatRole>() 
     .AddUserStore<WrestleStatUserStore>() 
     .AddUserManager<WrestleStatUserManager>() 
     //.AddRoleStore<RoleStore>() 
     .AddRoleManager<WrestleStatRoleManager>() 
     .AddDefaultTokenProviders(); 

Tôi thiếu gì ở đây? Lỗi nói điều gì đó về RoleManager, tôi đã xác định RoleManager tùy chỉnh của mình ...

Trả lời

11

một vấn đề mà tôi thấy là WrestleStatRole của bạn kế thừa từ IdentityRole. bạn đang cố gắng làm những việc không có EF, bạn không nên kế thừa từ đó.

Bạn sẽ cần lớp vai trò của riêng mình và không nên sử dụng bất kỳ lớp nào từ việc triển khai EF.

Tương tự, ApplicationUser mà bạn kế thừa từ trong WrestleStatUser là trong thư mục mô hình dự án ứng dụng web, nhưng chắc chắn rằng nó không kế thừa từ IdentityUser là một phần của việc thực hiện EntityFramework bản sắc

Để không sử dụng Entity Framework bạn phải thực hiện IUserStore và IRoleStore và đăng ký những dịch vụ di

services.AddScoped<IUserStore<WrestleStatUser>, UserStore<WrestleStatUser>>(); 
services.AddScoped<IRoleStore<WrestleStatRole>, RoleStore<WrestleStatRole>>(); 

và như đã đề cập người dùng của bạn và các lớp học trò nên không kế thừa từ việc triển khai EF, trong thực tế, họ không cần phải kế thừa từ bất cứ điều gì ở tất cả miễn là bạn đã triển khai các cửa hàng đó d họ làm việc.

Bạn có thể sử dụng Trình quản lý người dùng tích hợp nếu bạn triển khai cửa hàng người dùng và rolestore, không bắt buộc phải tự mình thực hiện trừ khi bạn có lý do khác để làm như vậy.

Nếu bạn cần mã ví dụ, bạn có thể xem cloudscribe project Tôi đã triển khai thực hiện nhận dạng nhiều đối tượng người thuê tùy chỉnh không sử dụng khung pháp nhân. Trên thực tế tôi đang hỗ trợ các lớp dữ liệu mutlple có thể được cắm vào và EF là một trong số chúng nhưng nó bị loại bỏ khỏi các bit nhận dạng và tôi không sử dụng bất kỳ thứ gì từ không gian tên Microsoft.AspNetCore.Identity.EntityFrameworkCore.

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