У меня есть веб-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
.
Пожалуйста, порекомендуйте.
Спасибо и с уважением
но мне также нужна базовая работа - можно ли ее обменять? Я знаю, что с iisdefaults будет работать то, что я настроил в iss. Если я сделаю это, то, по моему мнению, будет работать только сертификат autch?
На самом деле довольно сложно разрешить одновременно сертификаты и сертификаты другого типа. Вы можете установить для проверки подлинности сертификата IIS значение «Необязательно», но нет простого способа потребовать от клиента обслуживать либо базовую версию, либо сертификат.
если я это сделаю, это работает, спасибо, но когда я получаю имя пользователя из HttpContextAccessor, я получаю CN сертификата, а не «сопоставленного» пользователя Windows из сопоставления сертификатов клиента?
ок, для будущих искателей...
нет возможности иметь оба наконец, я добавил флаг в 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 сайтах: один с базовым +сертификатом, а второй только с сертификатом.
Базовая аутентификация и Windows Auth — это две разные вещи. Не пытайтесь заставить оба одновременно. И попробуйте просто
builder.Services.AddAuthentication( CertificateAuthenticationDefaults.AuthenticationScheme) .AddCertificate();
Какое у вас промежуточное программное обеспечение для авторизации?