Как получить токен с сервера идентификации Duende (IdentityServer4)
Несколько дней я читаю сервер идентификации Duende (IdentityServer4), поэтому я знаю о различных концепциях и их использовании, таких как области действия, ресурсы, клиент...
Область, в которой я смущен, - это клиенты. Поэтому я интегрировал AspIdentity в качестве ApplicationUser в IdentityServer (вы можете найти конфигурации ниже в разделах кода), но когда я хочу вызвать /connect/token, который является предопределенной конечной точкой от Duende, ему нужно добавить ClientId и Секрет, но я хочу использовать имя пользователя и пароль моего зарегистрированного пользователя.
Итак, идея, которая приходит мне в голову, состоит в том, чтобы создать настраиваемую конечную точку: после проверки учетных данных пользователя с помощью SignInManager я найду клиент Users, а затем войду в Duende IdentityServer, однако я пытался это сделать, но это немного неудобно. сделать повторный HTTP-вызов к тому же сервису для получения токена Пользователя.
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlite(connectionString));
builder.Services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
builder.Services.AddSwaggerGen();
builder.Services
.AddIdentityServer(options =>
{
options.Events.RaiseErrorEvents = true;
options.Events.RaiseInformationEvents = true;
options.Events.RaiseFailureEvents = true;
options.Events.RaiseSuccessEvents = true;
options.EmitStaticAudienceClaim = true;
})
.AddAspNetIdentity<ApplicationUser>()
.AddConfigurationStore(options =>
{
options.ConfigureDbContext = b =>
b.UseSqlite(connectionString, dbOpts => dbOpts.MigrationsAssembly(typeof(Program).Assembly.FullName));
})
.AddOperationalStore(options =>
{
options.ConfigureDbContext = b =>
b.UseSqlite(connectionString, dbOpts => dbOpts.MigrationsAssembly(typeof(Program).Assembly.FullName));
options.EnableTokenCleanup = true;
options.RemoveConsumedTokens = true;
});
builder.Services.AddAuthentication();
если я могу решить эту проблему удобным способом, чтобы другие шаги были очень очевидными и простыми.
2 ответа
clientID и секреты предназначены для идентификации приложения, которое хочет подключиться к IdentityServer, а не пользователя; почему нельзя использовать clientID/secret для того, для чего он предназначен?
Кроме того, основная цель подключения OpenID — не позволять клиентскому приложению касаться или видеть имя пользователя/пароль пользователя. Вот почему мы делегируем аутентификацию IdentityServer.
Клиенты в Identity Server — это тип платформ или приложений, которые будут использовать этот Identity Server и запрашивать аутентификацию с этого Identity Server. Вы можете зарегистрировать столько клиентов, сколько захотите. Вы также можете указать, каким объемом информации вы поделитесь с каким клиентом. Прочтите эту статью для лучшего понимания. https://docs.duendesoftware.com/identityserver/v6/fundamentals/clients/
Когда вы делаете запрос на аутентификацию из любого приложения, вам необходимо указать клиент, чтобы Identity Server мог проверить информацию об областях, ресурсах, перенаправить URL-адреса указанного клиента, а затем соответствующим образом обработать запрос.
по сути, отправка сведений о клиенте просто указывает, что это приложение зарегистрировано для запроса токена с Identity Server.