Php Laravel中的SAML IDP-注销

Php Laravel中的SAML IDP-注销,php,laravel,saml,Php,Laravel,Saml,我有一个Laravel应用程序,用户可以通过我的应用程序(作为身份提供者)访问第三方应用程序 登录的灵感来自: 证书($this->private_key)) ->设置主体( (新建\LightSaml\Model\Assertion\Subject()) ->setNameID(新建\LightSaml\Model\Assertion\NameID( auth()->user()->电子邮件, \LightSaml\SamlConstants::名称\u ID\u格式\u电子邮件 )) ->

我有一个Laravel应用程序,用户可以通过我的应用程序(作为身份提供者)访问第三方应用程序

登录的灵感来自:


证书($this->private_key))
->设置主体(
(新建\LightSaml\Model\Assertion\Subject())
->setNameID(新建\LightSaml\Model\Assertion\NameID(
auth()->user()->电子邮件,
\LightSaml\SamlConstants::名称\u ID\u格式\u电子邮件
))
->添加主题确认(
(新建\LightSaml\Model\Assertion\SubjectConfirmation())
->setMethod(\LightSaml\SamlConstants::确认\u方法\u载体)
->setSubjectConfirmationData(
(新建\LightSaml\Model\Assertion\SubjectConfirmationData())
->setNotOnOrAfter(new\DateTime('+1分钟'))
->setRecipient($this->destination)
)
)
)
->设定条件(
(新建\LightSaml\Model\Assertion\Conditions())
->setNotBefore(新建\DateTime())
->setNotOnOrAfter(new\DateTime('+1分钟'))
->附加项(
新建\LightSaml\Model\Assertion\AudienceRestriction([$this->destination])
)
)
->附加项(
(新建\LightSaml\Model\Assertion\AttributeStatement())
->addAttribute(新建\LightSaml\Model\Assertion\Attribute(
\LightSaml\ClaimTypes::电子邮件地址,
auth()->user()->电子邮件,
))
->addAttribute(新建\LightSaml\Model\Assertion\Attribute(
\LightSaml\ClaimTypes::NAME\u ID,
auth()->user()->id,
))
)
->附加项(
(新建\LightSaml\Model\Assertion\autinstament())
->setAuthnInstant(新建\DateTime('-10分钟'))
->setSessionIndex(\LightSaml\Helper::generateID())
->setAuthnContext(
(新建\LightSaml\Model\Assertion\AuthnContext())
->setAuthnContextClassRef(\LightSaml\SamlConstants::AUTHN\u上下文\u窗口)
)
);
返回$this->sendSAMLResponse();
}
/**
*向服务提供商发送SAML响应,并向用户显示最终结果。
*如果此操作成功,则应将用户登录到SP。
*
*@param\LightSaml\Model\Protocol\Response$Response
*
*@返回无效
*/
私有函数sendSAMLResponse()
{
$bindingFactory=new\LightSaml\Binding\bindingFactory();
$postBinding=$bindingFactory->create(\LightSaml\SamlConstants::BINDING\u SAML2\u HTTP\u POST);
$messageContext=new\LightSaml\Context\Profile\messageContext();
$messageContext->setMessage($this->response)->asResponse();
$httpResponse=$postBinding->send($messageContext);
返回$httpResponse->getContent();
}
/**
*设置目的地。
*
*@返回无效
*/
私有函数setDestination()
{
$destination=config('samlidp.sp.aHR0cHM6Ly9zZXJ2aWNlcy11ay5zdW5nYXJkZHguY29tL1NpbmdsZVNpZ25Pbi9TZXJ2aWNlUHJvdmlkZXI=.destination');
$this->destination=$destination;
}
}
但是,当我尝试从SP执行SAML单次注销时,遇到了一个障碍

步骤如下:

  • SP发送注销请求
  • IDP回应
  • 因此,我有一个类似于上面的注销控制器

    
    <?php
    
    namespace App\Http\Controllers\Saml;
    
    use App\Http\Controllers\Controller;
    use App\Jobs\SamlSlo as JobsSamlSlo;
    use CodeGreenCreative\SamlIdp\Traits\PerformsSingleSignOn;
    use Illuminate\Http\Request;
    use Illuminate\Support\Str;
    use LightSaml\Helper;
    use LightSaml\Model\Assertion\Issuer;
    use LightSaml\Model\Assertion\NameID;
    use LightSaml\Model\Context\DeserializationContext;
    use LightSaml\Model\Protocol\LogoutRequest;
    use LightSaml\SamlConstants;
    use Log;
    
    class LogoutController extends Controller
    {
        use PerformsSingleSignOn;
    
        private $sp;
    
        /**
         * @param [type] $sp [description]
         */
        public function __construct()
        {
            $this->sp = config('samlidp.sp.aHR0cHM6Ly9zZXJ2aWNlcy11ay5zdW5nYXJkZHguY29tL1NpbmdsZVNpZ25Pbi9TZXJ2aWNlUHJvdmlkZXI=');
            $this->init();
        }
    
        public function index()
        {
            $this->setDestination();
    
            $this->setDestination();
    
            return redirect($this->request());
        }
    
        /**
         * [request description]
         * @return [type] [description]
         */
        public function request()
        {
            $this->response = (new LogoutRequest)
                ->setIssuer(new Issuer($this->issuer))
                ->setNameID((new NameID(Helper::generateID(), SamlConstants::NAME_ID_FORMAT_TRANSIENT)))
                ->setID(Helper::generateID())
                ->setIssueInstant(new \DateTime)
                ->setDestination($this->destination);
    
            return $this->send(SamlConstants::BINDING_SAML2_HTTP_REDIRECT);
        }
    
        private function setDestination()
        {
            $destination = $this->sp['logout'];
            $parsed_url = parse_url($destination);
            parse_str($parsed_url['query'] ?? '', $parsed_query_params);
            $parsed_query_params['idp'] = config('app.url');
    
            $this->destination = strtok($destination, '?') . '?' . http_build_query($parsed_query_params);
    
            Log::info($this->destination);
        }
    
    
    }
    
    
    
    
    
    <?php
    
    namespace App\Http\Controllers\Saml;
    
    use App\Http\Controllers\Controller;
    use App\Jobs\SamlSlo as JobsSamlSlo;
    use CodeGreenCreative\SamlIdp\Traits\PerformsSingleSignOn;
    use Illuminate\Http\Request;
    use Illuminate\Support\Str;
    use LightSaml\Helper;
    use LightSaml\Model\Assertion\Issuer;
    use LightSaml\Model\Assertion\NameID;
    use LightSaml\Model\Context\DeserializationContext;
    use LightSaml\Model\Protocol\LogoutRequest;
    use LightSaml\SamlConstants;
    use Log;
    
    class LogoutController extends Controller
    {
        use PerformsSingleSignOn;
    
        private $sp;
    
        /**
         * @param [type] $sp [description]
         */
        public function __construct()
        {
            $this->sp = config('samlidp.sp.aHR0cHM6Ly9zZXJ2aWNlcy11ay5zdW5nYXJkZHguY29tL1NpbmdsZVNpZ25Pbi9TZXJ2aWNlUHJvdmlkZXI=');
            $this->init();
        }
    
        public function index()
        {
            $this->setDestination();
    
            $this->setDestination();
    
            return redirect($this->request());
        }
    
        /**
         * [request description]
         * @return [type] [description]
         */
        public function request()
        {
            $this->response = (new LogoutRequest)
                ->setIssuer(new Issuer($this->issuer))
                ->setNameID((new NameID(Helper::generateID(), SamlConstants::NAME_ID_FORMAT_TRANSIENT)))
                ->setID(Helper::generateID())
                ->setIssueInstant(new \DateTime)
                ->setDestination($this->destination);
    
            return $this->send(SamlConstants::BINDING_SAML2_HTTP_REDIRECT);
        }
    
        private function setDestination()
        {
            $destination = $this->sp['logout'];
            $parsed_url = parse_url($destination);
            parse_str($parsed_url['query'] ?? '', $parsed_query_params);
            $parsed_query_params['idp'] = config('app.url');
    
            $this->destination = strtok($destination, '?') . '?' . http_build_query($parsed_query_params);
    
            Log::info($this->destination);
        }
    
    
    }