IdentityServer4 не может добавить идентификатор ядра сети asp в пользовательское хранилище пользователей

#c# #asp.net-core #identityserver4 #asp.net-identity-3

#c# #asp.net-core #identityserver4 #asp.net-identity-3

Вопрос:

Я пытаюсь использовать свою пользовательскую реализацию IUserStore с идентификатором сетевого ядра IdentityServer4 Asp, шаги, которые я выполнил, создают новый шаблон IdentityServer с идентификатором сетевого ядра Asp, иначе is4aspid, после удаления ресурсов EntityFramework, тогда мои службы настройки выглядят так

     public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();

        services.AddScoped<IIdentityUserRepository<ApplicationUser>, IdentityUserRepository>(); //<-- Repository that I used on CustomUserStore

        services.AddDefaultIdentity<ApplicationUser>()
            .AddUserStore<CustomUserStore<ApplicationUser>>() //<-- Add
            .AddDefaultTokenProviders();

        var builder = services.AddIdentityServer(options =>
            {
                options.Events.RaiseErrorEvents = true;
                options.Events.RaiseInformationEvents = true;
                options.Events.RaiseFailureEvents = true;
                options.Events.RaiseSuccessEvents = true;

                // see https://identityserver4.readthedocs.io/en/latest/topics/resources.html
                options.EmitStaticAudienceClaim = true;
            })
            .AddInMemoryIdentityResources(Config.IdentityResources)
            .AddInMemoryApiScopes(Config.ApiScopes)
            .AddInMemoryClients(Config.Clients)
            .AddAspNetIdentity<ApplicationUser>();
    }
 

И пользовательское хранилище пользователей выглядит так

 public class CustomUserStore<TUser> :
    IUserStore<TUser>,
    IUserLoginStore<TUser>,
    IUserRoleStore<TUser>,
    IUserClaimStore<TUser>,
    IUserPasswordStore<TUser>,
    IUserSecurityStampStore<TUser>,
    IUserEmailStore<TUser>,
    IUserLockoutStore<TUser>,
    IUserPhoneNumberStore<TUser>
    where TUser : ApplicationUser
{
    private readonly IIdentityUserRepository<TUser> _userRepository;

    public CustomUserStore(IIdentityUserRepository<TUser> userRepository)
    {
        _userRepository = userRepository;
    } //rest of the code hidden sake of brevity
 

Пользовательское хранилище пользователей хорошо работает с шаблоном идентификатора ядра сети Asp по умолчанию, но в шаблоне is4aspid, когда я пытаюсь избавиться от Entity Framework и внедрить свою пользовательскую реализацию хранилища, страница входа возвращает сообщение 404 при попытке доступа к защищенному ресурсу, но, кроме того, домашняя страница работает правильно, нет сообщения об ошибке илисообщение о выходе из системы ниже

 [13:03:04 Information] Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler
AuthenticationScheme: Identity.Application was challenged.
 

Кроме того, пока это происходит, нет вызова контроллеров или CustomUserStore

Документация, которую я использовал

Пользовательские поставщики хранилища для ASP.NET Основная идентичность

IdentityServer4 с помощью ASP.NET Основная идентичность

Редактировать: класс ApplicationUser также является пользовательской реализацией без каких-либо наследников, в отличие от того, что по умолчанию ApplicationUser : IdentityUser поставляется с самим шаблоном

Ответ №1:

Я использую подобный код, чтобы добавить свой собственный магазин на IdentityServer:

 services.AddDbContext<ApplicationDbContext>(options =>
{
    options.UseSqlServer(_configuration["ConnectionString"]);
});

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

Комментарии:

1. Спасибо, но я хочу использовать свои пользовательские хранилища вместо entity framework, такие как docs.microsoft.com/en-us/aspnet/core/security/authentication /…

2. Какую именно ошибку вы получаете и по какому URL-адресу? если вы получаете 404, то это не проблема с пользовательским хранилищем, это что-то еще в вашей конфигурации.

3. когда я пытаюсь получить доступ к защищенному ресурсу, например, к странице диагностики, identityserver автоматически перенаправляется на /Identity/Account/Login?ReturnUrl=/diagnostics и выдает только 404, сообщения об ошибке или журнала нет, когда я отключаю мое пользовательское хранилище и использую EF Core, он снова начинает работать, и я изменяю только несколько строк кода в этом шаблоне, поэтому я недумаю, это может быть связано с конфигурацией

4. Я предполагаю, что тогда эта страница не существует, вы хотите использовать страницу входа в учетную запись IdentityServer или страницу, предоставленную ASP.NET Личность? Страницы для ASP.NET Идентификатор находится внутри библиотеки пакетов NuGet для идентификации.

5. Я хочу использовать страницу, которую предоставляет шаблон, и поэтому страница существует, сама проблема странная, потому что, как я уже сказал, я использую шаблон, а не свой код, все включенные страницы работают без проблем, пока я не добавлю AddUserStore<CustomUserStore<ApplicationUser>>() после того, как страница запроса (страница запрашивает имя пользователя и пароль) возвращает 404, я думаю, это может быть проблема среднего уровняно у меня нет журналов, сообщений об ошибках или единой подсказки

Ответ №2:

Проблема заключалась в AddDefaultIdentity том, что он не только добавляет компоненты идентификации, но и кучу вещей, включая пользовательский интерфейс, и я думаю, что проблема возникла из-за того, что компоненты пользовательского интерфейса были добавлены вместе с AddDefaultIdentity so, когда я пытался использовать представления проекта, это запутало структуру, решение использовало AddIdentity вместо AddDefaultIdentity so, это решило проблему, и теперь система работает без сбоев.