Я создаю механизм федеративной аутентификации на основе SAML, в котором IdP - это ADFS 2.0, а SP - Shibboleth, работающий в Linux. Я умею делать следующее:
Однако я не могу извлечь атрибут eppn в форме заголовка REMOTE_USER в PHP.
Я отключил attribute-policy.xml (закомментировал его в shibboleth2.xml).
Я упускаю что-то тривиальное, подозреваю, что для всего мира я не знаю чего. Либо PHP не принимает переменные сервера, установленные Shibboleth, либо Shibboleth никогда их не устанавливает. Любые идеи?
Вывод из spserver.internal / Shibboleth.sso / Session
Miscellaneous
Session Expiration (barring inactivity): 479 minute(s)
Client Address: a.b.c.d
SSO Protocol: urn:oasis:names:tc:SAML:2.0:protocol
Identity Provider: http://veragence.thesixthflag.com/adfs/services/trust
Authentication Time: 2014-10-28T11:55:23.947Z
Authentication Context Class: urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
Authentication Context Decl: (none)
Attributes
eppn: user.id@adfs.idp.server
Соответствующая строка из shibboleth2.xml:
<ApplicationDefaults entityID="https://spURL/shibboleth"
REMOTE_USER="eppn persistent-id targeted-id">
Соответствующая строка из attribute-map.xml
<Attribute name="urn:oid:1.3.6.1.4.1.5923.1.1.1.6" id="eppn">
<AttributeDecoder xsi:type="ScopedAttributeDecoder"/>
</Attribute>
Соответствующий вывод из shibd.log
2014-10-28 11:55:21 DEBUG Shibboleth.SSO.SAML2 [2]: extracting issuer from SAML 2.0 assertion
2014-10-28 11:55:21 DEBUG OpenSAML.SecurityPolicyRule.MessageFlow [2]: evaluating message flow policy (replay checking on, expiration 60)
2014-10-28 11:55:21 DEBUG XMLTooling.StorageService [2]: inserted record (_06157709-48ab-4701-90b2-b3ecea5df51f) in context (MessageFlow) with expiration (1414497564)
2014-10-28 11:55:21 DEBUG OpenSAML.SecurityPolicyRule.XMLSigning [2]: validating signature profile
2014-10-28 11:55:21 DEBUG XMLTooling.TrustEngine.ExplicitKey [2]: attempting to validate signature with the peer's credentials
2014-10-28 11:55:21 DEBUG XMLTooling.TrustEngine.ExplicitKey [2]: signature validated with credential
2014-10-28 11:55:21 DEBUG OpenSAML.SecurityPolicyRule.XMLSigning [2]: signature verified against message issuer
2014-10-28 11:55:21 DEBUG OpenSAML.SecurityPolicyRule.BearerConfirmation [2]: assertion satisfied bearer confirmation requirements
2014-10-28 11:55:21 DEBUG Shibboleth.SSO.SAML2 [2]: SSO profile processing completed successfully
2014-10-28 11:55:21 DEBUG Shibboleth.SSO.SAML2 [2]: extracting pushed attributes...
2014-10-28 11:55:21 DEBUG Shibboleth.AttributeExtractor.XML [2]: unable to extract attributes, unknown XML object type: samlp:Response
2014-10-28 11:55:21 DEBUG Shibboleth.AttributeExtractor.XML [2]: unable to extract attributes, unknown XML object type: {urn:oasis:names:tc:SAML:2.0:assertion}AuthnStatement
2014-10-28 11:55:21 INFO Shibboleth.AttributeExtractor.XML [2]: skipping unmapped SAML 2.0 Attribute with Name: http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn, Format:urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified
2014-10-28 11:55:21 DEBUG Shibboleth.AttributeDecoder.Scoped [2]: decoding ScopedAttribute (eppn) from SAML 2 Attribute (urn:oid:1.3.6.1.4.1.5923.1.1.1.6) with 1 value(s)
2014-10-28 11:55:21 DEBUG Shibboleth.SSO.SAML2 [2]: resolving attributes...
2014-10-28 11:55:21 DEBUG Shibboleth.AttributeResolver.Query [2]: found AttributeStatement in input to new session, skipping query
2014-10-28 11:55:21 DEBUG Shibboleth.SessionCache [2]: creating new session
2014-10-28 11:55:21 DEBUG Shibboleth.SessionCache [2]: storing new session..
Я думаю, что ответ, который дает @pete k, правильный, хотя сначала я этого не понял. Для других с ограниченными знаниями Apache (таких как я), пытающихся настроить Shibboleth, Shibboleth не делает автоматически свои серверные переменные доступными для каждой страницы вашего приложения, если вы явно не укажете это. Вы можете сделать это, поместив следующий вид кода либо в .htaccess
файл или в файле в /etc/httpd/conf.d/
<Location /location-you-want-to-access-server-variables>
AuthType shibboleth
# ShibRequestSetting requireSession 1
Require shibboleth
</Location>
Если вы раскомментируете среднюю директиву, страницы в указанном месте будут принудительно аутентифицированы с помощью shibboleth. Если вы оставите комментарий, авторизация не будет принудительной, но у вас будет доступ к переменным вашего сервера shibboleth. В PHP, например, они находятся в $_SERVER
- хотя, конечно, они не будут установлены, пока вы делать аутентифицироваться через Shibboleth.