Как получить токен с сервера идентификации 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.

Другие вопросы по тегам