SAML2 Authentication
import java.io.ByteArrayInputStream; |
import java.io.ByteArrayOutputStream; |
import java.io.IOException; |
import java.io.StringWriter; |
import java.net.URLEncoder; |
import java.util.zip.Deflater; |
import java.util.zip.DeflaterOutputStream; |
import javax.xml.parsers.DocumentBuilder; |
import javax.xml.parsers.DocumentBuilderFactory; |
import javax.xml.parsers.ParserConfigurationException; |
import javax.xml.stream.FactoryConfigurationError; |
import javax.xml.stream.XMLStreamException; |
import org.joda.time.DateTime; |
import org.opensaml.Configuration; |
import org.opensaml.DefaultBootstrap; |
import org.opensaml.common.SAMLVersion; |
import org.opensaml.saml2.core.AuthnContextClassRef; |
import org.opensaml.saml2.core.AuthnContextComparisonTypeEnumeration; |
import org.opensaml.saml2.core.AuthnRequest; |
import org.opensaml.saml2.core.Issuer; |
import org.opensaml.saml2.core.NameIDPolicy; |
import org.opensaml.saml2.core.RequestedAuthnContext; |
import org.opensaml.saml2.core.impl.AuthnContextClassRefBuilder; |
import org.opensaml.saml2.core.impl.AuthnRequestBuilder; |
import org.opensaml.saml2.core.impl.IssuerBuilder; |
import org.opensaml.saml2.core.impl.NameIDPolicyBuilder; |
import org.opensaml.saml2.core.impl.RequestedAuthnContextBuilder; |
import org.opensaml.xml.ConfigurationException; |
import org.opensaml.xml.XMLObject; |
import org.opensaml.xml.io.Marshaller; |
import org.opensaml.xml.io.MarshallingException; |
import org.opensaml.xml.io.Unmarshaller; |
import org.opensaml.xml.io.UnmarshallerFactory; |
import org.opensaml.xml.io.UnmarshallingException; |
import org.opensaml.xml.util.Base64; |
import org.opensaml.xml.util.XMLHelper; |
import org.w3c.dom.Document; |
import org.w3c.dom.Element; |
import org.w3c.dom.NamedNodeMap; |
import org.w3c.dom.Node; |
import org.w3c.dom.NodeList; |
import org.xml.sax.SAXException; |
public class SamlConsumer { |
private String identityProviderUrl = null; |
private String resourceProviderUrl = null; |
private String consumerUrl = null; |
private String randomId = Integer.toHexString(new Double(Math.random()) |
.intValue()); |
private String relayState = null; |
public String buildAuthnRequestMessage(String resourceUrl) { |
AuthnRequest authnRequest = null; |
String encodedAuthRequest = null; |
resourceProviderUrl = resourceUrl; |
consumerUrl = resourceUrl; |
String redirectUrl = null; |
try { |
DefaultBootstrap.bootstrap(); |
identityProviderUrl = new ConfigFileReader().getIssuerUrl().trim(); |
authnRequest = this.buildAuthnRequestObject();// SAML AuthRequest |
encodedAuthRequest = encodeAuthnRequest(authnRequest); |
} catch (ConfigurationException e) { |
e.printStackTrace(); |
} catch (XMLStreamException ex) { |
ex.printStackTrace(); |
} catch (FactoryConfigurationError exc) { |
exc.printStackTrace(); |
} catch (MarshallingException e) { |
e.printStackTrace(); |
} catch (IOException e) { |
e.printStackTrace(); |
} |
redirectUrl = identityProviderUrl + "?SAMLRequest=" |
+ encodedAuthRequest + "&RelayState=" + relayState; |
return redirectUrl; |
} |
private AuthnRequest buildAuthnRequestObject() { |
IssuerBuilder issuerBuilder = null; |
Issuer issuer = null; |
NameIDPolicyBuilder nameIdPolicyBuilder = null; |
NameIDPolicy nameIdPolicy = null; |
AuthnContextClassRefBuilder authnContextClassRefBuilder = null; |
AuthnContextClassRef authnContextClassRef = null; |
RequestedAuthnContextBuilder requestedAuthnContextBuilder = null; |
RequestedAuthnContext requestedAuthnContext = null; |
DateTime issueInstant = null; |
AuthnRequestBuilder authRequestBuilder = null; |
AuthnRequest authRequest = null; |
// Issuer object |
issuerBuilder = new IssuerBuilder(); |
issuer = issuerBuilder.buildObject( |
"urn:oasis:names:tc:SAML:2.0:assertion", "Issuer", "samlp"); |
issuer.setValue(resourceProviderUrl); |
// NameIDPolicy |
nameIdPolicyBuilder = new NameIDPolicyBuilder(); |
nameIdPolicy = nameIdPolicyBuilder.buildObject(); |
nameIdPolicy |
.setFormat("urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"); |
nameIdPolicy.setSPNameQualifier("Isser"); |
nameIdPolicy.setAllowCreate(new Boolean(true)); |
// AuthnContextClass |
authnContextClassRefBuilder = new AuthnContextClassRefBuilder(); |
authnContextClassRef = authnContextClassRefBuilder.buildObject( |
"urn:oasis:names:tc:SAML:2.0:assertion", |
"AuthnContextClassRef", "saml"); |
authnContextClassRef |
.setAuthnContextClassRef("urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"); |
// AuthnContex |
requestedAuthnContextBuilder = new RequestedAuthnContextBuilder(); |
requestedAuthnContext = requestedAuthnContextBuilder.buildObject(); |
requestedAuthnContext |
.setComparison(AuthnContextComparisonTypeEnumeration.EXACT); |
requestedAuthnContext.getAuthnContextClassRefs().add( |
authnContextClassRef); |
// Creation of AuthRequestObject |
issueInstant = new DateTime(); |
authRequestBuilder = new AuthnRequestBuilder(); |
authRequest = authRequestBuilder |
.buildObject("urn:oasis:names:tc:SAML:2.0:protocol", |
"AuthnRequest", "samlp"); |
authRequest.setForceAuthn(new Boolean(false)); |
authRequest.setIsPassive(new Boolean(false)); |
authRequest.setIssueInstant(issueInstant); |
authRequest |
.setProtocolBinding("urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"); |
authRequest.setAssertionConsumerServiceURL(consumerUrl); |
authRequest.setIssuer(issuer); |
authRequest.setNameIDPolicy(nameIdPolicy); |
authRequest.setRequestedAuthnContext(requestedAuthnContext); |
authRequest.setID(randomId); |
authRequest.setVersion(SAMLVersion.VERSION_20); |
return authRequest; |
} |
private String encodeAuthnRequest(AuthnRequest authnRequest) |
throws MarshallingException, IOException { |
Marshaller marshaller = null; |
org.w3c.dom.Element authDOM = null; |
StringWriter requestWriter = null; |
String requestMessage = null; |
Deflater deflater = null; |
ByteArrayOutputStream byteArrayOutputStream = null; |
DeflaterOutputStream deflaterOutputStream = null; |
String encodedRequestMessage = null; |
marshaller = org.opensaml.Configuration.getMarshallerFactory() |
.getMarshaller(authnRequest); // object to DOM converter |
authDOM = marshaller.marshall(authnRequest); // converting to a DOM |
requestWriter = new StringWriter(); |
XMLHelper.writeNode(authDOM, requestWriter); |
requestMessage = requestWriter.toString(); // DOM to string |
deflater = new Deflater(Deflater.DEFLATED, true); |
byteArrayOutputStream = new ByteArrayOutputStream(); |
deflaterOutputStream = new DeflaterOutputStream(byteArrayOutputStream, |
deflater); |
deflaterOutputStream.write(requestMessage.getBytes()); // compressing |
deflaterOutputStream.close(); |
encodedRequestMessage = Base64.encodeBytes(byteArrayOutputStream |
.toByteArray(), Base64.DONT_BREAK_LINES); |
encodedRequestMessage = URLEncoder.encode(encodedRequestMessage, |
"UTF-8").trim(); // encoding string |
return encodedRequestMessage; |
} |
public String processResponseMessage(String responseMessage) { |
XMLObject responseObject = null; |
try { |
responseObject = this.unmarshall(responseMessage); |
} catch (ConfigurationException e) { |
e.printStackTrace(); |
} catch (ParserConfigurationException e) { |
e.printStackTrace(); |
} catch (SAXException e) { |
e.printStackTrace(); |
} catch (IOException e) { |
e.printStackTrace(); |
} catch (UnmarshallingException e) { |
e.printStackTrace(); |
} |
return this.getResult(responseObject); |
} |
private XMLObject unmarshall(String responseMessage) |
throws ConfigurationException, ParserConfigurationException, |
SAXException, IOException, UnmarshallingException { |
DocumentBuilderFactory documentBuilderFactory = null; |
DocumentBuilder docBuilder = null; |
Document document = null; |
Element element = null; |
UnmarshallerFactory unmarshallerFactory = null; |
Unmarshaller unmarshaller = null; |
DefaultBootstrap.bootstrap(); |
documentBuilderFactory = DocumentBuilderFactory.newInstance(); |
documentBuilderFactory.setNamespaceAware(true); |
docBuilder = documentBuilderFactory.newDocumentBuilder(); |
document = docBuilder.parse(new ByteArrayInputStream(responseMessage |
.trim().getBytes())); // response to DOM |
element = document.getDocumentElement(); // the DOM element |
unmarshallerFactory = Configuration.getUnmarshallerFactory(); |
unmarshaller = unmarshallerFactory.getUnmarshaller(element); |
return unmarshaller.unmarshall(element); // Response object |
} |
private String getResult(XMLObject responseObject) { |
Element ele = null; |
NodeList statusNodeList = null; |
Node statusNode = null; |
NamedNodeMap statusAttr = null; |
Node valueAtt = null; |
String statusValue = null; |
String[] word = null; |
String result = null; |
NodeList nameIDNodeList = null; |
Node nameIDNode = null; |
String nameID = null; |
// reading the Response Object |
ele = responseObject.getDOM(); |
statusNodeList = ele.getElementsByTagName("samlp:StatusCode"); |
statusNode = statusNodeList.item(0); |
statusAttr = statusNode.getAttributes(); |
valueAtt = statusAttr.item(0); |
statusValue = valueAtt.getNodeValue(); |
word = statusValue.split(":"); |
result = word[word.length - 1]; |
nameIDNodeList = ele.getElementsByTagNameNS( |
"urn:oasis:names:tc:SAML:2.0:assertion", "NameID"); |
nameIDNode = nameIDNodeList.item(0); |
nameID = nameIDNode.getFirstChild().getNodeValue(); |
result = nameID + ":" + result; |
return result; |
} |
} |
No comments:
Post a Comment