PHP使用基於SMAL協議的AzureAD認證實現SSO

Azure Active Directory (Azure AD) 是 Microsoft 提供的多租戶、基於雲的目錄和標識管理服務。Azure AD 將核心目錄服務、應用程序訪問管理和標識保護組合到一個解決方案中,提供基於標準的平臺,幫助開發人員根據集中策略和規則爲其應用程序提供訪問控制。

SAML 即安全斷言標記語言,英文全稱是 Security Assertion Markup Language。它是一個基於 XML 的標準,用於在不同的安全域(security domain)之間交換認證和授權數據。在 SAML 標準定義了身份提供者IDP (identity provider) 和服務提供者SP (service provider),這兩者構成了前面所說的不同的安全域。 SAML 是 OASIS 組織安全服務技術委員會(Security Services Technical Committee) 的產品,目前採用的是SAML2.0協議。

單點登錄(SingleSignOn,SSO),就是通過用戶的一次性鑑別登錄。當用戶在身份認證服務器上登錄一次以後,即可獲得訪問單點登錄系統中其他聯邦系統和應用軟件的權限,同時這種實現是不需要管理員對用戶的登錄狀態或其他信息進行修改的,這意味着在多個應用系統中,用戶只需一次登錄就可以訪問所有相互信任的應用系統。

以下大體說個原理,還有很多需要在Azure上操作的東西,看手冊就好,大體流程是:

https://portal.azure.com

Azure Active Directory -> 企業應用程序 -> 新建應用程式 -> 非庫應用程序 -> 添加 -> 配置單一登陸 -> SAML

需要的參數都在下面講的。

首先要明確SAML中SP和IDP的關係,我們開發的系統就是SP,認證服務器是就是IDP,用戶通過Browser對SP進行訪問。

在基於SMAL協議的AzureAD認證這套體系中,AzureAD承擔了IDP的角色,整個驗證過程如下:

配置示例如下:

<?php
    // 這個指的是sp網站的域名,
    $spBaseUrl = 'http://samltest.pw'; //or http://<your_domain>

    $settingsInfo = array (
        // service provider 配置
        'sp' => array (
            // 標識ID, 這個ID目的是給IDP驗證是否允許使用的
            'entityId' => $spBaseUrl.'/demo1/index.php',
            // 斷言接受, 斷言就是⑤中的認證確認
            'assertionConsumerService' => array (
                // 這個也要配置到IDC上做 回調地址
                'url' => $spBaseUrl.'/demo1/index.php?acs',
            ),
            // 登出, 註銷登錄地址
            'singleLogoutService' => array (
                'url' => $spBaseUrl.'/demo1/index.php?sls',
            ),
            // NAME標識符 後邊會講
            'NameIDFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified',
        ),
        // idp 配置
        'idp' => array (
            // 因爲使用的 windows 的服務, 需要標識具體哪個idp提供服務, 設置平臺上會有
            'entityId' => 'https://sts.windows.net/6c4fda90-****-4241-8027-a79200b2a62c/',
            // 認證接口 設置平臺提供
            'singleSignOnService' => array (
                'url' => 'https://login.microsoftonline.com/6c4fda90-****-4241-8027-a79200b2a62c/saml2',
            ),
            // 退出接口 設置平臺提供
            'singleLogoutService' => array (
                'url' => 'https://login.microsoftonline.com/common/wsfederation?wa=wsignout1.0',
            ),
            // ssl證書
            'x509cert' => '',
        ),
    );

 後邊會給出示例代碼包

SP和IDP之間溝通的格式是需要 NameIDFormat 標示的。

應通過NAME標識符識別該主題,該標識符應採用某種格式,以便對方可以根據格式識別它。

1.urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified [default]

2.urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress

3.urn:oasis:names:tc:SAML:2.0:nameid-format:persistent

4.urn:oasis:names:tc:SAML:2.0:nameid-format:transient
是名稱標識符的格式

 

附代碼 https://gitee.com/ytliuxiaoyu/azureAD_saml.git

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章