我目前正在开展一个项目,需要在身份提供商(IDP)和服务提供商(SP)之间实施单点登录(SSO)系统。 IDP 托管在可通过互联网访问的服务器上,而 SP 也托管在具有不同 URL 的不同服务器上。
考虑到 IDP 和 SP 位于不同的服务器上,我在配置 IDP 和 SP 之间的通信时面临挑战。我已经查阅了 SSO 文档,但我仍然发现理解如何配置元数据和端点以在两方之间建立安全且成功的通信很复杂。
我正在向社区寻求以下方面的帮助:
如何配置IDP和SP的元数据,使他们能够正确识别和认证对方? 为了实现安全连接,双方需要配置哪些端点? 在不同服务器上配置 IDP 和 SP 之间的通信时,是否需要记住任何具体注意事项? 如果您有类似配置的经验,或者您拥有在不同服务器之间设置单点登录的专业知识,我将非常感谢您提供的任何建议、指导或配置示例。
非常感谢您的时间和宝贵的帮助。
致以诚挚的问候,
此外,为了更好地说明我的情况,以下是我当前正在使用的详细信息和一些代码示例:
hslavich_onelogin_saml: sp: entityId: 'https://test.elium.com/login/saml2/metadata' assertionConsumerService: url: 'https://test.elium.com/login/saml2/acs' binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST' singleLogoutService: url: 'https://test.elium.com/login/saml2/sls' binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect' NameIDFormat: 'urn:oasis:names:tc:SAML:1.1:nameid-format:identifiant' idp: entityId: 'https://127.0.0.1:8000/saml/metadata' singleSignOnService: url: 'https://127.0.0.1:8000/saml/login' binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect' singleLogoutService: url: 'https://127.0.0.1:8000/saml/logout' binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect' x509cert: '%kernel.project_dir%/config/saml2/idp-public-cert.pem' x509certMulti: signing: ['%kernel.project_dir%/config/saml2/idp-private-key.pem']
https://127.0.0.1:8000 或 https://test-site.com
安全.yaml
`安全: 启用_authenticator_manager:true 密码哈希值: Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'
providers:
app_user_provider:
entity:
class: App\Entity\api\ApiUtilisateur
property: username
saml_provider:
saml:
user_class: App\Entity\utilisateur\Utilisateurs
default_roles: [ 'ROLE_USER' ]
firewalls:
app:
pattern: ^/saml
# saml_provider: saml_provider
saml:
provider: saml_provider
# Match SAML attribute 'uid' with username.
# Uses getNameId() method by default.
username_attribute: 'identifiant'
# Use the attribute's friendlyName instead of the name
use_attribute_friendly_name: true
check_path: saml_acs
login_path: saml_login
logout:
path: saml_logout
login:
pattern: ^/api/login
# stateless: true
api:
pattern: ^/(api(?!/(%app.supported_locales%)/docs)(?!/register))
stateless: true
provider: app_user_provider
guard:
authenticators:
- App\Security\JwtAuthenticator
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
lazy: true
provider: app_user_provider
form_login:
login_path: login
logout:
path: app_logout
invalidate_session: true
# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
- { path: ^/test, roles: ROLE_USER }
- { path: ^/slogin, roles: ROLE_USER }
- { path: ^/saml/login, roles: PUBLIC_ACCESS }
- { path: ^/saml/metadata, roles: PUBLIC_ACCESS }
- { path: ^/, role: ROLE_USER }`