Я получаю эту ошибку в журнале 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