Подтвердить что ты не робот

Аутентификация и авторизация без Entity Framework в ASP.NET 5 MVC 6

Я пытаюсь настроить свою аутентификацию и авторизацию с помощью моей существующей базы данных и таблиц без использования Entity Framework (используя Dapper).

У меня правильно настроен Dapper, теперь я пытаюсь подключить SignInManager и UserManager для вызова моей базы данных через Dapper, но до этого может произойти ошибка в моем настраиваемом хранилище роли.

Вот ошибка, которую я получаю, когда я нажимаю кнопку "Зарегистрироваться" на веб-сайте (это простой проект со всеми предопределенными учетными записями и т.д.)

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]'

Теперь, как я настроил свой пользовательский пользователь, роль, пользовательский магазин, хранилище ролей, usermanager и ролевой менеджер:

    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)
    {
    }
}

И вот мой startup.cs:

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

Что мне здесь не хватает? Ошибка говорит что-то о RoleManager, я уже определил свой собственный RoleManager...

4b9b3361

Ответ 1

одна проблема, которую я вижу, - это ваш WrestleStatRole наследует от IdentityRole, который может звучать как часть Identity, но его действительно часть реализации EntityFramework Identity, если вы пытаетесь делать что-то без EF, вы не должны наследовать от этого.

Вам понадобится ваш собственный класс ролей и не должен использовать какие-либо классы из реализации EF.

Аналогично, ApplicationUser, который вы наследуете в WrestleStatUser, находится в папке моделей проектов веб-приложений, но убедитесь, что он не наследуется от IdentityUser, который является частью реализации идентификации EntityFramework

Чтобы не использовать Entity Framework, вы должны реализовать IUserStore и IRoleStore и зарегистрировать их с помощью служб di

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

и, как уже упоминалось, ваши классы пользователей и ролей не должны наследоваться от реализаций EF, на самом деле им не нужно наследовать ни от чего, пока вы реализовали эти магазины, и они работают.

Вы можете использовать встроенный UserManager, если вы реализуете userstore и rolestore, это не требуется для реализации этого, если у вас нет других причин для этого.

Если вам нужен пример кода, вы можете посмотреть мой проект облаков. Я реализовал индивидуальную реализацию идентификации нескольких арендаторов, которая не использует структуру сущности. На самом деле я поддерживаю несколько лишних слоев данных, которые могут быть подключены, и EF является одним из них, но он отбирается от битов идентификации, и я ничего не использую из пространства имен Microsoft.AspNetCore.Identity.EntityFrameworkCore вообще.