我们有一个使用devise
进行身份验证的Rails应用程序。我们使用OKTA作为IDP,并使用devise_saml_authenticatable
来管理SAML身份验证。
我们从Rails 4.2.4-> 4.2.11对应用程序进行了相当小的升级,设计了3.5.6-> 3.5.10。 devise_saml_authenticatable
保持在1.2.2。其他许多库也进行了更新。
升级后,除此身份验证部分外,有关该应用程序的所有内容均正常运行。它似乎陷入了无限重定向循环中。与工作版本相比,似乎一切正常,直到最后一步看到Completed 401 Unauthorized
。
SAMLResponse
发布到/users/saml/auth
Completed 401 Unauthorized in 56ms
我们确认第4步有效,因为我们可以在数据库中看到新的用户行。但是,奇怪的是current_user之后仍然为空。
我添加了这样的测试垫片
before_action :my_authenticate_user!
def my_authenticate_user!
logger.info("AUTH USER!")
if current_user.blank?
logger.error("CURRENT USER IS BLANK!")
end
authenticate_user!
end
在日志中,我在SAMLResponse发布后看到了这一点:
16:27:10 web.1 | D, [2019-02-20T16:27:10.223289 #51095] DEBUG -- : User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."email" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["email", "XYZ@xyz.com"]]
16:27:10 web.1 | I, [2019-02-20T16:27:10.224028 #51095] INFO -- : Setting: name, XYZ
16:27:10 web.1 | I, [2019-02-20T16:27:10.224596 #51095] INFO -- : Setting: email, XYZ@xyz.com
16:27:10 web.1 | I, [2019-02-20T16:27:10.225235 #51095] INFO -- : Setting: role, admin
16:27:10 web.1 | D, [2019-02-20T16:27:10.226268 #51095] DEBUG -- : (0.2ms) BEGIN
16:27:10 web.1 | D, [2019-02-20T16:27:10.227744 #51095] DEBUG -- : (0.3ms) COMMIT
16:27:10 web.1 | I, [2019-02-20T16:27:10.258703 #51095] INFO -- : AUTH USER!
16:27:10 web.1 | E, [2019-02-20T16:27:10.259194 #51095] ERROR -- : CURRENT USER IS BLANK!
16:27:10 web.1 | I, [2019-02-20T16:27:10.261914 #51095] INFO -- : Completed 401 Unauthorized in 74ms (ActiveRecord: 1.1ms)
在工作版本(升级前)中,所有操作均完全相同,只是在步骤#5身份验证有效,并且应用程序继续进行,而不是重定向回OKTA。
还原升级的工作对我们来说并不太有用-升级是必需的,因此目标是尝试使用升级的库修复此问题。
我尝试过的一些事情到目前为止还没有帮助:
devise_for :users
)路由到routes子句的顶部我们使用Devise的方式似乎很标准?
我们将authenticate_user!
中的before_action
称为ApplicationController
class ApplicationController < ActionController::Base
if Authentication.type.disabled?
before_action :set_guest_user
else
before_action :authenticate_user!
end
用户模型具有此
class User < ActiveRecord::Base
if Authentication.type.saml?
devise :saml_authenticatable, :rememberable
在我们的路线中,这是
Rails.application.routes.draw do
mount RailsAdmin::Engine => '/admin', as: 'rails_admin'
devise_for :users
我应该提到的另一件事是前端是有角度的,但是我不确定这将如何或为什么会影响任何身份验证。
任何有关如何以及在何处挖掘Devise / Rails胆量的建议都值得赞赏!