我正在寻找有关如何使用spring security OAuth2实现双因素身份验证(2FA)的想法 . 要求是用户仅需要对具有敏感信息的特定应用程序进行双因素身份验证 . 这些webapps有自己的客户端ID .
我想到的一个想法是“误用”范围审批页面以强制用户输入2FA代码/ PIN(或其他) .
示例流程如下所示:
Accessing apps without and with 2FA
-
用户已注销
-
用户访问不需要2FA的应用A.
-
重定向到OAuth应用,用户使用用户名和密码登录
-
重定向回应用程序A并且用户已登录
-
用户访问app B,也不需要2FA
-
重定向到OAuth应用,重定向回应用B,用户直接登录
-
用户访问需要2FA的应用程序S.
-
重定向到OAuth应用,用户需要另外提供2FA令牌
-
重定向回应用程序S并且用户已登录
Directly accessing app with 2FA
-
用户已注销
-
用户访问需要2FA的应用程序S.
-
重定向到OAuth应用,用户使用用户名和密码登录,用户需要另外提供2FA令牌
-
重定向回应用程序S并且用户已登录
你有其他想法如何计算这个吗?
2 回答
所以这就是最终实现双因素身份验证的方式:
在spring安全过滤器之后,为/ oauth / authorize路径注册了一个过滤器:
此过滤器检查用户是否尚未使用第二个因素进行身份验证(通过检查
ROLE_TWO_FACTOR_AUTHENTICATED
权限是否不可用)并创建一个放入会话的OAuthAuthorizationRequest
. 然后,用户将被重定向到他必须输入2FA代码的页面:处理输入2FA代码的
TwoFactorAuthenticationController
如果代码正确则添加权限ROLE_TWO_FACTOR_AUTHENTICATED
并将用户重定向回/ oauth / authorize endpoints .自定义
OAuth2RequestFactory
从会话中检索以前保存的AuthorizationRequest
(如果可用),如果在会话中找不到,则返回该值或创建新的AuthorizationRequest
.此自定义OAuth2RequestFactory设置为授权服务器,如:
使用java配置时,您可以创建
TwoFactorAuthenticationInterceptor
而不是TwoFactorAuthenticationFilter
并使用AuthorizationServerConfigurer
注册它TwoFactorAuthenticationInterceptor
包含与preHandle
方法中TwoFactorAuthenticationFilter
相同的逻辑 .我无法使接受的解决方案有效 . 我一直在研究这个问题,最后我通过使用这里解释的想法并在这个帖子上写了我的解决方案“null client in OAuth2 Multi-Factor Authentication”
以下是我的工作解决方案的GitHub位置:https://github.com/turgos/oauth2-2FA
如果您发现任何问题或更好的方法,我感谢您分享您的反馈意见 .
您可以在下面找到此解决方案的关键配置文件 .
AuthorizationServerConfig
CustomOAuth2RequestFactory
WebSecurityConfig
TwoFactorAuthenticationFilter
TwoFactorAuthenticationController