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

ADFS на Windows Server 2012R2 в Azure с выдачей исключения «Not a valid Win32 FileTime» при пассивной аутентификации

Я получаю эту ошибку в журнале ADFS Tracing - Debug:

ServiceHostManager.LogFailedAuthenticationInfo: Token of type 'http://schemas.microsoft.com/ws/2006/05/identitymodel/tokens/UserName' validation failed with following exception details:
 System.ArgumentOutOfRangeException: Not a valid Win32 FileTime.
Parameter name: fileTime
   at System.DateTime.FromFileTimeUtc(Int64 fileTime)
   at Microsoft.IdentityServer.Service.Tokens.LsaLogonUserHelper.GetPasswordExpiryDetails(SafeLsaReturnBufferHandle profileHandle, DateTime& nextPasswordChange, DateTime& lastPasswordChange)
   at Microsoft.IdentityServer.Service.Tokens.LsaLogonUserHelper.GetLsaLogonUserInfo(SafeHGlobalHandle pLogonInfo, Int32 logonInfoSize, DateTime& nextPasswordChange, DateTime& lastPasswordChange, String authenticationType, String issuerName)
   at Microsoft.IdentityServer.Service.Tokens.LsaLogonUserHelper.GetLsaLogonUser(UserNameSecurityToken token, DateTime& nextPasswordChange, DateTime& lastPasswordChange, String issuerName)
   at Microsoft.IdentityServer.Service.Tokens.MSISWindowsUserNameSecurityTokenHandler.ValidateTokenInternal(SecurityToken token)
   at Microsoft.IdentityServer.Service.Tokens.MSISWindowsUserNameSecurityTokenHandler.ValidateToken(SecurityToken token)

Я пытаюсь написать простое доказательство концепции C # Service Provider с использованием пассивной аутентификации.

Из C # SP я создаю SAMLRequest и перенаправляю браузер в ADFS.

ADFS запрашивает учетные данные форм, и при вводе отправляет обратно моему потребителю ресурсов SAML2.0 со следующим статусом:

<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Responder"/>

У меня есть два правила утверждения для этой проверяющей стороны.

c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]
 => issue(store = "Active Directory", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"), query = ";mail;{0}", param = c.Value);

И

c:[Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"]
 => issue(Type = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", Issuer = c.Issuer, OriginalIssuer = c.OriginalIssuer, Value = c.Value, ValueType = c.ValueType, Properties["http://schemas.xmlsoap.org/ws/2005/05/identity/claimproperties/format"] = "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified");

Я совершенно озадачен исключением «Not a valid Win32 FileTime», потому что похоже, что что-то в глубине ADFS пытается рассматривать что-то как временную метку, которая явно не содержит действительной временной метки.

Это сервер выпуска Windows Server 2012 R2 Datacenter, созданный на основе шаблона виртуальной машины Azure. Все, что я сделал, это установил ADFS и AD для тестирования.

Не то чтобы я думаю, что это должно иметь значение, но часовой пояс сервера по умолчанию - UTC.

Оказалось, что исключение «Not a valid Win32 FileTime» было отвлекающим маневром. Когда на следующий день я пошел протестировать его с настроенными утверждениями, я получил следующий код состояния:

<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:InvalidNameIDPolicy"/>

Должно быть, я случайно настроил некоторые нежелательные заявки, когда получал ошибку Win32 FileTime.

Углубившись в состояние InvalidNameIDPolicy, я заметил, что формат NameID в моем запросе был:

urn:oasis:names:tc:SAML:2.0:nameid-format:unspecified

И похоже, что это либо недействительно, либо не распознается ADFS. Переключение на запрос на указание следующей политики формата NameID решило проблему:

urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified