Страницы ошибок входа в систему сертификата клиента ADFS 2.0

У меня есть сервер ADFS 2.0, настроенный для использования аутентификации смарт-карт.

Он отлично работает, если пользователь уже существует в AD или не отключен.

Немного фона, мы работаем с лесом Active Directory, который использует стороннюю PKI для аутентификации пользователя. У нас нет доверия к исходной AD, только PKI, поэтому учетные записи пользователей будут создаваться по мере необходимости. Существует потенциальная возможность иметь десятки тысяч пользователей, поэтому мы хотим, чтобы этот процесс был корыстным.

Когда человеку не удается войти в систему (из-за того, что его учетная запись не существует или его учетная запись отключена), выдается две ошибки: событие 364, которое всегда одинаково, и событие 111, в котором говорится, что произошла ошибка имени пользователя / пароля или отключена учетная запись.

Страница ошибок, кажется, только извлекает (насколько я могу судить) из события 364, которое чрезвычайно бесполезно.

Есть ли способ выяснить, ПОЧЕМУ аутентификация пользователя не проходит во время входа в систему с помощью смарт-карты?

1 ответ

Решение

Я закончил тем, что переписал error.aspx.cs, чтобы запустить его и попытался захватить учетную запись, а затем проверить, есть ли что-то не так с ней.

Код довольно специфичен для моей среды, но все еще довольно просто написать в C#

Для тех, кто интересуется псевдокодом:

добавить к началу:

using System.Security.Cryptography.X509Certificates
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;

внизу page_load:

X509Certificate2 cert = new X509Certificate2(Request.this.Request.ClientCertificate);
X509Extension SAN = cert.Extensions["Subject Alternative Name"];

if (SAN!=null){
    string principalname = [parse out principalname from SAN];
    PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "DomainName", "OU");

    UserPrincipal principal= UserPrincipal.FindByIdentity(ctx, IdentityType.UserPrincipalName, principalname);

    if (principal!=null) {
         [check if disabled, display message accordingly]
         principal.Dispose();
    } else {
         [display message about account not exisiting]
    }
    ctx.Dispose();
}
Другие вопросы по тегам