|
|
Single Sign On (SSO) systems have become very popular since it is a very secure and convenient authentication mechanism. WSO2 Stratos and Google Apps can be taken as best examples for Single Sign On systems where users can automatically login to multiple web applications once they are authenticated at a one place using a single credential.
Security Assertian Markup Language (SAML) version 2.0 Profiles Specification defines a web browser based single sign on system. This article briefly explains the SAML 2.0 web browser based SSO profile and guids to build your own SAML 2.0 Assertions Consumer using the OpenSAML 2.2.3 Java library. The demo application provided with this article would help to understand how SAML 2.0 based SSO systems work and how to use WSO2 Identity Server as the Identity Provider in a SSO system.
[Curated on 26th March 2012]
In a single sign on system there are basically two roles, Service Providers and Identity Providers (IP). The important characteristic of a single sign on syste is the pre-defined trust relation between the service providers and the identity providesr. Service providers trust the assertions issued by the identity providers and the identity providers issues assertions on the results of authentication and authorization of principles who are willing to access services at service providers.
Following are some of the advantages you can have with SSO:
With the release of WSO2 Identity Server 3.0, it supports the SAML 2.0 web browser based SSO profile. WSO2 Identity Server can act as the identity provider of a single sign on system with minimal configurations. This article guides on how to configure the identity server and how your applications can be deployed in a SAML 2.0 web browser based SSO system.
WSO2 Identity Server 3.0.0 or higher.
Single Sign On is widely used in web technologies. Google is one of the best examples.
Try this simple exercise,
Tip: did you notice the URL of the web browser? Each time when you are trying to access an application, you will see that you are being redirected to www.google.com/accounts/ServiceLogin and returns immediately to the resource so that you can't even notice it.
That is the beauty of Single Sign On, more secure and more user friendly. You signed in only once but you hvae access to multiple resources without re-entering your username/password.
SAML 2.0 Web Browser based SSO profile is defined under the SAML 2.0 Profiles specification. SAML 2.0 provides five main specifications:
In a web browser based SSO system, the flow can be started by user either by trying to accessing a service at the service providers or by directly accessing the identity provider itself.
If the user access a service at a service provider :
If the user access the identity provider directly, then only the steps 3,4,5 will be in the flow.
The
The
Following diagram illustrates the scenario.

Service providers are acting as SAML assertion consumers. They basically do two things :
Following code is a sketch of a sample service provider servlet in a SAML 2.0 Web-Browser based SSO system.
public class Resource extends HttpServlet {
private static SamlConsumer consumer = new SamlConsumer();
public void doGet(HttpServletRequest request, HttpServletResponse response) {
requestMessage = consumer.buildRequestMessage();
response.sendRedirect(requestMessage);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) {
responseMessage = request.getParameter("SAMLResponse").toString();
result = consumer.processResponseMessage(responseMessage);
}
}
When a web user try to access the above servlet, it's doGet() method gets called. Inside the doGet() method, it will generates an
After authentication is completed by the Identity Provider, it will do a POST call back to the above servlet with a
The complete source code can be downloaded from here
It is easy to create and precess SAML messages using the OpenSAML Java library. Add the OpenSAML library to the build path of the project.You can download the open saml jar from here
A sample <AuthnRequest> message can be found here
According to SAML 2.0 specifications, the
// the issuerUrl is the url of the service provider who generates the message
String issuerUrl = "http://localhost:8080/saml2.demo/consumer";
IssuerBuilder issuerBuilder = new IssuerBuilder();
Issuer issuer = issuerBuilder.buildObject("urn:oasis:names:tc:SAML:2.0:assertion", "Issuer", "samlp");
issuer.setValue(issuerUrl);
Lets create the <AutnRequest>
DateTime issueInstant = new DateTime();
AuthnRequestBuilder authnRequestBuilder = new AuthnRequestBuilder();
AuthnRequest authnRequest = authnRequestBuilder.buildObject("urn:oasis:names:tc:SAML:2.0:protocol", "AuthnRequest", "samlp");
authnRequest.setForceAuthn(new Boolean(false));
authnRequest.setIsPassive(new Boolean(false));
authnRequest.setIssueInstant(issueInstant);
authnRequest.setProtocolBinding("urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST");
authnRequest.setAssertionConsumerServiceURL(issuerUrl);
authnRequest.setIssuer(issuer);
authnRequest.setID(aRandomId);
authnRequest.setVersion(SAMLVersion.VERSION_20);
The
Now lets encode the
Marshaller marshaller = Configuration.getMarshallerFactory().getMarshaller(authnRequest);
Element authDOM = marshaller.marshall(authnRequest);
StringWriter rspWrt = new StringWriter();
XMLHelper.writeNode(authDOM, rspWrt);
String requestMessage = rspWrt.toString();
Deflater deflater = new Deflater(Deflater.DEFLATED, true);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(byteArrayOutputStream, deflater);
deflaterOutputStream.write(requestMessage.getBytes());
deflaterOutputStream.close();
/* Encoding the compressed message */
String encodedRequestMessage = Base64.encodeBytes(byteArrayOutputStream.toByteArray(), Base64.DONT_BREAK_LINES);
String encodedAuthnRequest = URLEncoder.encode(encodedRequestMessage,"UTF-8").trim();
Now we can construct the redirection URL,
redirectionUrl = identitypProviderUrl+ "?SAMLRequest=" + encodedRequestMessage;
Now we can redirect the user to the identity provider,
response.sendRedirect(redirectionUrl);
A sample <Response> message can be found here
The response message must be fetched from the request,
responseMessage = request.getParameter("SAMLResponse").toString();
The fetched “responseMessage” has to be unmarshaled and the SAML
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
DocumentBuilder docBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = docBuilder.parse(new ByteArrayInputStream(authnReqStr.trim().getBytes()));
Element element = document.getDocumentElement();
UnmarshallerFactory unmarshallerFactory = Configuration.getUnmarshallerFactory();
Unmarshaller unmarshaller = unmarshallerFactory.getUnmarshaller(element);
Response response = (Response) unmarshaller.unmarshall(element);
The retrieved SAML 2.0 Response message can be easily processed. For example, lets takes the User Name or the Subject's Name Id,
String subject = response.getAssertions().get(0).getSubject() .getNameID().getValue();
Or you can retrieve the certificate,
String certificate = response.getSignature().getKeyInfo().getX509Datas().get(0).getX509Certificates().get(0).getValue();


SSO systems are more secure and more convenient for users. A SAML 2.0 web browser based SSO system can be easily implimented with the WSO2 Identity Server with only few confgurations. OpenSAML Java library can be used to create Consumer Modules to interat with the WSO2 Identity Server in implimenting SSO systems.
Suresh Attanayake, Software Engineer at WSO2 , suresh@wso2.com
| Attachment | Size |
|---|---|
| resource.png | 69.04 KB |
| signin.png | 18.63 KB |
| AuthRequest.xml | 938 bytes |
| Response.xml | 3.5 KB |
| saml-diagram.png | 40.7 KB |
| SAML2 IS Configs.png | 31.44 KB |
Error running saml2.demo.war
Please check if the server
Log out
WSO2 Identity Server has
WSO2 identity server as Service Provider
SAMLResponse Base64 Encoded ?
Very good simple article to
Source code availability
some links access denied
source code is attached to