如何在基于 SimpleSAMLphp 的 IdP 中将 NameId 的值替换为属性?



我正在尝试设置 SimpleSAMLphp IdP 以将 SAML 响应发送到我的本地开发服务器(在本例中为 SP 发起的流(。此 IdP 基于 https://hub.docker.com/r/kristophjunge/test-saml-idp/年的 Docker 映像(我相信版本 1.15

(。整个设置是模拟我拥有的类似环境,其中G Suite IdP用于相同的本地开发SP - 试图最终消除本地开发环境中的云依赖性,并将其替换为等效的SimpleSAMLphp。

我遇到的问题是谷歌在其SAML响应中发送NameId,如下所示:

<saml2:Subject> 
<saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">a.b@c.com</saml2:NameID> 
<saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"> 
<saml2:SubjectConfirmationData InResponseTo="ONELOGIN_88ebd953f02c07d01b19714cd70133827ff1228e" NotOnOrAfter="2018-05-07T20:21:25.433Z" .                         Recipient="https://ee0138c4.ngrok.io/saml/?acs" /> 
</saml2:SubjectConfirmation>
</saml2:Subject>

但是SimpleSAMLphp以这种格式发送它:

<saml:Subject> 
<saml:NameID SPNameQualifier="https://ee0138c4.ngrok.io/saml/metadata" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">_69d05500bd6e797de3674df0165facbfa0af699589</saml:NameID> 
<saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"> <saml:SubjectConfirmationData NotOnOrAfter="2018-05-09T17:47:57Z" Recipient="https://ee0138c4.ngrok.io/saml/?acs" InResponseTo="ONELOGIN_170bb7a0ff82100318ba498583e8e59cdae8607b" /> 
</saml:SubjectConfirmation> 
</saml:Subject>

我需要它是一个属性值

(a.b@c.com而不是_69d05500bd6e797de3674df0165facbfa0af699589(

然后我可以在我的SP的逻辑中抓取它,而是发送一些随机数,我假设它是一个瞬态ID。

以下是我的配置:

要启动 Docker 容器,请执行以下操作:

docker run --name=testsamlidp_idp 
-p 8080:8080 
-p 8443:8443 
-e SIMPLESAMLPHP_SP_ENTITY_ID=https://ee0138c4.ngrok.io/saml/metadata 
-e SIMPLESAMLPHP_SP_ASSERTION_CONSUMER_SERVICE=https://ee0138c4.ngrok.io/saml/?acs  
-e SIMPLESAMLPHP_SP_SINGLE_LOGOUT_SERVICE=http://localhost/simplesaml/module.php/saml/sp/saml2-logout.php/test-sp 
-v $(pwd)/users.php:/var/www/simplesamlphp/config/authsources.php 
-v $(pwd)/_saml20-sp-remote.php:/var/www/simplesamlphp/config/saml20-sp-remote.php 
-d kristophjunge/test-saml-idp

其中用户.php包含:

<?php
$config = array(
'admin' => array(
'core:AdminPassword',
),
'example-userpass' => array(
'exampleauth:UserPass',
'user1:user1pass' => array(
'uid' => array('1'),
'Groups' => array('group1','group2', 'group3'),
'email' => 'user1@example.com',
),
'user2:user2pass' => array(
'uid' => array('2'),
'Groups' => array('group2', 'group4', 'group5'),
'email' => 'user2@example.com',
),
),
);

_saml20-sp-remote.php是:

<?php
/**
* SAML 2.0 remote SP metadata for SimpleSAMLphp.
*
* See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-sp-remote
*/
$metadata[getenv('SIMPLESAMLPHP_SP_ENTITY_ID')] = array(
'AssertionConsumerService' => getenv('SIMPLESAMLPHP_SP_ASSERTION_CONSUMER_SERVICE'),
'SingleLogoutService' => getenv('SIMPLESAMLPHP_SP_SINGLE_LOGOUT_SERVICE'),
#'NameIDFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:persistent',
#'simplesaml.nameidattribute' => 'email',
#'simplesaml.attributes' => FALSE,
'authproc.idp' => array(
/* Filter to create a NameID with the "unspecified" format. */
3 => array(
'class' => 'saml:AtrributeNameID',
'attribute' => 'email',
'Format' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress',
),
),
/* Select the unspecified NameID format by default. */
'NameIDFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified',
);

我假设这是后一个文件中的某种错误配置,也许有人可以帮我了解它的底部。

提前谢谢你。

以下设置对我有用:

码头工人启动脚本:

docker run --name=testsamlidp_idp 
-p 8080:8080 
-p 8443:8443 
-e SIMPLESAMLPHP_SP_ENTITY_ID=https://ee0138c4.ngrok.io/saml/metadata 
-e SIMPLESAMLPHP_SP_ASSERTION_CONSUMER_SERVICE=https://ee0138c4.ngrok.io/saml/?acs  
-e SIMPLESAMLPHP_SP_SINGLE_LOGOUT_SERVICE=http://localhost/simplesaml/module.php/saml/sp/saml2-logout.php/test-sp 
-v $(pwd)/users.php:/var/www/simplesamlphp/config/authsources.php 
-v $(pwd)/saml20-idp-hosted.php:/var/www/simplesamlphp/metadata/saml20-idp-hosted.php 
-d kristophjunge/test-saml-idp

saml20-idp-hosted.php在 Docker 容器中的/var/www/simplesamlphp/metadata/saml20-idp-hosted.php

<?php
$metadata['__DYNAMIC:1__'] = array(
/*
* The hostname of the server (VHOST) that will use this SAML entity.
*
* Can be '__DEFAULT__', to use this entry by default.
*/
'host' => '__DEFAULT__',
// X.509 key and certificate. Relative to the cert directory.
'privatekey' => 'server.pem',
'certificate' => 'server.crt',
/*
* Authentication source to use. Must be one that is configured in
* 'config/authsources.php'.
*/
'auth' => 'example-userpass',
'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',

// refer to https://simplesamlphp.org/docs/stable/saml:nameid
'authproc' => array(
3 => array(
'class' => 'saml:AttributeNameID',
'attribute' => 'email',
'Format' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
),
),
);

NameIDFormatFormat都是必要的。email应对应于 中指定的属性

authsources.php/var/www/simplesamlphp/config的 Docker 容器

<?php
$config = array(
'admin' => array(
'core:AdminPassword',
),
'example-userpass' => array(
'exampleauth:UserPass',
'user1:user1pass' => array(
'uid' => array('1'),
'Groups' => array('group1','group2', 'group3'),
'email' => 'user1@example.com',
),
'user2:user2pass' => array(
'uid' => array('2'),
'Groups' => array('group2', 'group4', 'group5'),
'email' => 'user2@example.com',
),
),
);

关于如何到达它的总体想法有所记录但是文档不适合胆小的人,当然欢迎有关为什么事情是这样的理由的部分。

相关内容

  • 没有找到相关文章

最新更新