gpt4 book ai didi

spring - SAMLException : NameID element must be present as part of the Subject in the Response message, 请在 IDP 配置中启用它

转载 作者:行者123 更新时间:2023-12-04 19:05:28 37 4
gpt4 key购买 nike

我正在使用 spring-saml 执行。在 WebSSOProfileConsumerImpl 类中,我可以找到以下几行代码,用于检查 中的 nameId SAML 响应的断言 .

NameID nameID;
if (subject.getEncryptedID() != null) {
Assert.notNull(context.getLocalDecrypter(), "Can't decrypt NameID, no decrypter is set in the context");
nameID = (NameID) context.getLocalDecrypter().decrypt(subject.getEncryptedID());
} else {
nameID = subject.getNameID();
}

根据代码,很明显 nameId 应该是主题的一部分。但是大多数 IDP 包括我使用的那个都提到 nameId 可能是 的一部分主题/属性 .似乎有一些实现在主题中接受 nameId 就像 SimpleSAMLPHP .

主题 我收到的内容如下,没有包含 nameId
<saml2:Subject>
<saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<saml2:SubjectConfirmationData Address="91.X.X.X" InResponseTo="XXXX" NotOnOrAfter="2014-10-10T10:34:26.619Z" Recipient="http://localhost:8080/XXXX/saml/SSO"/>
</saml2:SubjectConfirmation>
</saml2:Subject>

但是,有一个 属性 其中有一个 nameId 作为其 属性值 .为什么不能用这个代替 中的那个主题 .
<saml2:Attribute FriendlyName="testID" Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
<saml2:AttributeValue>
<saml2:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" NameQualifier="https://XXXX/idp/shibboleth" SPNameQualifier="urn:XX:XX:XX">XXXXXXXXXXXXXXXXX=
</saml2:NameID>
</saml2:AttributeValue>
</saml2:Attribute>

谁能解释背后的原因 nameId 成为唯一的一部分 主题 spring-saml 执行。

@vschafer 有没有办法自定义 securityContext.xml 选择 nameId 这是特定 的一部分属性 而不是来自 主题 ?

最佳答案

我们在 ADFS 3.0 中遇到了类似的情况。 ADFS 的这种特殊配置根本不提供 NameId。我们通过从 ADFS 请求 UPN 声明,然后将其用作 NameId 来实现解决方法。不过,一个可插入的 NameIdResolver 会很好,@vschafer。

如果有人感兴趣,请提供解决方法的代码:

public class ClaimConstants {

public static final String UPN = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn";
}
public class NameIdWebSSOProfileConsumer extends WebSSOProfileConsumerImpl {

@Override
protected void verifySubject(Subject subject, AuthnRequest request, SAMLMessageContext context) throws SAMLException, DecryptionException {
super.verifySubject(subject, request, context);

Response response = (Response) context.getInboundSAMLMessage();
for (EncryptedAssertion ea : response.getEncryptedAssertions()) {
Assertion assertion = context.getLocalDecrypter().decrypt(ea);

for (Statement statement : assertion.getStatements()) {
if (statement instanceof AttributeStatementImpl) {
for (Attribute attribute : ((AttributeStatementImpl) statement).getAttributes()) {
if (ClaimConstants.UPN.equals(attribute.getName())) {
NameID nameId = new NameIDBuilder().buildObject();
XSAnyImpl xmlObject = (XSAnyImpl) attribute.getAttributeValues().get(0);
nameId.setValue(xmlObject.getTextContent());
//noinspection unchecked
context.setSubjectNameIdentifier(nameId);
return;
}
}
}
}
}
}

然后在 Spring 中正常使用:
<bean id="webSSOprofileConsumer" class="com.example.NameIdWebSSOProfileConsumer"/>

关于spring - SAMLException : NameID element must be present as part of the Subject in the Response message, 请在 IDP 配置中启用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26297938/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com