kaabar-sso/yii2-sso

将 Yii 2 应用程序连接到 SAML 身份提供者以实现单点登录

安装: 0

依赖项: 0

建议者: 0

安全: 0

星级: 0

关注者: 1

分支: 0

开放性问题: 0

类型:yii2-extension

dev-main 2023-08-09 12:56 UTC

This package is not auto-updated.

Last update: 2024-09-19 16:52:21 UTC


README

Kaabar SSO 登录

安装

安装此扩展的首选方法是通过 composer

运行

php composer.phar require --prefer-dist kaabar-sso/yii2-sso "*"

或将以下内容添加到您的 composer.json 文件的 require 部分。

"kaabar-sso/yii2-sso": "*"

关于 SAML

将您的 Yii2 应用程序与 SAML 身份提供者集成,以实现无缝的单点登录认证。

SAML,或安全断言标记语言,是一种广泛使用的标准,用于在不同的应用程序和服务之间启用单点登录(SSO)和身份联合。它允许在各方之间进行安全的身份验证和授权交换,通常是服务提供者(SP)和身份提供者(IdP)。以下是 SAML 的概述

  1. 身份验证和授权:SAML 促进不同系统之间身份验证和授权数据的共享。它允许用户一次性登录(单点登录),无需重新输入凭据即可访问多个应用程序。

  2. 组件:SAML 涉及三个主要组件:用户(主体)、服务提供者(SP)和身份提供者(IdP)。IdP 负责对用户进行身份验证,而 SP 则依赖于 IdP 的断言来授予访问权限。

  3. SAML 断言:断言是 SAML 的核心构建块。它们包含有关用户身份验证和属性的声明。主要有三种类型:身份验证断言、属性断言和授权决策断言。

  4. SAML 配置文件:SAML 配置文件定义了在特定用例中如何打包和交换断言。常见的配置文件包括 Web 浏览器单点登录、单点退出和增强客户端或代理(ECP)配置文件。

  5. SAML 工作流程:当用户访问 SP 时,SP 生成 SAML 身份验证请求并将用户重定向到 IdP。IdP 对用户进行身份验证并生成包含断言的 SAML 响应。然后,用户将带着 SAML 响应被重定向回 SP。

  6. 元数据:SAML 使用元数据来共享有关参与 SSO 进程的实体(IdP 和 SP)的信息。元数据包括端点、公钥和支持的绑定等详细信息。

  7. 安全:SAML 依赖于 XML 数字签名和可选的加密来确保交换数据的完整性和机密性。安全地管理私钥和证书至关重要。

  8. 用例:SAML 通常在企业环境、教育机构和联合系统中使用,以实现无缝访问各种应用程序。它还用于 Web 应用程序中的跨域单点登录。

  9. SAML 实现:框架和库,如 onelogin/php-saml 库,为 PHP 应用程序提供工具,可轻松实现基于 SAML 的 SSO。

  10. 优势:SAML 减少了用户管理多个凭据的需求,简化了用户配置和取消配置,并通过集中身份验证增强了安全性。

SAML 在简化用户访问多个系统的同时,保持了安全和隐私标准。其广泛采用和兼容性使其成为现代身份和访问管理解决方案的基本组件。

配置

config/web.php 中将 kaabar\sso\Saml 注册到您的组件。

'components' => [
    'saml' => [
        'class' => 'kaabar\sso\Saml',
        'configFileName' => '@app/config/saml.php', // OneLogin_Saml config file (Optional)
    ]
]

要启用此组件,应在 PHP 文件中存储 OneLogin_Saml 配置。默认情况下,configFileName 被设置为 @app/config/saml.php,因此请确保事先创建此文件。该文件应返回 OneLogin_Saml 配置。有关示例配置,请参阅提供的 链接

<?php

$urlManager = Yii::$app->urlManager;
$spBaseUrl = $urlManager->getHostInfo() . $urlManager->getBaseUrl();

return [
    'sp' => [
        'entityId' => $spBaseUrl.'/saml/metadata',
        'assertionConsumerService' => [
            'url' => $spBaseUrl.'/saml/acs',
        ],
        'singleLogoutService' => [
            'url' => $spBaseUrl.'/saml/sls',
        ],
        'NameIDFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified',
    ],
    'idp' => [
        'entityId' => '<URL>', // https://login.microsoftonline.com/51487458-d114-43b9-1234-4e6r75ee86e9
        'singleSignOnService' => [
            'url' => '<URL>', // https://login.microsoftonline.com/51487458-d114-43b9-1234-4e6r75ee86e9/saml2
        ],
        'singleLogoutService' => [
            'url' => '<URL>', // https://login.microsoftonline.com/51487458-d114-43b9-1234-4e6r75ee86e9/saml2
        ],
        'x509cert' => '<x509cert script>',
    ],
];

使用

此扩展提供5个操作

  1. 登录操作

    此操作作为启动向身份提供者登录过程的催化剂,具体如配置文件中所述。通过将此操作集成到您的控制器操作中,您可无缝激活与指定身份提供者的单点登录认证过程。此集成通过简单的设置过程简化了用户访问。只需在控制器中配置和注册此操作,即可与指定的身份提供者高效交互,增强您应用程序的认证功能。

    <?php
    
    namespace app\controllers;
    
    use Yii;
    use yii\web\Controller;
    use yii\helpers\Url;
    
    
    class SamlController extends Controller {
    
        // Remove CSRF protection
        public $enableCsrfValidation = false;
    
        public function actions() {
            return [
                'login' => [
                    'class' => 'kaabar\sso\actions\LoginAction',
                    'returnTo' => Yii::app()->user->returnUrl
                ]
            ];
        }
    }

    登录方法可以接收七个可选参数

    • $returnTo - 用户登录后应返回的目标URL。
    • $parameters - 一个数组,其中的参数将被添加到HTTP重定向中的GET请求中。
    • $forceAuthn - 当为true时,AuthNRequest将设置ForceAuthn='true'
    • $isPassive - 当为true时,AuthNRequest将设置Ispassive='true'
    • $strict - 如果我们想停留(返回URL字符串),则设置为true;如果想要重定向,则设置为false。
    • $setNameIdPolicy - 当为true时,AuthNRequest将设置一个nameIdPolicy元素。
    • $nameIdValueReq - 向IdP指示应进行认证的实体。

    现在您可以通过访问:saml/login来访问您的身份提供者的登录页面。

  2. Acs操作

    此操作旨在处理身份提供者在成功登录后传输的SAML响应。您可以选择注册回调函数,以实现从身份提供者响应中提取属性和基于这些属性创建用户等操作。要实现此功能,只需将其添加并注册到控制器操作列表中即可。这允许您无缝集成基于SAML的认证过程,同时根据您应用程序的需求自定义用户交互。

    <?php
    
    namespace app\controllers;
    
    use Yii;
    use yii\web\Controller;
    use yii\helpers\Url;
    
    
    class SamlController extends Controller {
    
        // Remove CSRF protection
        public $enableCsrfValidation = false;
    
        public function actions() {
            return [
                ...
                'acs' => [
                    'class' => 'kaabar\sso\actions\AcsAction',
                    'successCallback' => [$this, 'callback'],
                    'successUrl' => Url::to('site/welcome'),
                ]
            ];
        }
    
        /**
         * @param array $param has 'attributes', 'nameId' , 'sessionIndex', 'nameIdNameQualifier' and 'nameIdSPNameQualifier' from response
         */
        public function callback($param) {
            // do something
            //
            // if (isset($_POST['RelayState'])) {
            // $_POST['RelayState'] - should be returnUrl from login action
            // }
        }
    }

    注意:请确保在身份提供者中注册acs操作的URL到AssertionConsumerService,并将sls操作的URL注册到SingleLogoutService(如果支持)。

  3. 元数据操作

    此操作将以XML格式显示您应用程序的元数据。要利用此功能,只需在控制器操作列表中注册此操作即可。这使得您能够轻松访问并以结构化的XML表示形式呈现应用程序的元数据。

    <?php
    
        public function actions() {
            return [
                ...
                'metadata' => [
                    'class' => 'kaabar\sso\actions\MetadataAction'
                ]
            ];
        }
  4. 注销操作

    通过调用此操作,您可以触发针对身份提供者的单点注销过程。要集成此功能,只需轻松地在控制器操作数组中注册此操作即可。这种方法简化了您与指定身份提供者的单点注销过程,增强了您应用程序的安全性和用户管理功能。

    <?php
        $session = Yii::$app->session;
        public function actions() {
            return [
                ...
                'logout' => [
                    'class' => 'kaabar\sso\actions\LogoutAction',
                    'returnTo' => Url::to('site/bye'),
                    'parameters' => [],
                    'nameId' => $session->get('nameId'),
                    'sessionIndex' => $session->get('sessionIndex'),
                    'stay' => false,
                    'nameIdFormat' => null,
                    'nameIdNameQualifier' => $session->get('nameIdNameQualifier'),
                    'nameIdSPNameQualifier' => $session->get('nameIdSPNameQualifier'),
                    'logoutIdP' => false, // if you don't want to logout on idp
                ]
            ];
        }
  5. Sls操作

    此操作可处理身份提供者发送的SAML注销请求/响应。要使用此功能,只需在控制器操作列表中注册此操作即可。通过这样做,您使应用程序能够有效处理基于SAML的注销交互,从而提高系统的整体安全和用户体验。

    <?php
    
        public function actions() {
            ...
    
            return [
                ...
                'sls' => [
                    'class' => 'kaabar\sso\actions\SlsAction',
                    'successUrl' => Url::to('site/bye'),
                    'logoutIdP' => false, // if you don't want to logout on idp
                ]
            ]
        }

使用

如果SAMLResponse被拒绝,请将参数添加到SAML设置中

'debug' => true,

并将显示原因。

许可协议

MIT许可协议