注意 - 我实际上已经解决了这个问题,但是我没有在网上看到任何关于这个问题的详细文章,所以我会继续提出问题并自己回答。
我运行一个以SMTPRelayUser身份进行身份验证的服务,该服务在大约 95% 的情况下开始未能通过 ADFS 身份验证。令人费解的是,这个用户偶尔会成功验证并发送所有排队的邮件。在 ADFS 事件查看器日志中,我看到了两个错误——事件 300 和事件 413。事件 ID 300 没有提供任何有用的信息,但 413 通知了我一个奇怪的异常。
Microsoft.IdentityServer.Service.AccountPolicy.ADAccountLookupException: Exception of type 'Microsoft.IdentityServer.Service.AccountPolicy.ADAccountLookupException' was thrown.
这是怎么回事?
我检查了跨域控制器的此帐户的复制,并且看不出这应该失败的原因。我打开了 ADFS 调试日志并尝试再次登录。这一次,我得到了一个非常明确的警告,在 ADFS 跟踪调试日志中继续出现了ADAccountLookupException 。
事件 ID 53: AccountLockoutPolicy.IsAccountThrottled:系统无法读取用户 [email protected] 的错误密码计数。
在我的 ADFS 场支持的 DC 上检查 SMTPRelayUser 的badPwdCount AD 属性后,我看到它确实没有设置。
此时我记得我已经启用了ADFS 2012 R2 Extranet Lockout Protection一段时间,它与登录问题的出现同时发生。显然,如果未设置badPwdCount,Extranet Lockout Protection 功能中存在一个错误,该错误会引发异常。我禁用了 Extranet Lockout Protection 功能,并且登录效果很好。
那么为什么我的身份验证在 5% 的时间内有效呢?badPwdCount不会跨域控制器复制。每个 DC 都有自己的计数。有时,ADFS 实际上会咨询设置了badPwdCount值并成功进行身份验证的 DC。
这个故事的寓意是,如果您在 ADFS 中使用 Extranet Lockout Protection 功能,请务必小心。我自己只是暂时禁用了它。