故障排除

编辑本页

故障排除

如何调试和解决与bundle相关的常见问题。

TOTP /谷歌验证码不接受

TOTP/谷歌Authenticator的原理是两个系统(服务器和您的设备)根据共享密钥和当前时间生成相同的身份验证代码。如果这两个组件中的一个不同步,它们将生成不同的代码。因此:

  1. 最常见的问题:确保服务器时间和设备上的时间与当前实际时间同步
  2. 确保在您的设备中使用的秘密与服务器上为帐户配置的秘密相匹配
  3. 如果你正在使用TOTP,请确保应用程序实际上支持你正在使用的特定TOTP配置。谷歌Authenticator应用程序只支持一个特定的TOTP配置(6位代码,30秒窗口,sha1算法)

生成的身份验证代码有一个有效的时间窗口(在谷歌Authenticator中为30秒,对于TOTP,这取决于您的配置)。服务器和设备之间的时间差越大,时间窗口越小,服务器上生成的代码和应用程序生成的代码不匹配的可能性就越大。当时间差大于时间窗口时,就不可能提供正确的代码。

为了抵消时差的问题,你可以增加窗口设置,则当前时间窗口周围的更多代码将被接受:

12 3 4 5 6 7 8 9 10 11 12 13 14
#配置/包/ scheb_2fa.yamlscheb_two_factor:# TOTP你觉得:亮点:1#取决于使用的Spomky-Labs/otphp版本:#直到v10:在当前代码之前/之后将接受多少代码#从v11开始:以秒为单位的可接受时间漂移#用于谷歌认证器谷歌:亮点:1#取决于使用的Spomky-Labs/otphp版本:#直到v10:在当前代码之前/之后将接受多少代码#从v11开始:以秒为单位的可接受时间漂移

您可能希望配置一个时间同步服务,例如ntpdate以确保您的服务器时间始终与UTC同步。

谷歌认证器应用程序有一个选项来同步你的设备的时间。打开应用程序并选择>代码>的时间校正现在同步菜单上的。其他应用程序可能也有类似的选项。

注销重定向回双因素身份验证表单

问题

当显示双因素身份验证表单时,您希望取消双因素身份验证过程。单击“取消”链接,应该会执行注销操作。它不执行注销,而是重定向回双因素身份验证表单。

解决方案

如果你看到这样的行为access_control安全配置中的规则不允许访问注销路径。您的注销路径必须可以被具有任何身份验证状态的用户访问,这通常是通过允许进行PUBLIC_ACCESS.你很可能错过了下面的一条规则access_control在安全配置中。

配置应该类似如下:

1 2 3 4 5
#配置/包/ security.yaml安全:access_control:-路径:^ /注销,角色:PUBLIC_ACCESS这里有更多的规则…

确保该规则在列表中排在第一位,因为访问控制规则是按顺序计算的。

如果您有这样一个规则,但它仍然不起作用,则由于某种原因,该规则不匹配。一定要确保路径正则表达式匹配注销路径。如果您有其他选项,例如宿主知识产权,检查它们是否匹配。

完成双因素认证后未登录

问题

在您登录并成功通过双因素身份验证过程之后,您将不会登录。您要么被重定向回登录页面,要么显示的页面中缺少经过身份验证的用户。

故障排除

  1. 通过注释掉所有内容禁用双因素身份验证two_factor安全防火墙配置中的设置。尝试登录。这有用吗?

    是的,有用
    2)
    不,不行

    登录进程中断。

    解决方案:我看不出哪里出了问题。继续调试登录问题。在重新启用双因素身份验证之前,请先解决此问题。

  2. 从1)恢复更改。调试双因素身份验证表单页面上的安全令牌var_dump用它或任何其他合适的方法。

    令牌应该是类型TwoFactorToken这个领域authenticatedToken应该包含一个已验证的安全令牌。已验证的令牌是否具有通过身份验证准备好了吗?

    是的
    已验证的令牌被标记为无效。遵循下面的解决方案。
    没有
    3)
  3. 在完成双因素身份验证之后,当您最终处于未经身份验证的状态时,请检查Symfony概要分析器中的最后几个请求。ob娱乐下载

    对于每个请求,请转到Logs -> Debug。

    上面说了吗无法刷新令牌,因为用户已更改尝试刷新令牌后,令牌被取消了身份验证?

    是的
    已验证的令牌被标记为无效。遵循下面的解决方案。
    没有
    未知的问题。试着向别人寻求帮助制造问题让我们知道你已经测试了什么。

解决方案:您的身份验证令牌被标记为无效

很可能您的用户实体实现了一个可序列化的接口,并且不是所有与身份验证过程相关的字段都由序列化/反序列化处理。检查方法中使用了哪些字段serialize ()而且反序列化()

它必须至少是在方法中使用的字段ob娱乐下载\组件\安全\核心\用户\用户界面

如果您的用户实体实现ob娱乐下载\组件\安全\核心\用户\ AdvancedUserInterface,您还需要在中使用的字段isAccountNonExpired ()isAccountNonLocked ()isCredentialsNonExpired ()而且isEnabled ()

登录后不显示双因素认证表单

问题

成功登录后,将不显示双因素身份验证表单。相反,您要么登录,要么看到与应用程序不同的页面。

基本的检查

  • 您的登录页面属于防火墙,防火墙配置了双因素身份验证。
  • 登录页面、登录检查、2fa和2fa检查的路径都位于防火墙的路径中模式
  • 您的用户实体已经实现了接口,这是双因素身份验证方法所必需的。
  • 您的用户实体至少满足一种双因素身份验证方法的要求:

    • *启用()方法返回真正的
    • 返回身份验证方法的附加数据,例如谷歌身份验证器将使用getGoogleAuthenticatorSecret ()方法必须返回秘密代码。

access_control配置正确吗?

要在双因素身份验证过程中访问双因素身份验证表单,必须配置access_control2fa路由规则:

配置应该类似如下:

1 2 3 4 5 6 7 8
#配置/包/ security.yaml安全:#重要:访问控制规则需要放在列表的最顶端!access_control:#这可以确保表单只能在进行双因素身份验证时被访问。路径可能不同,这取决于你如何配置路由。-路径:^ / 2足总,角色:IS_AUTHENTICATED_2FA_IN_PROGRESS#其他规则可能会遵循这里…

确保规则排在列表的第一位,因为访问控制规则是按顺序计算的。

如果您已经在列表的顶部设置了这样的规则,请确保路径正则表达式匹配双因素身份验证表单路径。如果您有其他选项,例如宿主知识产权,检查它们是否匹配。

你的安全设置有什么特别之处吗?

问题通常源于应用程序安全设置中的自定义,这通常与如何授予角色有关。这类问题的例子有:

为了使2fa正常工作,必须完成两件事:ATwoFactorToken必须在登录后出现,并且在中间的“2fa incomplete”状态下,不能授予任何角色。后一个是通过TwoFactorToken上没有返回任何角色getRoleNames ()调用。但是,如果您以不同的方式而不是通过令牌授予角色,事情就会中断。

此问题的解决方案通常是跳过类型的安全令牌的任何自定义TwoFactorTokenInterface

1 2 3 4 5
使用SchebTwoFactorBundle安全身份验证令牌TwoFactorTokenInterface如果(!(令牌运算符TwoFactorTokenInterface)) {//你的定制在这里

故障排除

  1. 是一个TwoFactorToken登录后出现?

    是的
    2)
    没有
    3)
  2. 尝试访问需要对用户进行身份验证的页面。它是否重定向到双因素身份验证表单?

    是的
    解决方案:登录后看到的页面不需要完全身份验证的用户。这条路很可能是PUBLIC_ACCESS通过你的安全access_control配置。要么改变你的access_control配置或登录后强制重定向到用户到需要完全身份验证的页面。
    没有
    未知的问题。试着向别人寻求帮助制造问题让我们知道你已经测试了什么。
  3. 登录时,是否到达方法的结束(返回语句)Scheb\ TwoFactorBundle\安全\身份验证\提供者\ AuthenticationProviderDecorator:验证()?

    是的
    4)
    没有
    捆绑包的集成有些问题。试着通过创建一个问题来寻求帮助,并让我们知道你已经测试了什么。
  4. 登录时,是方法Scheb\ TwoFactorBundle\安全\ TwoFactor\处理程序\ TwoFactorProviderInitiator: getActiveTwoFactorProviders ()叫什么?

    是的,它叫
    5)
    不,它不叫
    解决方案:由于IP白名单或受信任的设备令牌,跳过了双因素身份验证。IP白名单是包配置的一部分。也许您已经将“localhost”或“127.0.0.1”列入白名单?可使用浏览器的开发人员工具删除受信任设备cookie。
  5. Scheb\ TwoFactorBundle\安全\ TwoFactor\处理程序\ TwoFactorProviderInitiator: getActiveTwoFactorProviders ()返回任何值?

    是的,它返回一个字符串数组
    未知的问题。试着向别人寻求帮助制造问题让我们知道你已经测试了什么。
    不,它返回一个空数组
    解决方案:我们的用户没有主动的双因素身份验证方法。要么*启用方法返回或者缺少一段重要的数据(例如谷歌验证者秘密)。

问题

完成2fa后,您希望该设备被标记为“受信任设备”,但未设置受信任设备cookie。

基本的检查

  • 2fa通过该呼叫完成,之后您已经完全验证。
  • 与2fa代码一起,您已经发送了可信参数(默认值)_trusted)与真正的式的值。(背景信息:设备不会自动标记为受信任。用户必须选择是否可以信任该设备。这就是为什么这个额外的参数必须发送过来。)

故障排除

查看发送2fa和可信参数时HTTP调用的响应。你看到饼干被设置了吗(set - cookie头)?

是的
请验证cookie的参数。确保该cookie的一切正常:路径、域和其他cookie选项。你试过吗将其设置为顶级域?
不,没有饼干套装
未知的问题。试着向别人寻求帮助制造问题让我们知道你已经测试了什么。
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。