У меня есть сервер 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();
}