2 * Copyright [2007] [University Corporation for Advanced Internet Development, Inc.]
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package edu.internet2.middleware.shibboleth.idp.profile.saml2;
19 import java.util.ArrayList;
20 import java.util.Collection;
21 import java.util.List;
23 import javax.servlet.ServletRequest;
24 import javax.servlet.ServletResponse;
26 import org.joda.time.DateTime;
27 import org.opensaml.common.SAMLObjectBuilder;
28 import org.opensaml.common.SAMLVersion;
29 import org.opensaml.common.impl.SAMLObjectContentReference;
30 import org.opensaml.common.xml.SAMLConstants;
31 import org.opensaml.log.Level;
32 import org.opensaml.saml2.core.Advice;
33 import org.opensaml.saml2.core.Assertion;
34 import org.opensaml.saml2.core.Audience;
35 import org.opensaml.saml2.core.AudienceRestriction;
36 import org.opensaml.saml2.core.AuthnRequest;
37 import org.opensaml.saml2.core.Conditions;
38 import org.opensaml.saml2.core.Issuer;
39 import org.opensaml.saml2.core.NameID;
40 import org.opensaml.saml2.core.ProxyRestriction;
41 import org.opensaml.saml2.core.RequestAbstractType;
42 import org.opensaml.saml2.core.Response;
43 import org.opensaml.saml2.core.Statement;
44 import org.opensaml.saml2.core.Status;
45 import org.opensaml.saml2.core.StatusCode;
46 import org.opensaml.saml2.core.StatusMessage;
47 import org.opensaml.saml2.core.StatusResponseType;
48 import org.opensaml.saml2.core.Subject;
49 import org.opensaml.saml2.core.SubjectConfirmation;
50 import org.opensaml.saml2.metadata.AttributeAuthorityDescriptor;
51 import org.opensaml.saml2.metadata.AuthnAuthorityDescriptor;
52 import org.opensaml.saml2.metadata.NameIDFormat;
53 import org.opensaml.saml2.metadata.PDPDescriptor;
54 import org.opensaml.saml2.metadata.RoleDescriptor;
55 import org.opensaml.saml2.metadata.SSODescriptor;
56 import org.opensaml.saml2.metadata.provider.MetadataProviderException;
57 import org.opensaml.xml.XMLObjectBuilder;
58 import org.opensaml.xml.security.credential.Credential;
59 import org.opensaml.xml.signature.Signature;
60 import org.opensaml.xml.signature.Signer;
61 import org.opensaml.xml.util.DatatypeHelper;
63 import edu.internet2.middleware.shibboleth.common.attribute.AttributeRequestException;
64 import edu.internet2.middleware.shibboleth.common.log.AuditLogEntry;
65 import edu.internet2.middleware.shibboleth.common.profile.ProfileException;
66 import edu.internet2.middleware.shibboleth.common.profile.ProfileRequest;
67 import edu.internet2.middleware.shibboleth.common.profile.ProfileResponse;
68 import edu.internet2.middleware.shibboleth.common.relyingparty.provider.saml2.AbstractSAML2ProfileConfiguration;
69 import edu.internet2.middleware.shibboleth.idp.profile.AbstractSAMLProfileHandler;
72 * Common implementation details for profile handlers.
74 public abstract class AbstractSAML2ProfileHandler extends AbstractSAMLProfileHandler {
76 /** SAML Version for this profile handler. */
77 public static final SAMLVersion SAML_VERSION = SAMLVersion.VERSION_20;
79 /** URI for the SAML 2 protocol. */
80 public static final String SAML20_PROTOCOL_URI = "urn:oasis:names:tc:SAML:2.0:protocol";
82 /** For building response. */
83 private SAMLObjectBuilder<Response> responseBuilder;
85 /** For building status. */
86 private SAMLObjectBuilder<Status> statusBuilder;
88 /** For building statuscode. */
89 private SAMLObjectBuilder<StatusCode> statusCodeBuilder;
91 /** For building StatusMessages. */
92 private SAMLObjectBuilder<StatusMessage> statusMessageBuilder;
94 /** For building assertion. */
95 private SAMLObjectBuilder<Assertion> assertionBuilder;
97 /** For building issuer. */
98 private SAMLObjectBuilder<Issuer> issuerBuilder;
100 /** For building subject. */
101 private SAMLObjectBuilder<Subject> subjectBuilder;
103 /** For builder subject confirmation. */
104 private SAMLObjectBuilder<SubjectConfirmation> subjectConfirmationBuilder;
106 /** For building conditions. */
107 private SAMLObjectBuilder<Conditions> conditionsBuilder;
109 /** For building audience restriction. */
110 private SAMLObjectBuilder<AudienceRestriction> audienceRestrictionBuilder;
112 /** For building proxy retrictions. */
113 private SAMLObjectBuilder<ProxyRestriction> proxyRestrictionBuilder;
115 /** For building audience. */
116 private SAMLObjectBuilder<Audience> audienceBuilder;
118 /** For building advice. */
119 private SAMLObjectBuilder<Advice> adviceBuilder;
121 /** For building signature. */
122 private XMLObjectBuilder<Signature> signatureBuilder;
125 @SuppressWarnings("unchecked")
126 protected AbstractSAML2ProfileHandler() {
129 responseBuilder = (SAMLObjectBuilder<Response>) getBuilderFactory().getBuilder(Response.DEFAULT_ELEMENT_NAME);
130 statusBuilder = (SAMLObjectBuilder<Status>) getBuilderFactory().getBuilder(Status.DEFAULT_ELEMENT_NAME);
131 statusCodeBuilder = (SAMLObjectBuilder<StatusCode>) getBuilderFactory().getBuilder(
132 StatusCode.DEFAULT_ELEMENT_NAME);
133 statusMessageBuilder = (SAMLObjectBuilder<StatusMessage>) getBuilderFactory().getBuilder(
134 StatusMessage.DEFAULT_ELEMENT_NAME);
135 issuerBuilder = (SAMLObjectBuilder<Issuer>) getBuilderFactory().getBuilder(Issuer.DEFAULT_ELEMENT_NAME);
136 assertionBuilder = (SAMLObjectBuilder<Assertion>) getBuilderFactory()
137 .getBuilder(Assertion.DEFAULT_ELEMENT_NAME);
138 subjectBuilder = (SAMLObjectBuilder<Subject>) getBuilderFactory().getBuilder(Subject.DEFAULT_ELEMENT_NAME);
139 subjectConfirmationBuilder = (SAMLObjectBuilder<SubjectConfirmation>) getBuilderFactory().getBuilder(
140 SubjectConfirmation.DEFAULT_ELEMENT_NAME);
141 conditionsBuilder = (SAMLObjectBuilder<Conditions>) getBuilderFactory().getBuilder(
142 Conditions.DEFAULT_ELEMENT_NAME);
143 audienceRestrictionBuilder = (SAMLObjectBuilder<AudienceRestriction>) getBuilderFactory().getBuilder(
144 AudienceRestriction.DEFAULT_ELEMENT_NAME);
145 proxyRestrictionBuilder = (SAMLObjectBuilder<ProxyRestriction>) getBuilderFactory().getBuilder(
146 ProxyRestriction.DEFAULT_ELEMENT_NAME);
147 audienceBuilder = (SAMLObjectBuilder<Audience>) getBuilderFactory().getBuilder(Audience.DEFAULT_ELEMENT_NAME);
148 adviceBuilder = (SAMLObjectBuilder<Advice>) getBuilderFactory().getBuilder(Advice.DEFAULT_ELEMENT_NAME);
149 signatureBuilder = (XMLObjectBuilder<Signature>) getBuilderFactory().getBuilder(Signature.DEFAULT_ELEMENT_NAME);
153 * Convenience method for getting the SAML 2 advice builder.
155 * @return SAML 2 advice builder
157 public SAMLObjectBuilder<Advice> getAdviceBuilder() {
158 return adviceBuilder;
162 * Convenience method for getting the SAML 2 assertion builder.
164 * @return SAML 2 assertion builder
166 public SAMLObjectBuilder<Assertion> getAssertionBuilder() {
167 return assertionBuilder;
171 * Convenience method for getting the SAML 2 audience builder.
173 * @return SAML 2 audience builder
175 public SAMLObjectBuilder<Audience> getAudienceBuilder() {
176 return audienceBuilder;
180 * Convenience method for getting the SAML 2 audience restriction builder.
182 * @return SAML 2 audience restriction builder
184 public SAMLObjectBuilder<AudienceRestriction> getAudienceRestrictionBuilder() {
185 return audienceRestrictionBuilder;
189 * Convenience method for getting the SAML 2 conditions builder.
191 * @return SAML 2 conditions builder
193 public SAMLObjectBuilder<Conditions> getConditionsBuilder() {
194 return conditionsBuilder;
198 * Convenience method for getting the SAML 2 Issuer builder.
200 * @return SAML 2 Issuer builder
202 public SAMLObjectBuilder<Issuer> getIssuerBuilder() {
203 return issuerBuilder;
207 * Convenience method for getting the SAML 2 proxy restriction builder.
209 * @return SAML 2 proxy restriction builder
211 public SAMLObjectBuilder<ProxyRestriction> getProxyRestrictionBuilder() {
212 return proxyRestrictionBuilder;
216 * Convenience method for getting the SAML 2 response builder.
218 * @return SAML 2 response builder
220 public SAMLObjectBuilder<Response> getResponseBuilder() {
221 return responseBuilder;
225 * Convenience method for getting the Signature builder.
227 * @return signature builder
229 public XMLObjectBuilder<Signature> getSignatureBuilder() {
230 return signatureBuilder;
234 * Convenience method for getting the SAML 2 status builder.
236 * @return SAML 2 status builder
238 public SAMLObjectBuilder<Status> getStatusBuilder() {
239 return statusBuilder;
243 * Convenience method for getting the SAML 2 status code builder.
245 * @return SAML 2 status code builder
247 public SAMLObjectBuilder<StatusCode> getStatusCodeBuilder() {
248 return statusCodeBuilder;
252 * Convenience method for getting the SAML 2 status message builder.
254 * @return SAML 2 status message builder
256 public SAMLObjectBuilder<StatusMessage> getStatusMessageBuilder() {
257 return statusMessageBuilder;
261 * Convenience method for getting the SAML 2 subject builder.
263 * @return SAML 2 subject builder
265 public SAMLObjectBuilder<Subject> getSubjectBuilder() {
266 return subjectBuilder;
270 * Convenience method for getting the SAML 2 subject confirmation builder.
272 * @return SAML 2 subject confirmation builder
274 public SAMLObjectBuilder<SubjectConfirmation> getSubjectConfirmationBuilder() {
275 return subjectConfirmationBuilder;
279 * Builds a response to the attribute query within the request context.
281 * @param requestContext current request context
282 * @param assertionSubject subject of the assertion within the response
283 * @param statements the statements to include in the response
285 * @return the built response
287 * @throws ProfileException thrown if there is a problem creating the SAML response
288 * @throws AttributeRequestException thrown if there is a problem resolving attributes
290 protected Response buildResponse(SAML2ProfileRequestContext requestContext, Subject assertionSubject,
291 List<Statement> statements) throws ProfileException, AttributeRequestException {
293 DateTime issueInstant = new DateTime();
295 // create the assertion and add the attribute statement
296 Assertion assertion = buildAssertion(requestContext, issueInstant);
297 assertion.setSubject(assertionSubject);
298 if (statements != null) {
299 assertion.getStatements().addAll(statements);
302 // create the SAML response and add the assertion
303 Response samlResponse = getResponseBuilder().buildObject();
304 populateStatusResponse(requestContext, samlResponse);
306 samlResponse.getAssertions().add(assertion);
308 // sign the assertion if it should be signed
309 signAssertion(requestContext, assertion);
311 Status status = buildStatus(StatusCode.SUCCESS_URI, null, null);
312 samlResponse.setStatus(status);
318 * Builds a basic assertion with its id, issue instant, SAML version, issuer, subject, and conditions populated.
320 * @param requestContext current request context
321 * @param issueInstant time to use as assertion issue instant
323 * @return the built assertion
325 protected Assertion buildAssertion(SAML2ProfileRequestContext requestContext, DateTime issueInstant) {
327 Assertion assertion = getAssertionBuilder().buildObject();
328 assertion.setID(getIdGenerator().generateIdentifier());
329 assertion.setIssueInstant(issueInstant);
330 assertion.setVersion(SAMLVersion.VERSION_20);
331 assertion.setIssuer(buildEntityIssuer(requestContext));
333 Conditions conditions = buildConditions(requestContext, issueInstant);
334 assertion.setConditions(conditions);
340 * Creates an {@link Issuer} populated with information about the relying party.
342 * @param requestContext current request context
344 * @return the built issuer
346 protected Issuer buildEntityIssuer(SAML2ProfileRequestContext requestContext) {
347 Issuer issuer = getIssuerBuilder().buildObject();
348 issuer.setFormat(Issuer.ENTITY);
349 issuer.setValue(requestContext.getRelyingPartyId());
355 * Builds a SAML assertion condition set. The following fields are set; not before, not on or after, audience
356 * restrictions, and proxy restrictions.
358 * @param requestContext current request context
359 * @param issueInstant timestamp the assertion was created
361 * @return constructed conditions
363 protected Conditions buildConditions(SAML2ProfileRequestContext requestContext, DateTime issueInstant) {
364 AbstractSAML2ProfileConfiguration profileConfig = requestContext.getProfileConfiguration();
366 Conditions conditions = getConditionsBuilder().buildObject();
367 conditions.setNotBefore(issueInstant);
368 conditions.setNotOnOrAfter(issueInstant.plus(profileConfig.getAssertionLifetime()));
370 Collection<String> audiences;
372 // add audience restrictions
373 audiences = profileConfig.getAssertionAudiences();
374 if (audiences != null && audiences.size() > 0) {
375 AudienceRestriction audienceRestriction = getAudienceRestrictionBuilder().buildObject();
376 for (String audienceUri : audiences) {
377 Audience audience = getAudienceBuilder().buildObject();
378 audience.setAudienceURI(audienceUri);
379 audienceRestriction.getAudiences().add(audience);
381 conditions.getAudienceRestrictions().add(audienceRestriction);
384 // add proxy restrictions
385 audiences = profileConfig.getProxyAudiences();
386 if (audiences != null && audiences.size() > 0) {
387 ProxyRestriction proxyRestriction = getProxyRestrictionBuilder().buildObject();
389 for (String audienceUri : audiences) {
390 audience = getAudienceBuilder().buildObject();
391 audience.setAudienceURI(audienceUri);
392 proxyRestriction.getAudiences().add(audience);
395 proxyRestriction.setProxyCount(profileConfig.getProxyCount());
396 conditions.getConditions().add(proxyRestriction);
403 * Populates the response's id, in response to, issue instant, version, and issuer properties.
405 * @param requestContext current request context
406 * @param response the response to populate
408 protected void populateStatusResponse(SAML2ProfileRequestContext requestContext, StatusResponseType response) {
409 response.setID(getIdGenerator().generateIdentifier());
410 response.setInResponseTo(requestContext.getSamlRequest().getID());
411 response.setIssueInstant(response.getIssueInstant());
412 response.setVersion(SAMLVersion.VERSION_20);
413 response.setIssuer(buildEntityIssuer(requestContext));
417 * Signs the given assertion if either the current profile configuration or the relying party configuration contains
418 * signing credentials.
420 * @param requestContext current request context
421 * @param assertion assertion to sign
423 protected void signAssertion(SAML2ProfileRequestContext requestContext, Assertion assertion) {
424 AbstractSAML2ProfileConfiguration profileConfig = requestContext.getProfileConfiguration();
426 if (!profileConfig.getSignAssertions()) {
430 Credential signatureCredential = profileConfig.getSigningCredential();
431 if (signatureCredential == null) {
432 signatureCredential = requestContext.getRelyingPartyConfiguration().getDefaultSigningCredential();
435 if (signatureCredential == null) {
439 SAMLObjectContentReference contentRef = new SAMLObjectContentReference(assertion);
440 Signature signature = signatureBuilder.buildObject(Signature.DEFAULT_ELEMENT_NAME);
441 signature.getContentReferences().add(contentRef);
442 assertion.setSignature(signature);
444 Signer.signObject(signature);
448 * Build a status message, with an optional second-level failure message.
450 * @param topLevelCode The top-level status code. Should be from saml-core-2.0-os, sec. 3.2.2.2
451 * @param secondLevelCode An optional second-level failure code. Should be from saml-core-2.0-is, sec 3.2.2.2. If
452 * null, no second-level Status element will be set.
453 * @param secondLevelFailureMessage An optional second-level failure message
455 * @return a Status object.
457 protected Status buildStatus(String topLevelCode, String secondLevelCode, String secondLevelFailureMessage) {
459 Status status = getStatusBuilder().buildObject();
461 StatusCode statusCode = getStatusCodeBuilder().buildObject();
462 statusCode.setValue(DatatypeHelper.safeTrimOrNullString(topLevelCode));
463 status.setStatusCode(statusCode);
465 if (secondLevelCode != null) {
466 StatusCode secondLevelStatusCode = getStatusCodeBuilder().buildObject();
467 secondLevelStatusCode.setValue(DatatypeHelper.safeTrimOrNullString(secondLevelCode));
468 statusCode.setStatusCode(secondLevelStatusCode);
471 if (secondLevelFailureMessage != null) {
472 StatusMessage msg = getStatusMessageBuilder().buildObject();
473 msg.setMessage(secondLevelFailureMessage);
474 status.setStatusMessage(msg);
481 * Builds the SAML subject for the user for the service provider.
483 * @param requestContext current request context
484 * @param confirmationMethod subject confirmation method used for the subject
486 * @return SAML subject for the user for the service provider
488 protected Subject buildSubject(SAML2ProfileRequestContext requestContext, String confirmationMethod) {
489 NameID nameID = requestContext.getSubjectNameID();
490 // TODO handle encryption
492 SubjectConfirmation subjectConfirmation = getSubjectConfirmationBuilder().buildObject();
493 subjectConfirmation.setMethod(confirmationMethod);
495 Subject subject = getSubjectBuilder().buildObject();
496 subject.setNameID(nameID);
497 subject.getSubjectConfirmations().add(subjectConfirmation);
503 * Constructs an SAML response message carrying a request error.
505 * @param requestContext current request context
506 * @param topLevelCode The top-level status code. Should be from saml-core-2.0-os, sec. 3.2.2.2
507 * @param secondLevelCode An optional second-level failure code. Should be from saml-core-2.0-is, sec 3.2.2.2. If
508 * null, no second-level Status element will be set.
509 * @param secondLevelFailureMessage An optional second-level failure message
511 * @return the constructed error response
513 protected Response buildErrorResponse(SAML2ProfileRequestContext requestContext, String topLevelCode,
514 String secondLevelCode, String secondLevelFailureMessage) {
515 Response samlResponse = getResponseBuilder().buildObject();
516 samlResponse.setIssueInstant(new DateTime());
517 populateStatusResponse(requestContext, samlResponse);
519 Status status = buildStatus(topLevelCode, secondLevelCode, secondLevelFailureMessage);
520 samlResponse.setStatus(status);
526 * Gets the NameID format to use when creating NameIDs for the relying party.
528 * @param requestContext current request context
530 * @return list of nameID formats that may be used with the relying party
532 * @throws ProfileException thrown if there is a problem determing the NameID format to use
534 protected List<String> getNameIDFormat(SAML2ProfileRequestContext requestContext) throws ProfileException {
535 ArrayList<String> nameFormats = new ArrayList<String>();
538 RoleDescriptor assertingPartyRole = getMetadataProvider().getRole(requestContext.getAssertingPartyId(),
539 requestContext.getAssertingPartyRole(), SAMLConstants.SAML20P_NS);
540 List<String> assertingPartySupportedFormats = getEntitySupportedFormats(assertingPartyRole);
542 String nameFormat = null;
543 if (requestContext.getSamlRequest() instanceof AuthnRequest) {
544 AuthnRequest authnRequest = (AuthnRequest) requestContext.getSamlRequest();
545 if (authnRequest.getNameIDPolicy() != null) {
546 nameFormat = authnRequest.getNameIDPolicy().getFormat();
547 if (assertingPartySupportedFormats.contains(nameFormat)) {
548 nameFormats.add(nameFormat);
550 throw new ProfileException("NameID format required by relying party is not supported");
555 if (nameFormats.isEmpty()) {
556 RoleDescriptor relyingPartyRole = getMetadataProvider().getRole(requestContext.getRelyingPartyId(),
557 requestContext.getRelyingPartyRole(), SAMLConstants.SAML20P_NS);
558 List<String> relyingPartySupportedFormats = getEntitySupportedFormats(relyingPartyRole);
560 assertingPartySupportedFormats.retainAll(relyingPartySupportedFormats);
561 nameFormats.addAll(assertingPartySupportedFormats);
563 if (nameFormats.isEmpty()) {
564 nameFormats.add("urn:oasis:names:tc:SAML:2.0:nameid-format:unspecified");
569 } catch (MetadataProviderException e) {
570 throw new ProfileException("Unable to determine lookup entity metadata", e);
575 * Gets the list of NameID formats supported for a given role.
577 * @param role the role to get the list of supported NameID formats
579 * @return list of supported NameID formats
581 protected List<String> getEntitySupportedFormats(RoleDescriptor role) {
582 List<NameIDFormat> nameIDFormats = null;
584 if (role instanceof SSODescriptor) {
585 nameIDFormats = ((SSODescriptor) role).getNameIDFormats();
586 } else if (role instanceof AuthnAuthorityDescriptor) {
587 nameIDFormats = ((AuthnAuthorityDescriptor) role).getNameIDFormats();
588 } else if (role instanceof PDPDescriptor) {
589 nameIDFormats = ((PDPDescriptor) role).getNameIDFormats();
590 } else if (role instanceof AttributeAuthorityDescriptor) {
591 nameIDFormats = ((AttributeAuthorityDescriptor) role).getNameIDFormats();
594 ArrayList<String> supportedFormats = new ArrayList<String>();
595 if (nameIDFormats != null) {
596 for (NameIDFormat format : nameIDFormats) {
597 supportedFormats.add(format.getFormat());
601 return supportedFormats;
605 * Writes an aduit log entry indicating the successful response to the attribute request.
607 * @param context current request context
609 protected void writeAuditLogEntry(SAML2ProfileRequestContext context) {
610 AuditLogEntry auditLogEntry = new AuditLogEntry();
611 auditLogEntry.setMessageProfile(getProfileId());
612 auditLogEntry.setPrincipalAuthenticationMethod(context.getPrincipalAuthenticationMethod());
613 auditLogEntry.setPrincipalName(context.getPrincipalName());
614 auditLogEntry.setAssertingPartyId(context.getAssertingPartyId());
615 auditLogEntry.setRelyingPartyId(context.getRelyingPartyId());
616 auditLogEntry.setRequestBinding(context.getMessageDecoder().getBindingURI());
617 auditLogEntry.setRequestId(context.getSamlRequest().getID());
618 auditLogEntry.setResponseBinding(context.getMessageEncoder().getBindingURI());
619 auditLogEntry.setResponseId(context.getSamlResponse().getID());
620 getAduitLog().log(Level.CRITICAL, auditLogEntry);
624 * Contextual object used to accumlate information as profile requests are being processed.
626 * @param <RequestType> type of SAML 2 request
627 * @param <ResponseType> type of SAML 2 response
628 * @param <ProfileConfigurationType> configuration type for this profile
630 protected class SAML2ProfileRequestContext<RequestType extends RequestAbstractType,
631 ResponseType extends StatusResponseType,
632 ProfileConfigurationType extends AbstractSAML2ProfileConfiguration>
633 extends SAMLProfileRequestContext {
635 /** SAML request message. */
636 private RequestType samlRequest;
638 /** SAML response message. */
639 private ResponseType samlResponse;
641 /** Request profile configuration. */
642 private ProfileConfigurationType profileConfiguration;
644 /** The NameID of the subject of this request. */
645 private NameID subjectNameID;
650 * @param request current profile request
651 * @param response current profile response
653 public SAML2ProfileRequestContext(ProfileRequest<ServletRequest> request,
654 ProfileResponse<ServletResponse> response) {
655 super(request, response);
659 * Gets the NameID of the subject of this request.
661 * @return NameID of the subject of this request
663 public NameID getSubjectNameID() {
664 return subjectNameID;
668 * Sets the NameID of the subject of this request.
670 * @param nameID NameID of the subject of this request
672 public void setSubjectNameID(NameID nameID) {
673 subjectNameID = nameID;
677 * Gets the profile configuration for this request.
679 * @return profile configuration for this request
681 public ProfileConfigurationType getProfileConfiguration() {
682 return profileConfiguration;
686 * Sets the profile configuration for this request.
688 * @param configuration profile configuration for this request
690 public void setProfileConfiguration(ProfileConfigurationType configuration) {
691 profileConfiguration = configuration;
695 * Gets the SAML request message.
697 * @return SAML request message
699 public RequestType getSamlRequest() {
704 * Sets the SAML request message.
706 * @param request SAML request message
708 public void setSamlRequest(RequestType request) {
709 samlRequest = request;
713 * Gets the SAML response message.
715 * @return SAML response message
717 public ResponseType getSamlResponse() {
722 * Sets the SAML response message.
724 * @param response SAML response message
726 public void setSamlResponse(ResponseType response) {
727 samlResponse = response;