Назад | Перейти на главную страницу

Журнал сертификата клиента ADFS 2.0 на страницах ошибок

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

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

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

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

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

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

Я закончил тем, что переписал 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();
}