ASP.NET Core Web API: базовая аутентификация + сопоставление сертификатов

У меня есть веб-API ASP.NET Core, который использует базовую аутентификацию и требуется SSL.

У меня есть

services.AddAuthentication(o => {
                                    o.DefaultScheme = IISDefaults.AuthenticationScheme;
                                });

и в каждом контроллере [Authorize].

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

services.AddAuthentication(
             o => {
                      o.DefaultScheme = IISDefaults.AuthenticationScheme;
                  })
        .AddCertificate().

А в IIS я добавил аутентификацию сопоставления сертификатов клиента, чтобы он сопоставлял сертификат клиента с пользователем Windows testuser, и он работает правильно.

Потому что в inetpub/logs/ я вижу

2024-04-10 12:25:38 ::1 POST /sp/TestParams - 5264 testuser ::1 PostmanRuntime/7.29.2 - 401 0 0 383

поэтому он сопоставляется с «testuser».

Но почему я получаю ошибку:

HTTP 401 — неавторизованный

Что мне нужно добавить, чтобы все работало так, как я хочу. Работает ли это сопоставление сертификатов так, как я думал - что для приложения это = базовая / общая аутентификация Windows?

Мне также понадобится это «сопоставленное» имя пользователя в приложении позже из HttpContextAccessor.

Пожалуйста, порекомендуйте.

Спасибо и с уважением

Базовая аутентификация и Windows Auth — это две разные вещи. Не пытайтесь заставить оба одновременно. И попробуйте просто builder.Services.AddAuthentication( CertificateAuthenticationDefaults.AuthenticationScheme) .AddCertificate(); Какое у вас промежуточное программное обеспечение для авторизации?

Charlieface 10.04.2024 14:50

но мне также нужна базовая работа - можно ли ее обменять? Я знаю, что с iisdefaults будет работать то, что я настроил в iss. Если я сделаю это, то, по моему мнению, будет работать только сертификат autch?

Dorian 10.04.2024 17:57

На самом деле довольно сложно разрешить одновременно сертификаты и сертификаты другого типа. Вы можете установить для проверки подлинности сертификата IIS значение «Необязательно», но нет простого способа потребовать от клиента обслуживать либо базовую версию, либо сертификат.

Charlieface 10.04.2024 18:05

если я это сделаю, это работает, спасибо, но когда я получаю имя пользователя из HttpContextAccessor, я получаю CN сертификата, а не «сопоставленного» пользователя Windows из сопоставления сертификатов клиента?

Dorian 12.04.2024 08:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
206
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ок, для будущих искателей...

нет возможности иметь оба наконец, я добавил флаг в appsettings.json

if (a.UseCertMapingAuth)
 {
     services.AddAuthentication(CertificateAuthenticationDefaults.AuthenticationScheme).AddCertificate(
         o => 
         {
             o.RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck; 
         });
 }
 else
 {
     services.AddAuthentication(
         o =>
         {
             o.DefaultScheme = IISDefaults.AuthenticationScheme;
         });
 }

и я размещаю 2 проекта на 2 сайтах: один с базовым +сертификатом, а второй только с сертификатом.

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

Проблема аутентификации с клиентом Subversion (1.14) во время оформления заказа
Как отобразить страницу входа при доступе к сайту с помощью веб-приложения сервера Blazor с .NET 8.0
Webauthn – Как проверить/проверить возвращенные данные аутентификации регистрации с помощью React + Node.js
Запрос GraphQL всегда имеет код 403 даже при наличии действующего токена JWT
Ошибка с CORS в проекте с Angular и Laravel
Ошибка: несоответствие URI перенаправления при интеграции аутентификации Microsoft с Django
Ошибка входа в Azure AD B2C с ошибкой поставщика удостоверений Microsoft: для погашения кода авторизации между источниками требуется ключ подтверждения для обмена кодами
Избегайте сброса AccessFailedCount с помощью CheckPasswordSignIn в ASP.Net Identity
«Размер файла cookie сеанса превышает разрешенные 4096 байт». Получение этой ошибки следующей аутентификации после обновления nextJs 14.1.4 с 14.1.0
Разрешить не работать в API с идентификатором ASP.NET Core и токеном JWT