#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, это решило проблему, и теперь система работает без сбоев.