我正在尝试为 php Web 应用程序设置 SSO。我已经使用 apache 配置了 mod_auth_mellon 以重定向到我的 Idp 身份验证页面,并且正在获取一个 cookie 来响应登录。
我的 httpd.conf 包含以下内容:
MellonCacheSize 100
MellonLockFile "/var/run/mod_auth_mellon.lock"
MellonPostTTL 900
MellonPostSize 1048576
MellonPostCount 100
<Location /secret>
Require valid-user
AuthType "Mellon"
MellonEnable "auth"
MellonVariable "cookie"
MellonSecureCookie On
MellonCookiePath /
MellonUser "NAME_ID"
MellonMergeEnvVars On
MellonMergeEnvVars On ":"
MellonEnvVarsIndexStart 1
MellonSessionDump Off
MellonSamlResponseDump Off
MellonEndpointPath "/secret/endpoint"
MellonDefaultLoginPath "/"
MellonSessionLength 86400
MellonNoCookieErrorPage "https://example.com/no_cookie.html"
MellonSPMetadataFile /etc/apache2/mellon/sp-metadata.xml
MellonSPPrivateKeyFile /etc/apache2/ssl.key
MellonSPCertFile /etc/apache2/ssl.crt
MellonIdPMetadataFile /etc/apache2/mellon/idp-metadata.xml
MellonSamlResponseDump Off
MellonSessionDump Off
MellonAuthnContextClassRef "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"
MellonECPSendIDPList Off
MellonRedirectDomains [self]
</Location>
当我有index.php时我得到结果:
<?php
print_r( $_COOKIE["mellon-cookie"] );
?>
看起来像:
6ce7d6484360f5a98683e0ae87738635
如何使用它来获取用户名以发送到我的应用程序?
编辑: 我尝试查看以下输出:
print_r( $_REQUEST );
print_r( $_SESSION );
print_r( $_POST );
print_r( $_GET );
数据存储在php中的
$_SERVER
变量中。
以下 php 打印所有键和值。
<?php
header('Content-Type: text/plain');
foreach($_SERVER as $key=>$value) {
if(substr($key, 0, 7) == 'MELLON_') {
echo($key . '=' . $value . "\r\n");
}
}
?>
我知道这是一篇旧帖子,但添加了这个,因为我刚刚花了几天时间试图弄清楚为什么用户名会以随机字符串的形式返回。问题在于 SP 元数据文件。看来默认的NameID格式是“暂时的”。来自文档:
指定瞬态时,IdP 将返回不透明的临时 ID。不透明意味着您无法(轻松)将 ID 映射到用户。在许多情况下,它被实现为随机数或随机字符串。临时意味着 ID 仅在包含它的断言响应上下文中有效。
要解决此问题,您需要更新 SP 元数据文件并设置 NameID 格式:
<NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</NameIDFormat>
这将放置在 SPSSODescriptor 元素内。例如
...
</KeyDescriptor>
<NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</NameIDFormat>
<SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://sso-example.com/myapp/sso/logout"/>
<AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://sso-example.com/myapp/sso/postResponse" index="0"/>
</SPSSODescriptor>
</EntityDescriptor>
执行此操作后,$_SERVER['MELLON_NAME_ID'] 应包含实际用户名。