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

发布了31 篇原创文章 · 获赞 8 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/oZuoYu123/article/details/98956297
今日推荐