故障排除
编辑本页故障排除
如何调试和解决与bundle相关的常见问题。
TOTP /谷歌验证码不接受
TOTP/谷歌Authenticator的原理是两个系统(服务器和您的设备)根据共享密钥和当前时间生成相同的身份验证代码。如果这两个组件中的一个不同步,它们将生成不同的代码。因此:
- 最常见的问题:确保服务器时间和设备上的时间与当前实际时间同步
- 确保在您的设备中使用的秘密与服务器上为帐户配置的秘密相匹配
- 如果你正在使用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}这里有更多的规则…
确保该规则在列表中排在第一位,因为访问控制规则是按顺序计算的。
如果您有这样一个规则,但它仍然不起作用,则由于某种原因,该规则不匹配。一定要确保路径
正则表达式匹配注销路径。如果您有其他选项,例如宿主
或知识产权
,检查它们是否匹配。
完成双因素认证后未登录
问题
在您登录并成功通过双因素身份验证过程之后,您将不会登录。您要么被重定向回登录页面,要么显示的页面中缺少经过身份验证的用户。
故障排除
通过注释掉所有内容禁用双因素身份验证
two_factor
安全防火墙配置中的设置。尝试登录。这有用吗?- 是的,有用
- 2)
- 不,不行
-
登录进程中断。
解决方案:我看不出哪里出了问题。继续调试登录问题。在重新启用双因素身份验证之前,请先解决此问题。
从1)恢复更改。调试双因素身份验证表单页面上的安全令牌
var_dump
用它或任何其他合适的方法。令牌应该是类型
TwoFactorToken
这个领域authenticatedToken
应该包含一个已验证的安全令牌。已验证的令牌是否具有通过身份验证
=假
准备好了吗?- 是的
- 已验证的令牌被标记为无效。遵循下面的解决方案。
- 没有
- 3)
在完成双因素身份验证之后,当您最终处于未经身份验证的状态时,请检查Symfony概要分析器中的最后几个请求。ob娱乐下载
对于每个请求,请转到Logs -> Debug。
上面说了吗
无法刷新令牌,因为用户已更改
或尝试刷新令牌后,令牌被取消了身份验证
?- 是的
- 已验证的令牌被标记为无效。遵循下面的解决方案。
- 没有
- 未知的问题。试着向别人寻求帮助制造问题让我们知道你已经测试了什么。
解决方案:您的身份验证令牌被标记为无效
很可能您的用户实体实现了一个可序列化的接口,并且不是所有与身份验证过程相关的字段都由序列化/反序列化处理。检查方法中使用了哪些字段serialize ()
而且反序列化()
.
它必须至少是在方法中使用的字段ob娱乐下载
.
如果您的用户实体实现ob娱乐下载
,您还需要在中使用的字段isAccountNonExpired ()
,isAccountNonLocked ()
,isCredentialsNonExpired ()
而且isEnabled ()
.
登录后不显示双因素认证表单
问题
成功登录后,将不显示双因素身份验证表单。相反,您要么登录,要么看到与应用程序不同的页面。
基本的检查
- 您的登录页面属于防火墙,防火墙配置了双因素身份验证。
- 登录页面、登录检查、2fa和2fa检查的路径都位于防火墙的路径中
模式
. - 您的用户实体已经实现了接口,这是双因素身份验证方法所必需的。
您的用户实体至少满足一种双因素身份验证方法的要求:
- 的
*启用()
方法返回真正的
- 返回身份验证方法的附加数据,例如谷歌身份验证器将使用
getGoogleAuthenticatorSecret ()
方法必须返回秘密代码。
- 的
是access_control
配置正确吗?
要在双因素身份验证过程中访问双因素身份验证表单,必须配置access_control
2fa路由规则:
配置应该类似如下:
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
使用Scheb\TwoFactorBundle\安全\身份验证\令牌\TwoFactorTokenInterface;如果(!($令牌运算符TwoFactorTokenInterface)) {//你的定制在这里}
故障排除
是一个
TwoFactorToken
登录后出现?- 是的
- 2)
- 没有
- 3)
尝试访问需要对用户进行身份验证的页面。它是否重定向到双因素身份验证表单?
- 是的
-
解决方案:登录后看到的页面不需要完全身份验证的用户。这条路很可能是
PUBLIC_ACCESS
通过你的安全access_control
配置。要么改变你的access_control
配置或登录后强制重定向到用户到需要完全身份验证的页面。 - 没有
- 未知的问题。试着向别人寻求帮助制造问题让我们知道你已经测试了什么。
登录时,是否到达方法的结束(返回语句)
Scheb
?\ TwoFactorBundle \安全 \身份验证 \提供者 \ AuthenticationProviderDecorator:验证() - 是的
- 4)
- 没有
- 捆绑包的集成有些问题。试着通过创建一个问题来寻求帮助,并让我们知道你已经测试了什么。
登录时,是方法
Scheb
叫什么?\ TwoFactorBundle \安全 \ TwoFactor \处理程序 \ TwoFactorProviderInitiator: getActiveTwoFactorProviders () - 是的,它叫
- 5)
- 不,它不叫
- 解决方案:由于IP白名单或受信任的设备令牌,跳过了双因素身份验证。IP白名单是包配置的一部分。也许您已经将“localhost”或“127.0.0.1”列入白名单?可使用浏览器的开发人员工具删除受信任设备cookie。
做
Scheb
返回任何值?\ TwoFactorBundle \安全 \ TwoFactor \处理程序 \ TwoFactorProviderInitiator: getActiveTwoFactorProviders () - 是的,它返回一个字符串数组
- 未知的问题。试着向别人寻求帮助制造问题让我们知道你已经测试了什么。
- 不,它返回一个空数组
-
解决方案:我们的用户没有主动的双因素身份验证方法。要么
*启用
方法返回假
或者缺少一段重要的数据(例如谷歌验证者秘密)。
未设置可信设备cookie
问题
完成2fa后,您希望该设备被标记为“受信任设备”,但未设置受信任设备cookie。
基本的检查
- 2fa通过该呼叫完成,之后您已经完全验证。
- 与2fa代码一起,您已经发送了可信参数(默认值)
_trusted
)与真正的
式的值。(背景信息:设备不会自动标记为受信任。用户必须选择是否可以信任该设备。这就是为什么这个额外的参数必须发送过来。)