<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-7514525</id><updated>2009-02-21T11:09:56.171-05:00</updated><title type='text'>From the Inside</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://trscavo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default'/><link rel='alternate' type='text/html' href='http://trscavo.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tom Scavo</name><uri>http://www.blogger.com/profile/07476406033382071801</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7514525.post-109926933376118500</id><published>2004-10-31T19:35:00.000-05:00</published><updated>2004-11-17T20:12:58.603-05:00</updated><title type='text'>Shibboleth</title><content type='html'>&lt;p&gt;[&amp;nbsp;&lt;a href="#components"&gt;Components&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="#profiles"&gt;Profiles&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="#attributes"&gt;Attributes&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="#metadata"&gt;Metadata&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="#summary"&gt;Summary&lt;/a&gt;&amp;nbsp;]&lt;/p&gt;

&lt;p&gt;Shibboleth, a project of &lt;a href="http://middleware.internet2.edu/MACE/"&gt;Internet2/MACE&lt;/a&gt;, is both a specification and an implementation of a federated identity management solution for higher education.  For notational consistency, the current &lt;a href="http://shibboleth.internet2.edu/docs/draft-mace-shibboleth-arch-protocols-02.pdf"&gt;Shibboleth Architecture&lt;/a&gt; specification is written in the language of SAML2, which itself is based on Liberty&amp;nbsp;1.2.&lt;/p&gt;

&lt;p&gt;The Shibboleth architecture extends the &lt;a href="http://trscavo.blogspot.com/2004/10/saml1.html"&gt;SAML1&lt;/a&gt; single sign-on and attribute exchange mechanisms by specifying service-provider-first SSO profiles and enhanced features for user privacy.  An optional WAYF ("Where are you from?") service provides a means for identity provider discovery.&lt;/p&gt;

&lt;p&gt;As an implementation, Shibboleth is built on top of an open-source implementation of SAML&amp;nbsp;1.1 called &lt;a href="http://www.opensaml.org"&gt;OpenSAML&lt;/a&gt;.  Shibboleth&amp;nbsp;1.2, the current version of the implementation, is available for download at&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Shibboleth &amp;lt;&lt;a href="http://shibboleth.internet2.edu/"&gt;http://shibboleth.internet2.edu/&lt;/a&gt;&amp;gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Shibboleth&amp;nbsp;1.2 supports the browser/POST profile only.  Later implementations of Shibboleth will support the browser/artifact profile as well.  Note that Shibboleth does not specify a single logout profile.&lt;/p&gt;

&lt;h4&gt;&lt;a name="components"&gt;Shibboleth Components&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;The functional components of a conforming Shibboleth implementation include the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Identity Provider&lt;/em&gt; (formerly called an &lt;em&gt;origin&lt;/em&gt;)
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;Authentication Authority&lt;/em&gt;
        &lt;p&gt;The &lt;em&gt;authentication authority&lt;/em&gt; issues authentication (authn) assertions to other components.  The authentication authority is integrated with the IdP's authentication service (the details of which are out of scope).&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;em&gt;Single Sign-On Service&lt;/em&gt;
        &lt;p&gt;A &lt;em&gt;single sign-on (SSO) service&lt;/em&gt; is the first point of contact at the IdP.  The SSO service initiates the authentication process at the IdP and ultimately redirects the client to the inter-site transfer service (unless the function of the SSO service and inter-site transfer service are combined, which is encouraged).  Note: The SSO service is not defined by SAML&amp;nbsp;1.1 but is defined by SAML&amp;nbsp;2.0.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;em&gt;Inter-Site Transfer Service&lt;/em&gt;
        &lt;p&gt;The &lt;em&gt;inter-site transfer service&lt;/em&gt; issues HTTP responses according to the browser/POST and browser/artifact profiles.  The inter-site transfer service interacts with the authentication authority behind the scenes to produce the required authentication assertion.  Note: The concept of inter-site transfer service has been deprecated in SAML&amp;nbsp;2.0.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;em&gt;Artifact Resolution Service&lt;/em&gt;
        &lt;p&gt;If the browser/artifact profile is used, the IdP sends an artifact to the SP instead of the actual assertion.  (An &lt;em&gt;artifact&lt;/em&gt; is a reference to an authentication assertion.)  The SP then sends the artifact to the &lt;em&gt;artifact resolution service&lt;/em&gt; at the IdP via a back-channel exchange.  In return, the IdP sends the required authentication assertion to the SP.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;em&gt;Attribute Authority&lt;/em&gt;
        &lt;p&gt;The &lt;em&gt;attribute authority&lt;/em&gt; processes &lt;code&gt;&amp;lt;samlp:AttributeQuery&amp;gt;&lt;/code&gt; requests, that is, it issues attribute assertions.  The attribute authority authenticates and authorizes any requests it receives (since such requests may come from either administrators or principals) before responding.&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Service Provider&lt;/em&gt; (formerly called a &lt;em&gt;target&lt;/em&gt;)
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;Assertion Consumer Service&lt;/em&gt; (formerly called a &lt;em&gt;SHIRE&lt;/em&gt;)
        &lt;p&gt;The &lt;em&gt;assertion consumer service&lt;/em&gt; is the service provider endpoint of the SSO exchange.  It processes the authentication assertion returned by the inter-site transfer service (or artifact resolution service, depending on the profile used), initiates an optional attribute query (see below), establishes a security context at the SP, and redirects the client to the desired target resource.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;em&gt;Attribute Requester&lt;/em&gt; (formerly called a &lt;em&gt;SHAR&lt;/em&gt;)
        &lt;p&gt;An &lt;em&gt;attribute requester&lt;/em&gt; (at the SP) and the attribute authority (at the IdP) may conduct a back-channel attribute exchange once a security context has been established at the SP.  That is, the SP and IdP interact directly, bypassing the principal.&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;em&gt;WAYF Service&lt;/em&gt;
    &lt;p&gt;An optional &lt;em&gt;WAYF service&lt;/em&gt; is operated independently of the SP and IdP.  The WAYF is used by the SP to determine the principal's preferred IdP, with or without user interaction.  The WAYF is essentially a proxy for the authn request passed from the SP to the SSO service at the IdP.  It must therefore fully support the authentication request protocol described below.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: Only the components whose name ends in "Service" have browser-facing URIs.  The attribute authority is also a web service, but it is only accessible by authorized attribute requesters.&lt;/p&gt;

&lt;h4&gt;&lt;a name="profiles"&gt;Shibboleth Profiles&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;Shibboleth specifies two browser-based SSO profiles and a service that may be used with either profile:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href="#browser-post-profile"&gt;Browser/POST Profile&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#browser-artifact-profile"&gt;Browser/Artifact Profile&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#wayf-service"&gt;WAYF Service&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While the corresponding SAML&amp;nbsp;1.1 profiles begin with a request to the IdP, the Shibboleth profiles are service-provider-first, and therefore more complicated.&lt;/p&gt;

&lt;p&gt;To accommodate SP-first profiles, Shibboleth introduces the notion of &lt;em&gt;authentication request&lt;/em&gt;.  A Shibboleth authn request is a URL-encoded message sent to an SSO service endpoint at the IdP.  The following parameters are included in the query string:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;providerId&lt;/code&gt;
    &lt;p&gt;The &lt;code&gt;providerId&lt;/code&gt; parameter is the unique id (usually a URI) of the SP.  The IdP may use the &lt;code&gt;providerId&lt;/code&gt; to perform special handling or processing of the authn request.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code&gt;shire&lt;/code&gt;
    &lt;p&gt;The &lt;code&gt;shire&lt;/code&gt; parameter (so named for historical reasons) is the URI of the assertion consumer service endpoint at the SP.  When using the browser/POST profile, this URI becomes the value of the FORM element's ACTION attribute.  For the browser/artifact profile, the value of the &lt;code&gt;shire&lt;/code&gt; parameter is the redirect URL used by the inter-site transfer service.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code&gt;target&lt;/code&gt;
    &lt;p&gt;The &lt;code&gt;target&lt;/code&gt; parameter is the URI of the target resource.  Regardless of the profile used, the &lt;code&gt;target&lt;/code&gt; parameter must be preserved by the IdP.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code&gt;time&lt;/code&gt;
    &lt;p&gt;The (optional) &lt;code&gt;time&lt;/code&gt; parameter is the current time in seconds past the epoch.  It is used to avoid caching issues on the client.  It is important that the &lt;code&gt;time&lt;/code&gt; parameter &lt;em&gt;not&lt;/em&gt; be used as any kind of security measure.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is an example of a Shibboleth authn request (without URL encoding for clarity):&lt;/p&gt;

&lt;pre&gt;https://idp.com/shibboleth/SSO?&lt;br&gt;  providerId=https://sp.com/shibboleth/&amp;amp;&lt;br&gt;    shire=https://sp.com/shibboleth/SSO&amp;amp;&lt;br&gt;      target=https://sp.com/myresource&amp;amp;&lt;br&gt;        time=1084819377&lt;/pre&gt;

&lt;p&gt;Detailed handling of this request is outlined in the subsections below.&lt;/p&gt;

&lt;h5&gt;&lt;a name="browser-post-profile"&gt;Shibboleth Browser/POST Profile&lt;/a&gt;&lt;/h5&gt;

&lt;p&gt;Here is a possible implementation of the Shibboleth Browser/POST Profile.  The message flow begins with a request for a secured resource at the SP.&lt;/p&gt;

&lt;ol&gt;

  &lt;li&gt;
    The client requests a target resource at the SP:
    &lt;pre&gt;https://sp.com/myresource&lt;/pre&gt;
    The SP performs a security check on behalf of the target resource.  If a valid security context at the SP already exists, skip steps&amp;nbsp;2&amp;ndash;7.
  &lt;/li&gt;

  &lt;li&gt;
    The SP redirects the client to the single sign-on (SSO) service at the IdP.  Three parameters (&lt;code&gt;providerId&lt;/code&gt;, &lt;code&gt;shire&lt;/code&gt;, &lt;code&gt;target&lt;/code&gt;) are appended to the redirect URL.  (The optional &lt;code&gt;time&lt;/code&gt; parameter is omitted in this example.)
  &lt;/li&gt;

  &lt;li&gt;
    The client requests the SSO service at the IdP:
    &lt;pre&gt;https://idp.com/shibboleth/SSO?&lt;br&gt;  providerId=&lt;em&gt;id&lt;/em&gt;&amp;shire=&lt;em&gt;acs&lt;/em&gt;&amp;target=&lt;em&gt;target&lt;/em&gt;&lt;/pre&gt;
    where
    &lt;table border="0" cellspacing="0" cellpadding="0"&gt;
      &lt;tr&gt;
        &lt;td align="right"&gt;&lt;code&gt;&lt;em&gt;id&lt;/em&gt;&lt;/code&gt;&lt;/td&gt;
        &lt;td align="center"&gt;&lt;code&gt;=&lt;/code&gt;&lt;/td&gt;
        &lt;td align="left"&gt;&lt;code&gt;https://sp.com/shibboleth/&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td align="right"&gt;&lt;code&gt;&lt;em&gt;acs&lt;/em&gt;&lt;/code&gt;&lt;/td&gt;
        &lt;td align="center"&gt;&lt;code&gt;=&lt;/code&gt;&lt;/td&gt;
        &lt;td align="left"&gt;&lt;code&gt;https://sp.com/shibboleth/SSO/POST&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td align="right"&gt;&lt;code&gt;&lt;em&gt;target&lt;/em&gt;&lt;/code&gt;&lt;/td&gt;
        &lt;td align="center"&gt;&lt;code&gt;=&lt;/code&gt;&lt;/td&gt;
        &lt;td align="left"&gt;&lt;code&gt;https://sp.com/myresource&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
    The SSO service processes the authn request and performs a security check.  If the user does not have a valid security context, the IdP identifies the principal (details omitted).
  &lt;/li&gt;

  &lt;li&gt;
    The SSO service responds with an HTML form:
    &lt;pre style="font-size: 80%"&gt;...
&amp;lt;form method="post" 
      action="https://sp.com/shibboleth/SSO/POST" ...&amp;gt;
  &amp;lt;input type="hidden" name="TARGET" value="target"&amp;gt;
  &amp;lt;input type="hidden" name="SAMLResponse" value="response"&amp;gt;
  ...
  &amp;lt;input type="submit" value="Submit"&amp;gt;
&amp;lt;/form&amp;gt;
...&lt;/pre&gt;
   where the value of the &lt;code&gt;TARGET&lt;/code&gt; parameter has been preserved from step&amp;nbsp;3.  The value of the &lt;code&gt;SAMLResponse&lt;/code&gt; parameter is the base64 encoding of a SAML &lt;code&gt;Response&lt;/code&gt; element:
   &lt;pre style="font-size: 80%"&gt;&amp;lt;samlp:Response
  xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol"
  MajorVersion="1" MinorVersion="1"
  Recipient="https://sp.com/shibboleth/SSO/POST"
  ResponseID="..."
  IssueInstant="..."&amp;gt;
  &amp;lt;ds:Signature 
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#"&amp;gt;
    &amp;lt;ds:SignedInfo&amp;gt;...&amp;lt;/ds:SignedInfo&amp;gt;
    &amp;lt;ds:SignatureValue&amp;gt;...&amp;lt;/ds:SignatureValue&amp;gt;
    &amp;lt;ds:KeyInfo&amp;gt;...&amp;lt;/ds:KeyInfo&amp;gt;
  &amp;lt;/ds:Signature&amp;gt;
  &amp;lt;samlp:Status&amp;gt;
    &amp;lt;samlp:StatusCode Value="samlp:Success"/&amp;gt;
  &amp;lt;/samlp:Status&amp;gt;
  &amp;lt;saml:Assertion
    xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
    MajorVersion="1" MinorVersion="1"
    AssertionID="..."
    Issuer="https://idp.com/shibboleth/"
    IssueInstant="..."&amp;gt;
    &amp;lt;saml:Conditions 
      NotBefore="..." 
      NotOnOrAfter="..."&amp;gt;
      &amp;lt;saml:AudienceRestrictionCondition&amp;gt;
        &amp;lt;saml:Audience&amp;gt;
          https://sp.com/shibboleth/
        &amp;lt;/saml:Audience&amp;gt;
      &amp;lt;/saml:AudienceRestrictionCondition&amp;gt;
    &amp;lt;/saml:Conditions&amp;gt;
    &amp;lt;saml:AuthenticationStatement
      AuthenticationInstant="..."
      &lt;span style="font-size: 80%"&gt;AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:password"&amp;gt;&lt;/span&gt;
      &amp;lt;saml:Subject&amp;gt;
        &amp;lt;saml:NameIdentifier 
          NameQualifier="https://idp.com/shibboleth/"
          Format="urn:mace:shibboleth:1.0:nameIdentifier"&amp;gt;
          3f7b3dcf-1674-4ecd-92c8-1544f346baf8
        &amp;lt;/saml:NameIdentifier&amp;gt;
        &amp;lt;saml:SubjectConfirmation&amp;gt;
          &amp;lt;saml:ConfirmationMethod&amp;gt;
            urn:oasis:names:tc:SAML:1.0:cm:bearer
          &amp;lt;/saml:ConfirmationMethod&amp;gt;
        &amp;lt;/saml:SubjectConfirmation&amp;gt;
      &amp;lt;/saml:Subject&amp;gt;
    &amp;lt;/saml:AuthenticationStatement&amp;gt;
  &amp;lt;/saml:Assertion&amp;gt;
&amp;lt;/samlp:Response&amp;gt;&lt;/pre&gt;
    Note that the SAML &lt;code&gt;Response&lt;/code&gt; must be digitally signed by the identity provider.
  &lt;/li&gt;

  &lt;li&gt;
    The client issues a POST request to the assertion consumer service at the service provider.  To automate the submission of the form, the following line of JavaScript may appear anywhere on the page:
    &lt;pre&gt;window.onload = 
  function() { document.forms[0].submit(); };&lt;/pre&gt;
    This assumes of course that the page contains a single FORM element.  If JavaScript is disabled on the client, the user simply presses the submit button.
  &lt;/li&gt;

  &lt;li&gt;
    The assertion consumer service processes the authn response, creates a security context at the SP and redirects the client to the target resource.
  &lt;/li&gt;

  &lt;li&gt;
    The client requests the target resource at the SP (again):
    &lt;pre&gt;https://sp.com/myresource&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;
    Since a security context exists, the SP returns the resource to the client.
  &lt;/li&gt;

&lt;/ol&gt;

&lt;h5&gt;&lt;a name="browser-artifact-profile"&gt;Shibboleth Browser/Artifact Profile&lt;/a&gt;&lt;/h5&gt;

&lt;p&gt;Here is a possible implementation of the Shibboleth Browser/Artifact Profile.  The message flow begins with a request for a secured resource at the SP.&lt;/p&gt;

&lt;ol&gt;

  &lt;li&gt;
    The client requests a target resource at the SP:
    &lt;pre&gt;https://sp.com/myresource&lt;/pre&gt;
    The SP performs a security check on behalf of the target resource.  If a valid security context at the SP already exists, skip steps&amp;nbsp;2&amp;ndash;9.
  &lt;/li&gt;

  &lt;li&gt;
    The SP redirects the client to the single sign-on (SSO) service at the IdP.  Three parameters (&lt;code&gt;providerId&lt;/code&gt;, &lt;code&gt;shire&lt;/code&gt;, &lt;code&gt;target&lt;/code&gt;) are appended to the redirect URL.  (The optional &lt;code&gt;time&lt;/code&gt; parameter is omitted in this example.)
  &lt;/li&gt;

  &lt;li&gt;
    The client requests the SSO service at the IdP:
    &lt;pre&gt;https://idp.com/shibboleth/SSO?&lt;br&gt;  providerId=&lt;em&gt;id&lt;/em&gt;&amp;shire=&lt;em&gt;acs&lt;/em&gt;&amp;target=&lt;em&gt;target&lt;/em&gt;&lt;/pre&gt;
    where
    &lt;table border="0" cellspacing="0" cellpadding="0"&gt;
      &lt;tr&gt;
        &lt;td align="right"&gt;&lt;code&gt;&lt;em&gt;id&lt;/em&gt;&lt;/code&gt;&lt;/td&gt;
        &lt;td align="center"&gt;&lt;code&gt;=&lt;/code&gt;&lt;/td&gt;
        &lt;td align="left"&gt;&lt;code&gt;https://sp.com/shibboleth/&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td align="right"&gt;&lt;code&gt;&lt;em&gt;acs&lt;/em&gt;&lt;/code&gt;&lt;/td&gt;
        &lt;td align="center"&gt;&lt;code&gt;=&lt;/code&gt;&lt;/td&gt;
        &lt;td align="left"&gt;&lt;code&gt;https://sp.com/shibboleth/SSO/Artifact&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td align="right"&gt;&lt;code&gt;&lt;em&gt;target&lt;/em&gt;&lt;/code&gt;&lt;/td&gt;
        &lt;td align="center"&gt;&lt;code&gt;=&lt;/code&gt;&lt;/td&gt;
        &lt;td align="left"&gt;&lt;code&gt;https://sp.com/myresource&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
    The SSO service processes the authn request and performs a security check.  If the user does not have a valid security context, the IdP identifies the principal (details omitted).
  &lt;/li&gt;

  &lt;li&gt;
    The SSO service redirects the client to the assertion consumer service at the SP.  A &lt;code&gt;TARGET&lt;/code&gt; parameter and a &lt;code&gt;SAMLart&lt;/code&gt; parameter are appended to the redirect URL.
  &lt;/li&gt;

  &lt;li&gt;
    The client requests the assertion consumer service at the SP:
    &lt;pre&gt;https://sp.com/shibboleth/SSO/Artifact?&lt;br&gt;  TARGET=&lt;em&gt;target&lt;/em&gt;&amp;SAMLart=&lt;em&gt;artifact&lt;/em&gt;&lt;/pre&gt;
    where the value of the &lt;code&gt;TARGET&lt;/code&gt; parameter is preserved from step&amp;nbsp;3 and the &lt;code&gt;SAMLart&lt;/code&gt; parameter is a SAML artifact.
  &lt;/li&gt;

  &lt;li&gt;
    The assertion consumer service dereferences the artifact by sending a SAML &lt;code&gt;Request&lt;/code&gt; to the artifact resolution service at the IdP:
    &lt;pre style="font-size: 80%"&gt;&amp;lt;samlp:Request 
  xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" 
  MajorVersion="1" MinorVersion="1" 
  RequestID="..." 
  IssueInstant="..."&amp;gt;
  &amp;lt;samlp:AssertionArtifact&amp;gt;
    &lt;em&gt;artifact&lt;/em&gt;
  &amp;lt;/samlp:AssertionArtifact&amp;gt;
&amp;lt;/samlp:Request&amp;gt;&lt;/pre&gt;
  where &lt;code&gt;&lt;em&gt;artifact&lt;/em&gt;&lt;/code&gt; is the SAML artifact at step&amp;nbsp;5.
  &lt;/li&gt;

  &lt;li&gt;
    The artifact resolution service at the IdP returns a SAML &lt;code&gt;Response&lt;/code&gt; (containing an authn assertion) to the assertion consumer service at the SP:
    &lt;pre style="font-size: 80%"&gt;&amp;lt;samlp:Response
  xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol"
  MajorVersion="1" MinorVersion="1"
  Recipient="https://sp.com/shibboleth/SSO/Artifact"
  ResponseID="..."
  InResponseTo="..."
  IssueInstant="..."&amp;gt;
  &amp;lt;samlp:Status&amp;gt;
    &amp;lt;samlp:StatusCode Value="samlp:Success"/&amp;gt;
  &amp;lt;/samlp:Status&amp;gt;
  &amp;lt;saml:Assertion
    xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
    MajorVersion="1" MinorVersion="1"
    AssertionID="..."
    Issuer="https://idp.com/shibboleth/"
    IssueInstant="..."&amp;gt;
    &amp;lt;saml:Conditions 
      NotBefore="..."
      NotOnOrAfter="..."/&amp;gt;
    &amp;lt;saml:AuthenticationStatement
      &lt;span style="font-size: 80%"&gt;AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:password"&lt;/span&gt;
      AuthenticationInstant="..."&amp;gt;
      &amp;lt;saml:Subject&amp;gt;
        &amp;lt;saml:NameIdentifier 
          NameQualifier="https://idp.com/shibboleth/"
          Format="urn:mace:shibboleth:1.0:nameIdentifier"&amp;gt;
          3f7b3dcf-1674-4ecd-92c8-1544f346baf8
        &amp;lt;/saml:NameIdentifier&amp;gt;
        &amp;lt;saml:SubjectConfirmation&amp;gt;
          &amp;lt;saml:ConfirmationMethod&amp;gt;
            urn:oasis:names:tc:SAML:1.0:cm:artifact
          &amp;lt;/saml:ConfirmationMethod&amp;gt;
        &amp;lt;/saml:SubjectConfirmation&amp;gt;
      &amp;lt;/saml:Subject&amp;gt;
    &amp;lt;/saml:AuthenticationStatement&amp;gt;
  &amp;lt;/saml:Assertion&amp;gt;
&amp;lt;/samlp:Response&amp;gt;&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;
    The assertion consumer service processes the authn response, creates a security context at the SP and redirects the client to the target resource.
  &lt;/li&gt;

  &lt;li&gt;
    The client requests the target resource at the SP (again):
    &lt;pre&gt;https://sp.com/myresource&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;
    Since a security context exists, the SP returns the resource to the client.
  &lt;/li&gt;

&lt;/ol&gt;

&lt;h5&gt;&lt;a name="wayf-service"&gt;WAYF Service&lt;/a&gt;&lt;/h5&gt;

&lt;p&gt;A WAYF ("Where are you from?") service is an intermediary between the SP and the IdP.  In general, the SP does not know the user's preferred IdP.  The process whereby the SP determines the appropriate IdP is called &lt;em&gt;identity provider discovery&lt;/em&gt; (generally, a very difficult problem).&lt;/p&gt;

&lt;p&gt;Shibboleth specifies an (optional) WAYF service to aid the SP in IdP discovery.  In practice, the SP sends its authn request to the WAYF, which somehow determines the user's preferred IdP (through unspecified means) and then subsequently redirects the client to the desired IdP.  The WAYF preserves the values of all parameters except the &lt;code&gt;time&lt;/code&gt; parameter, which is updated.&lt;/p&gt;

&lt;p&gt;A real world example is the WAYF service operated by &lt;a href="http://inqueue.internet2.edu/"&gt;InQueue&lt;/a&gt;.  As an experiment, click the link below:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://wayf.internet2.edu/InQueue/sample.jsp"&gt;https://wayf.internet2.edu/InQueue/sample.jsp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

This resource is protected by a Shibboleth SP, which redirects you to the InQueue WAYF.  In your browser's location field, you will see the following redirect URL:

&lt;pre style="font-size: 80%"&gt;https://wayf.internet2.edu/InQueue/WAYF?&lt;br&gt;  target=https%3A%2F%2Fwayf.internet2.edu%2FInQueue%2Fsample.jsp&amp;&lt;br&gt;    shire=https%3A%2F%2Fwayf.internet2.edu%2FShibboleth.shire&amp;&lt;br&gt;      time=1099609640&amp;&lt;br&gt;        providerId=urn%3Amace%3Ainqueue%3Aexample.edu&lt;/pre&gt;

&lt;p&gt;Now view the source of the InQueue WAYF form and note the hidden fields that preserve the parameters of the original authn request.&lt;/p&gt;

&lt;h4&gt;&lt;a name="attributes"&gt;Attributes&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;Compared to other federated identity management solutions, Shibboleth has a well-defined attribute sharing and management process.  Shibboleth specifies the use of a standard SOAP-based &lt;a href="#attribute-query-protocol"&gt;attribute query protocol&lt;/a&gt; from SAML&amp;nbsp;1.1, a standardized &lt;a href="#directory-schema"&gt;directory schema&lt;/a&gt; called eduPerson, and &lt;a href="#attribute-release-policy"&gt;attribute release policies&lt;/a&gt; that allow both users and administrators to control the flow of attributes from IdP to SP.  As a result, Shibboleth provides powerful authorization capabilities while protecting the privacy of users.&lt;/p&gt;

&lt;h5&gt;&lt;a name="attribute-query-protocol"&gt;Attribute Query Protocol&lt;/a&gt;&lt;/h5&gt;

&lt;p&gt;Although attributes may be embedded in the authn assertion transferred from IdP to SP, Shibboleth specifies an optional back-channel exchange using SAML over SOAP over HTTP.  The SP sends a &lt;code&gt;&amp;lt;samlp:AttributeQuery&amp;gt;&lt;/code&gt; element to the IdP and receives an &lt;code&gt;&amp;lt;saml:AttributeStatement&amp;gt;&lt;/code&gt; in return.  For example, the SP may send an attribute query something like the following:&lt;/p&gt;

&lt;pre style="font-size: 80%"&gt;&amp;lt;samlp:Request
  xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol"
  IssueInstant="2004-05-25T22:46:10Z" 
  MajorVersion="1" MinorVersion="1"
  RequestID="aaf2319617732113474afe114412ab72"&amp;gt;
  &amp;lt;samlp:AttributeQuery 
    Resource="https://sp.com/shibboleth/"&amp;gt;
    &amp;lt;saml:Subject 
      xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"&amp;gt;
      &amp;lt;saml:NameIdentifier 
        Format="urn:mace:shibboleth:1.0:nameIdentifier"
        NameQualifier="https://idp.com/shibboleth/"&amp;gt;
        082dd87d-f380-4fd6-8726-694ef2bb71e9
      &amp;lt;/saml:NameIdentifier&amp;gt;
    &amp;lt;/saml:Subject&amp;gt;
  &amp;lt;/samlp:AttributeQuery&amp;gt;
&amp;lt;/samlp:Request&amp;gt;&lt;/pre&gt;

&lt;p&gt;The IdP may respond with the following attribute assertion:&lt;/p&gt;

&lt;pre style="font-size: 80%"&gt;&amp;lt;samlp:Response
  xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol"
  InResponseTo="aaf2319617732113474afe114412ab72"
  IssueInstant="2004-05-25T22:46:10.940Z" 
  MajorVersion="1" MinorVersion="1"
  ResponseID="b07b804c7c29ea1673004f3d6f7928ac"&amp;gt;
  &amp;lt;samlp:Status&amp;gt;
    &amp;lt;samlp:StatusCode Value="samlp:Success"/&amp;gt;
  &amp;lt;/samlp:Status&amp;gt;
  &amp;lt;saml:Assertion 
    xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
    AssertionID="a144e8f3adad594a9649924517abe933"
    IssueInstant="2004-05-25T22:46:10.939Z" 
    MajorVersion="1" MinorVersion="1"
    Issuer="https://idp.com/shibboleth/"&amp;gt;
    &amp;lt;saml:Conditions 
      NotBefore="2004-05-25T22:46:10.939Z"
      NotOnOrAfter="2004-05-25T23:16:10.939Z"&amp;gt;
    &amp;lt;/saml:Conditions&amp;gt;
    &amp;lt;saml:AttributeStatement&amp;gt;
      &amp;lt;saml:Subject&amp;gt;
        &amp;lt;saml:NameIdentifier 
          Format="urn:mace:shibboleth:1.0:nameIdentifier"
          NameQualifier="https://idp.com/shibboleth/"&amp;gt;
          082dd87d-f380-4fd6-8726-694ef2bb71e9
        &amp;lt;/saml:NameIdentifier&amp;gt;
      &amp;lt;/saml:Subject&amp;gt;
      &amp;lt;saml:Attribute 
        &lt;span style="font-size: 80%"&gt;AttributeName="urn:mace:dir:attribute-def:eduPersonEntitlement"&lt;/span&gt;
        &lt;span style="font-size: 80%"&gt;AttributeNamespace="urn:mace:shibboleth:1.0:attributeNamespace:uri"&amp;gt;&lt;/span&gt;
        &amp;lt;saml:AttributeValue&amp;gt;
          urn:mace:oclc.org:100277910
        &amp;lt;/saml:AttributeValue&amp;gt;
        &amp;lt;saml:AttributeValue&amp;gt;
          urn:mace:example.edu:exampleEntitlement
        &amp;lt;/saml:AttributeValue&amp;gt;
        &amp;lt;saml:AttributeValue&amp;gt;
          urn:mace:incommon:entitlement:common:1
        &amp;lt;/saml:AttributeValue&amp;gt;
      &amp;lt;/saml:Attribute&amp;gt;
    &amp;lt;/saml:AttributeStatement&amp;gt;
  &amp;lt;/saml:Assertion&amp;gt;
&amp;lt;/samlp:Response&amp;gt;&lt;/pre&gt;

&lt;p&gt;It is important that the attribute authority be protected against unauthorized access.&lt;/p&gt;

&lt;h5&gt;&lt;a name="directory-schema"&gt;Directory Schema&lt;/a&gt;&lt;/h5&gt;

&lt;p&gt;In a cross-domain federated environment, a standard approach to user attributes is crucial.  It is essential that providers be on the same page with respect to attributes.  If not, this will be a major impediment to federated identity on a large scale.&lt;/p&gt;

&lt;p&gt;To address this issue, Internet2 has developed an LDAP object class for higher education called &lt;em&gt;eduPerson&lt;/em&gt;, which is administered by EDUCAUSE:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;eduPerson &amp;lt;&lt;a href="http://www.educause.edu/eduperson/"&gt;http://www.educause.edu/eduperson/&lt;/a&gt;&amp;gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;eduPerson is derived from the standard LDAP object class called inetOrgPerson (&lt;a href="http://www.ietf.org/rfc/rfc2798.txt"&gt;RFC&amp;nbsp;2798&lt;/a&gt;), which itself is based on other standard LDAP classes (see, e.g., &lt;a href="http://www.ietf.org/rfc/rfc2256.txt"&gt;RFC&amp;nbsp;2256&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Of all the attributes defined by this hierarchy of object classes, approximately 40&amp;nbsp;attributes have been defined by &lt;a href="http://www.incommonfederation.org/"&gt;InCommon&lt;/a&gt; as &lt;a href="http://www.incommonfederation.org/docs/policies/federatedattributes.html"&gt;&lt;em&gt;common identity attributes&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="0"&gt;
  &lt;tr&gt;
    &lt;th align="left" style="border-bottom: thin solid black"&gt;Common Attributes&lt;/th&gt;
    &lt;th align="right" style="border-bottom: thin solid black"&gt;&amp;nbsp;&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td align="left"&gt;Highly recommended&amp;nbsp;&amp;nbsp;&lt;/td&gt;
    &lt;td align="right"&gt;6&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td align="left"&gt;Suggested&lt;/td&gt;
    &lt;td align="right"&gt;10&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td align="left"&gt;Optional&lt;/td&gt;
    &lt;td align="right"&gt;25&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td align="left" style="border-top: thin solid black"&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td align="right" style="border-top: thin solid black"&gt;&lt;strong&gt;41&lt;/strong&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;For example, here are InCommon's six "highly recommended" attributes:&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="0"&gt;
  &lt;tr&gt;
    &lt;th align="left" style="border-bottom: thin solid black"&gt;Attribute Name&lt;/th&gt;
    &lt;th align="left" style="border-bottom: thin solid black"&gt;Example&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td align="left"&gt;givenName&lt;/td&gt;
    &lt;td align="left"&gt;Mary&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td align="left"&gt;sn (surname)&lt;/td&gt;
    &lt;td align="left"&gt;Smith&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td align="left"&gt;cn (common name)&lt;/td&gt;
    &lt;td align="left"&gt;Mary Smith&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td align="left"&gt;eduPersonScopedAffiliation&amp;nbsp;&amp;nbsp;&lt;/td&gt;
    &lt;td align="left"&gt;student@some.idp.edu&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td align="left"&gt;eduPersonPrincipalName&lt;/td&gt;
    &lt;td align="left"&gt;mary.smith@some.idp.edu&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td align="left" style="border-bottom: thin solid black"&gt;eduPersonTargetedID&lt;/td&gt;
    &lt;td align="left" style="border-bottom: thin solid black"&gt;6xCI1qyLfj12h9wiogTmcebZcL0&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;&lt;td colspan="2"&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;The &lt;code&gt;NameIdentifier&lt;/code&gt; used in the previous examples is a privacy-preserving, opaque identifier that precludes the need to positively identify the principal.  Unlike &lt;code&gt;NameIdentifier&lt;/code&gt;, which is a &lt;em&gt;transient&lt;/em&gt; identifier, &lt;code&gt;eduPersonTargetedID&lt;/code&gt; is a &lt;em&gt;persistent&lt;/em&gt; identifier.  See the &lt;a href="http://www.nmi-edit.org/eduPerson/internet2-mace-dir-eduperson-200312.html"&gt;EduPerson Specification&lt;/a&gt; (200312) for more information about &lt;code&gt;eduPersonTargetedID&lt;/code&gt;.&lt;/p&gt;

&lt;h5&gt;&lt;a name="attribute-release-policy"&gt;Attribute Release Policy&lt;/a&gt;&lt;/h5&gt;

&lt;p&gt;An &lt;em&gt;attribute release policy&lt;/em&gt; (ARP) dictates what user attributes are released to individual service providers.  For example, consider the following XML representation of an ARP:&lt;/p&gt;

&lt;pre style="font-size: 80%"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" ?&gt; 
&amp;lt;arp:AttributeReleasePolicy 
  xmlns:arp="urn:mace:shibboleth:arp:1.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="urn:mace:shibboleth:arp:1.0 shib-arp-1.0.xsd"&amp;gt;
  &amp;lt;arp:Description&amp;gt;
    This policy applies to all SPs.
  &amp;lt;/arp:Description&amp;gt;
  &amp;lt;arp:Rule&amp;gt;
    &amp;lt;arp:Target&amp;gt;&amp;lt;arp:AnyTarget /&amp;gt;&amp;lt;/arp:Target&amp;gt;
    &amp;lt;arp:Attribute 
      name="urn:mace:eduPerson:1.0:eduPersonPrincipalName"&amp;gt;
      &amp;lt;arp:AnyValue release="permit" /&amp;gt;
    &amp;lt;/arp:Attribute&amp;gt;
    &amp;lt;arp:Attribute 
      name="urn:mace:eduPerson:1.0:eduPersonAffiliation"&amp;gt;
      &amp;lt;arp:Value release="permit"&gt;member@some.idp.edu&amp;lt;/arp:Value&amp;gt;
    &amp;lt;/arp:Attribute&amp;gt;
  &amp;lt;/arp:Rule&amp;gt;
&amp;lt;/arp:AttributeReleasePolicy&amp;gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;arp:Target&amp;gt;&lt;/code&gt; element lists the SPs to which the rule applies.  The above ARP applies to &lt;em&gt;all&lt;/em&gt; SPs but individual SPs may be listed.  Regular expressions may be used to denote groups of SPs.  See the &lt;a href="https://umdrive.memphis.edu/wassa/public/ARPs/arp.spec.html"&gt;ARP specification&lt;/a&gt; for additional examples.&lt;/p&gt;

&lt;p&gt;Once the applicable SPs have been defined, the ARP lists the attributes that may be released to those SPs.  In the above example, attribute &lt;code&gt;eduPersonPrincipalName&lt;/code&gt; may be released to any SP.  Attribute &lt;code&gt;eduPersonAffiliation&lt;/code&gt; may also be released, but only one value is permitted, namely, "member@some.idp.edu".&lt;/p&gt;

&lt;h4&gt;&lt;a name="metadata"&gt;Metadata&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;Both IdPs and SPs publish information about themselves in special XML files called &lt;em&gt;metadata&lt;/em&gt; files.  Since metadata precisely identify the provider and the services it offers, metadata files are digitally signed for security and privacy.&lt;/p&gt;

&lt;p&gt;Shibboleth specifies a minimal subset of the SAML2 metadata specification.  Only four &lt;b&gt;md:RoleDescriptorType&lt;/b&gt; elements are defined by Shibboleth:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code&gt;&amp;lt;md:IDPSSODescriptor&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;&amp;lt;md:SPSSODescriptor&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;&amp;lt;md:AuthnAuthorityDescriptor&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;&amp;lt;md:AttributeAuthorityDescriptor&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These metadata elements correspond to the SSO service (IdP), the assertion consumer service (SP), the authentication authority (IdP), and the attribute authority (IdP), respectively.&lt;/p&gt;

&lt;p&gt;For example, here is an example of a Shibboleth IdP metadata file (with signatures and keys omitted):&lt;/p&gt;

&lt;pre style="font-size: 80%"&gt;&amp;lt;md:EntityDescriptor 
  xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
  xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
  xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
  entityID="https://idp.edu/shibboleth/"&amp;gt;
  &amp;lt;ds:Signature&amp;gt;...&amp;lt;/ds:Signature&amp;gt;
  &amp;lt;md:IDPSSODescriptor
    &lt;span style="font-size: 80%"&gt;protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.0:protocol:v1.1&lt;br&gt; urn:mace:shibboleth:1.0"&amp;gt;&lt;/span&gt;
    &amp;lt;md:KeyDescriptor use="signing"&amp;gt;
      &amp;lt;ds:KeyInfo&amp;gt;
        &amp;lt;ds:KeyName&amp;gt;IdP SSO Key&amp;lt;/ds:KeyName&amp;gt;
      &amp;lt;/ds:KeyInfo&amp;gt;
    &amp;lt;/md:KeyDescriptor&amp;gt;
    &amp;lt;md:ArtifactResolutionService isDefault="true" index="0"
      Binding="urn:oasis:names:tc:SAML:1.0:profiles:artifact-01"
      Location="https://idp.edu/shibboleth/ArtifactResolution"/&amp;gt;
    &amp;lt;md:NameIDFormat&amp;gt;
      urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName
    &amp;lt;/md:NameIDFormat&amp;gt;
    &amp;lt;md:NameIDFormat&amp;gt;
      urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress
    &amp;lt;/md:NameIDFormat&amp;gt;
    &amp;lt;md:NameIDFormat&amp;gt;
      urn:mace:shibboleth:1.0:nameIdentifier
    &amp;lt;/md:NameIDFormat&amp;gt;
    &amp;lt;md:SingleSignOnService
      Binding="urn:mace:shibboleth:1.0:profiles:authnRequest"
      Location="https://idp.edu/shibboleth/SSO"/&amp;gt;
  &amp;lt;/md:IDPSSODescriptor&amp;gt;
  &amp;lt;md:AttributeAuthorityDescriptor
    &lt;span style="font-size: 80%"&gt;protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.0:protocol:v1.1"&amp;gt;&lt;/span&gt;
    &amp;lt;md:KeyDescriptor use="signing"&amp;gt;
      &amp;lt;ds:KeyInfo&amp;gt;
        &amp;lt;ds:KeyName&amp;gt;IdP AA Key&amp;lt;/ds:KeyName&amp;gt;
      &amp;lt;/ds:KeyInfo&amp;gt;
    &amp;lt;/md:KeyDescriptor&amp;gt;
    &amp;lt;md:AttributeService
      Binding="urn:oasis:names:tc:SAML:1.0:bindings:SOAP-binding"
      Location="https://idp.edu/shibboleth/AA/SOAP"/&amp;gt;
    &amp;lt;saml:Attribute
      &lt;span style="font-size: 80%"&gt;AttributeName="urn:mace:eduPerson:1.0:eduPersonPrincipalName"&lt;/span&gt;
      &lt;span style="font-size: 80%"&gt;AttributeNamespace="urn:mace:shibboleth:1.0:attributeNamespace:uri"/&amp;gt;&lt;/span&gt;
    &amp;lt;saml:Attribute
      &lt;span style="font-size: 80%"&gt;AttributeName="urn:mace:eduPerson:1.0:eduPersonAffiliation"&lt;/span&gt;
      &lt;span style="font-size: 80%"&gt;AttributeNamespace="urn:mace:shibboleth:1.0:attributeNamespace:uri"&amp;gt;&lt;/span&gt;
      &amp;lt;saml:AttributeValue&amp;gt;member&amp;lt;/saml:AttributeValue&amp;gt;
      &amp;lt;saml:AttributeValue&amp;gt;student&amp;lt;/saml:AttributeValue&amp;gt;
      &amp;lt;saml:AttributeValue&amp;gt;faculty&amp;lt;/saml:AttributeValue&amp;gt;
      &amp;lt;saml:AttributeValue&amp;gt;employee&amp;lt;/saml:AttributeValue&amp;gt;
      &amp;lt;saml:AttributeValue&amp;gt;staff&amp;lt;/saml:AttributeValue&amp;gt;
    &amp;lt;/saml:Attribute&amp;gt;
    &amp;lt;md:NameIDFormat&amp;gt;
      urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName
    &amp;lt;/md:NameIDFormat&amp;gt;
    &amp;lt;md:NameIDFormat&amp;gt;
      urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress
    &amp;lt;/md:NameIDFormat&amp;gt;
    &amp;lt;md:NameIDFormat&amp;gt;
      urn:mace:shibboleth:1.0:nameIdentifier
    &amp;lt;/md:NameIDFormat&amp;gt;
  &amp;lt;/md:AttributeAuthorityDescriptor&amp;gt;
  &amp;lt;md:Organization&amp;gt;
    &amp;lt;md:OrganizationName xml:lang="en"&amp;gt;
      Identity Provider University
    &amp;lt;/md:OrganizationName&amp;gt;
    &amp;lt;md:OrganizationDisplayName xml:lang="en"&amp;gt;
      Identity Provider University @ Some Location
    &amp;lt;/md:OrganizationDisplayName&amp;gt;
    &amp;lt;md:OrganizationURL xml:lang="en"&amp;gt;
      http://www.idp.edu/
    &amp;lt;/md:OrganizationURL&amp;gt;
  &amp;lt;/md:Organization&amp;gt;
&amp;lt;/md:EntityDescriptor&amp;gt;&lt;/pre&gt;

&lt;p&gt;Likewise, here is an example of a Shibboleth SP metadata file:&lt;/p&gt;

&lt;pre style="font-size: 80%"&gt;&amp;lt;md:EntityDescriptor 
  xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
  xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
  xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
  entityID="https://sp.edu/shibboleth/"&amp;gt;
  &amp;lt;ds:Signature&amp;gt;...&amp;lt;/ds:Signature&amp;gt;
  &amp;lt;md:SPSSODescriptor
    &lt;span style="font-size: 80%"&gt;protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.0:protocol:v1.1"&amp;gt;&lt;/span&gt;
    &amp;lt;md:KeyDescriptor use="signing"&amp;gt;
      &amp;lt;ds:KeyInfo&amp;gt;
        &amp;lt;ds:KeyName&amp;gt;SP SSO Key&amp;lt;/ds:KeyName&amp;gt;
      &amp;lt;/ds:KeyInfo&amp;gt;
    &amp;lt;/md:KeyDescriptor&amp;gt;
    &amp;lt;md:NameIDFormat&amp;gt;
      urn:mace:shibboleth:1.0:nameIdentifier
    &amp;lt;/md:NameIDFormat&amp;gt;
    &amp;lt;md:AssertionConsumerService isDefault="true" index="0"
      Binding="urn:oasis:names:tc:SAML:1.0:profiles:browser-post"
      Location="https://sp.edu/shibboleth/SSO/POST"/&amp;gt;
    &amp;lt;md:AssertionConsumerService index="1"
      Binding="urn:oasis:names:tc:SAML:1.0:profiles:artifact-01"
      Location="https://sp.edu/shibboleth/SSO/Artifact"/&amp;gt;
    &amp;lt;md:AttributeConsumingService index="0"&amp;gt;
      &amp;lt;md:ServiceName xml:lang="en"&amp;gt;
        Service Provider University Portal
      &amp;lt;/md:ServiceName&amp;gt;
      &amp;lt;md:RequestedAttribute
        &lt;span style="font-size: 80%"&gt;AttributeName="urn:mace:eduPerson:1.0:eduPersonEntitlement"&lt;/span&gt;
        &lt;span style="font-size: 80%"&gt;AttributeNamespace="urn:mace:shibboleth:1.0:attributeNamespace:uri"&amp;gt;&lt;/span&gt;
        &amp;lt;saml:AttributeValue&amp;gt;
          https://sp.edu/entitlements/123456789
        &amp;lt;/saml:AttributeValue&amp;gt;
      &amp;lt;/md:RequestedAttribute&amp;gt;
    &amp;lt;/md:AttributeConsumingService&amp;gt;
  &amp;lt;/md:SPSSODescriptor&amp;gt;
  &amp;lt;md:Organization&amp;gt;
    &amp;lt;md:OrganizationName xml:lang="en"&amp;gt;
      Service Provider University
    &amp;lt;/md:OrganizationName&amp;gt;
    &amp;lt;md:OrganizationDisplayName xml:lang="en"&amp;gt;
      Service Provider University @ Some Location
    &amp;lt;/md:OrganizationDisplayName&amp;gt;
    &amp;lt;md:OrganizationURL xml:lang="en"&amp;gt;
      http://www.sp.edu/
    &amp;lt;/md:OrganizationURL&amp;gt;
  &amp;lt;/md:Organization&amp;gt;
&amp;lt;/md:EntityDescriptor&amp;gt;&lt;/pre&gt;

&lt;h4&gt;&lt;a name="summary"&gt;Summary&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;Shibboleth enjoys a number of advantages over other federated identity management solutions:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;relatively simple architecture (compared to Liberty&amp;nbsp;1.2 and SAML&amp;nbsp;2.0, e.g.)&lt;/li&gt;
  &lt;li&gt;an open-source implementation&lt;/li&gt;
  &lt;li&gt;good online technical support&lt;/li&gt;
  &lt;li&gt;emphasis on user privacy (ARPs, e.g.)&lt;/li&gt;
  &lt;li&gt;standardized attributes (via eduPerson)&lt;/li&gt;
  &lt;li&gt;well-developed federations (InQueue, InCommon)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of course Shibboleth has some disadvantages as well:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;difficult to install&lt;/li&gt;
  &lt;li&gt;not fully compliant with SAML&amp;nbsp;1.1&lt;/li&gt;
  &lt;li&gt;limited exposure outside academia&lt;/li&gt;
  &lt;li&gt;no single logout profile&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For an excellent, high-level introduction to Shibboleth and related Internet2 technology, see:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.educause.edu/pub/eq/eqm04/eqm0442.asp"&gt;http://www.educause.edu/pub/eq/eqm04/eqm0442.asp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7514525-109926933376118500?l=trscavo.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/109926933376118500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/109926933376118500'/><link rel='alternate' type='text/html' href='http://trscavo.blogspot.com/2004/10/shibboleth.html' title='Shibboleth'/><author><name>Tom Scavo</name><uri>http://www.blogger.com/profile/07476406033382071801</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01418569831996406907'/></author></entry><entry><id>tag:blogger.com,1999:blog-7514525.post-109758942916160225</id><published>2004-10-12T09:36:00.000-04:00</published><updated>2004-12-15T14:51:08.483-05:00</updated><title type='text'>SAML1</title><content type='html'>&lt;p&gt;&lt;em&gt;Security Assertion Markup Language&lt;/em&gt; (SAML) is an XML standard for exchanging authentication and authorization data between security domains, that is, between an &lt;em&gt;identity provider&lt;/em&gt; and a &lt;em&gt;service provider&lt;/em&gt;.  SAML is a product of the OASIS Security Services Technical Committee:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;SAML&lt;/em&gt; &amp;lt;&lt;a href="http://www.oasis-open.org/committees/security/"&gt;http://www.oasis-open.org/committees/security/&lt;/a&gt;&amp;gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The single most important problem that SAML is trying to solve is the &lt;em&gt;web single sign-on&lt;/em&gt; (SSO) problem.  SSO solutions at the intranet level abound (using cookies, e.g.) but extending these solutions beyond the intranet has been problematic and has led to the proliferation of proprietary technologies that do not interoperate.  SAML has become the definitive standard underlying many web SSO solutions in the identity management problem space.&lt;/p&gt;

&lt;p&gt;SAML assumes the &lt;em&gt;principal&lt;/em&gt; (often a user) has enrolled with at least one identity provider.  This identity provider is expected to provide local authentication services to the principal.  However, SAML does not specify the implementation of these local services; indeed, SAML does not care how local authentication  services are implemented (although individual service providers most certainly will).&lt;/p&gt;

&lt;h4&gt;SAML&amp;nbsp;1.0&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;SAML&amp;nbsp;1.0&lt;/em&gt; was adopted as an OASIS standard in Nov&amp;nbsp;2002.  SAML has undergone one minor and one major revision since V1.0, which itself is a relatively simple protocol.  SAML&amp;nbsp;1.0 is of more than historical interest, however, since the Federal &lt;a href="http://www.cio.gov/eauthentication/"&gt;E-Authentication Initiative&lt;/a&gt; has adopted SAML&amp;nbsp;1.0 as its core technology.&lt;/p&gt;

&lt;p&gt;Fortunately, versions&amp;nbsp;1.0 and 1.1 of SAML are similar.  See the document&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Differences between OASIS Security Assertion Markup Language (SAML) V1.1 and V1.0&lt;/em&gt; [&lt;a href="http://www.oasis-open.org/committees/download.php/3412/sstc-saml-diff-1.1-draft-01.pdf"&gt;SAMLDiff&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;for specific differences between the two standards.  This article concentrates on SAML&amp;nbsp;1.1 since it is the definitive standard on which most other standards and implementations depend.&lt;/p&gt;

&lt;h4&gt;SAML&amp;nbsp;1.1&lt;/h4&gt;

&lt;p&gt;[&amp;nbsp;&lt;a href="#assertions"&gt;Assertions&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="#protocol"&gt;Protocol&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="#bindings"&gt;Bindings&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="#profiles"&gt;Profiles&lt;/a&gt;&amp;nbsp;]&lt;/p&gt;

&lt;p&gt;&lt;em&gt;SAML&amp;nbsp;1.1&lt;/em&gt; was ratified as an OASIS standard in Sep&amp;nbsp;2003.  The critical aspects of SAML&amp;nbsp;1.1 are covered in detail in the following three documents:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Conformance Program Specification for the OASIS Security Assertion Markup Language (SAML)&lt;/em&gt; [&lt;a href="http://www.oasis-open.org/committees/download.php/3402/oasis-sstc-saml-conform-1.1.pdf"&gt;SAMLConform&lt;/a&gt;]&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Assertions and Protocol for the OASIS Security Assertion Markup Language (SAML)&lt;/em&gt; [&lt;a href="http://www.oasis-open.org/committees/download.php/3406/oasis-sstc-saml-core-1.1.pdf"&gt;SAMLCore&lt;/a&gt;]&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Bindings and Profiles for the OASIS Security Assertion Markup Language (SAML)&lt;/em&gt; [&lt;a href="http://www.oasis-open.org/committees/download.php/3405/oasis-sstc-saml-bindings-1.1.pdf"&gt;SAMLBind&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are new to SAML, your first reading should probably be the following document:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Technical Overview of the OASIS Security Assertion Markup Language (SAML)&lt;/em&gt; [&lt;a href="http://www.oasis-open.org/committees/download.php/6837/sstc-saml-tech-overview-1.1-cd.pdf"&gt;SAMLOverview&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;  

&lt;p&gt;There are at least two open source implementations of SAML&amp;nbsp;1.1:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;em&gt;OpenSAML&lt;/em&gt; &amp;lt;&lt;a href="http://www.opensaml.org/"&gt;http://www.opensaml.org/&lt;/a&gt;&amp;gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;SourceID SAML&amp;nbsp;1.1 Toolkit&lt;/em&gt; &amp;lt;&lt;a href="http://www.sourceid.org/download.do"&gt;http://www.sourceid.org/download.do&lt;/a&gt;&amp;gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;OpenSAML is associated with &lt;a href="http://shibboleth.internet2.edu/"&gt;Shibboleth&lt;/a&gt; while the SourceID tookit has its roots in &lt;a href="http://www.projectliberty.org/"&gt;Project Liberty&lt;/a&gt;.  Both are based on the same standard and should therefore interoperate.&lt;/p&gt;

&lt;h5&gt;&lt;a name="assertions"&gt;SAML&amp;nbsp;1.1 Assertions&lt;/a&gt;&lt;/h5&gt;

&lt;p&gt;SAML &lt;em&gt;assertions&lt;/em&gt; are usually transferred from identity providers to service providers.  Assertions contain &lt;em&gt;statements&lt;/em&gt; that service providers use to make access control decisions.  Three types of statements are provided by SAML:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Authentication statements&lt;/li&gt;
  &lt;li&gt;Attribute statements&lt;/li&gt;
  &lt;li&gt;Authorization decision statements&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Authentication statements&lt;/em&gt; assert to the service provider that the principal did indeed authenticate with the identity provider at a particular time using a particular method of authentication.  Other information about the principal may be disclosed in an authentication statement.  For example, in the authentication statement below, the e-mail address of the principal is disclosed to the service provider:&lt;/p&gt;

&lt;pre style="font-size: 80%"&gt;&amp;lt;saml:Assertion
  xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
  MajorVersion="1" MinorVersion="1"
  AssertionID="..."
  Issuer="https://idp.org/saml/"
  IssueInstant="2002-06-19T17:05:37.795Z"&amp;gt;
  &amp;lt;saml:Conditions 
    NotBefore="2002-06-19T17:00:37.795Z"
    NotOnOrAfter="2002-06-19T17:10:37.795Z"/&amp;gt;
  &amp;lt;saml:AuthenticationStatement
    AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:password"
    AuthenticationInstant="2002-06-19T17:05:17.706Z"&amp;gt;
    &amp;lt;saml:Subject&amp;gt;
      &amp;lt;saml:NameIdentifier
        &lt;span style="font-size: 90%"&gt;Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"&lt;/span&gt;&amp;gt;
        &lt;strong&gt;user@mail.idp.org&lt;/strong&gt;
      &amp;lt;/saml:NameIdentifier&amp;gt;
      &amp;lt;saml:SubjectConfirmation&amp;gt;
        &amp;lt;saml:ConfirmationMethod&amp;gt;
          urn:oasis:names:tc:SAML:1.0:cm:artifact
        &amp;lt;/saml:ConfirmationMethod&amp;gt;
      &amp;lt;/saml:SubjectConfirmation&amp;gt;
    &amp;lt;/saml:Subject&amp;gt;
  &amp;lt;/saml:AuthenticationStatement&amp;gt;
&amp;lt;/saml:Assertion&amp;gt;&lt;/pre&gt;

&lt;p&gt;An e-mail address (as in the above example) will suffice in a large number of situations.  In some cases, however, additional information is needed before a service provider can make an access control decision.  As an example, suppose that students are allowed to access scholarships data.  An &lt;em&gt;attribute statement&lt;/em&gt; can indicate whether or not the principal has an affiliation of "student", which the service provider uses to allow or deny access (resp.) to the scholarships application:&lt;/p&gt;

&lt;pre style="font-size: 80%"&gt;&amp;lt;saml:assertion 
  xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
  MajorVersion="1" MinorVersion="1"
  Issuer="https://idp.edu/saml/" ...&amp;gt;
  &amp;lt;saml:Conditions NotBefore="..." NotAfter="..."/&amp;gt;
  &amp;lt;saml:AuthenticationStatement
    AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:X509-PKI"
    AuthenticationInstant="..."&amp;gt;
    &amp;lt;saml:Subject&amp;gt;...&amp;lt;/saml:Subject&amp;gt;
  &amp;lt;/saml:AuthenticationStatement&amp;gt;
  &amp;lt;saml:AttributeStatement&amp;gt;
    &amp;lt;saml:Subject&amp;gt;...&amp;lt;/saml:Subject&amp;gt;
    &amp;lt;saml:Attribute 
      &lt;span style="font-size: 90%"&gt;AttributeName="urn:mace:dir:attribute-def:eduPersonScopedAffiliation"&lt;/span&gt;
      &lt;span style="font-size: 90%"&gt;AttributeNamespace="urn:mace:shibboleth:1.0:attributeNamespace:uri"&lt;/span&gt;&amp;gt;
      &amp;lt;saml:AttributeValue Scope="idp.edu"&amp;gt;
        member
      &amp;lt;/saml:AttributeValue&amp;gt;
      &amp;lt;saml:AttributeValue Scope="idp.edu"&amp;gt;
        student
      &amp;lt;/saml:AttributeValue&amp;gt;
    &amp;lt;/saml:Attribute&amp;gt;
  &amp;lt;/saml:AttributeStatement&amp;gt;
&amp;lt;/saml:Assertion&amp;gt;&lt;/pre&gt;

&lt;p&gt;Attributes are often obtained from an LDAP directory, so consistent representations of attributes across security domains is crucial.  We will revisit this question in the thread on &lt;em&gt;Federations&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In the above example showing how a student might obtain access to a scholarships application, the service provider is functioning as both a &lt;em&gt;policy enforcement point&lt;/em&gt; and a &lt;em&gt;policy decision point&lt;/em&gt;.  In some situations, it may be preferrable to associate the policy decision point with the identity provider.  In this case, the service provider passes a URI to the identity provider who asserts an &lt;em&gt;authorization decision statement&lt;/em&gt; that dictates whether or not the principal should be allowed access to the secured resource at the given URI.&lt;/p&gt;

&lt;pre style="font-size: 80%"&gt;&amp;lt;saml:assertion 
  xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
  MajorVersion="1" MinorVersion="1"
  Issuer="https://idp.org/saml/" ...&amp;gt;
  &amp;lt;saml:Conditions .../&amp;gt;
  &amp;lt;saml:AuthorizationDecisionStatement
    Decision="Permit"
    Resource="https://sp.org/confidential_report.html"&amp;gt;
    &amp;lt;saml:Action&amp;gt;read&amp;lt;/saml:Action&amp;gt;
    &amp;lt;saml:Subject&amp;gt;...&amp;lt;/saml:Subject&amp;gt;
  &amp;lt;/saml:AuthorizationDecisionStatement&amp;gt;
&amp;lt;/saml:Assertion&amp;gt;&lt;/pre&gt;

&lt;p&gt;The three statement types are not mutually exclusive.  For example, both authentication statements and attribute statements may be included in a single assertion (as shown above).  This precludes the need to make subsequent round trips between the service provider and identity provider.&lt;/p&gt;

&lt;h5&gt;&lt;a name="protocol"&gt;SAML&amp;nbsp;1.1 Protocol&lt;/a&gt;&lt;/h5&gt;

&lt;p&gt;The SAML &lt;em&gt;protocol&lt;/em&gt; is a simple request-response protocol.  A SAML requester sends a SAML &lt;code&gt;Request&lt;/code&gt; element to a responder:&lt;/p&gt;

&lt;pre style="font-size: 80%"&gt;&amp;lt;samlp:Request 
  xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" 
  MajorVersion="1" MinorVersion="1" 
  RequestID="..." 
  IssueInstant="..."&amp;gt;
  &amp;lt;!-- insert other SAML elements here --&amp;gt;
&amp;lt;/samlp:Request&amp;gt;&lt;/pre&gt;

&lt;p&gt;Similarly, a SAML responder returns a SAML &lt;code&gt;Response&lt;/code&gt; element to the requester:&lt;/p&gt;

&lt;pre style="font-size: 80%"&gt;&amp;lt;samlp:Response
  xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol"
  MajorVersion="1" MinorVersion="1"
  ResponseID="..."
  InResponseTo="..."
  IssueInstant="..."&amp;gt;
  &amp;lt;!-- insert other SAML elements here, including assertions --&amp;gt;
&amp;lt;/samlp:Response&amp;gt;&lt;/pre&gt;

&lt;p&gt;The bindings and profiles needed to affect this message exchange are detailed in the following sections.&lt;/p&gt;

&lt;h5&gt;&lt;a name="bindings"&gt;SAML&amp;nbsp;1.1 Bindings&lt;/a&gt;&lt;/h5&gt;

&lt;p&gt;SAML&amp;nbsp;1.1 defines just one &lt;em&gt;binding&lt;/em&gt;, the SAML SOAP binding.  A compatible SAML&amp;nbsp;1.1 implementation &lt;em&gt;must&lt;/em&gt; implement SAML over SOAP over HTTP (a synchronous protocol).  Other transport mechanisms are permitted provided the protocol-independent aspects of the SAML SOAP binding are observed (see section&amp;nbsp;3.1.2 of [&lt;a href="http://www.oasis-open.org/committees/download.php/3405/oasis-sstc-saml-bindings-1.1.pdf"&gt;SAMLBind&lt;/a&gt;]).&lt;/p&gt;

&lt;p&gt;The SAML&amp;nbsp;1.1 SOAP binding is built on top of &lt;a href="http://trscavo.blogspot.com/2004/10/soap.html"&gt;SOAP&amp;nbsp;1.1&lt;/a&gt; (the numbering is purely coincidental).  A SAML requester wraps a SAML &lt;code&gt;Request&lt;/code&gt; element within the body of a SOAP message.  Similarly, a SAML responder returns a SAML &lt;code&gt;Response&lt;/code&gt; element within the body of a returned SOAP message.  If there is an error, the responder returns a SOAP fault code instead.&lt;/p&gt;

&lt;p&gt;Any SAML markup must be included in the SOAP body.  SAML&amp;nbsp;1.1 does not define any SAML-specific SOAP headers.  A requester is free to insert any SOAP headers it wishes (although none are required).&lt;/p&gt;

&lt;p&gt;Recall that in SOAP&amp;nbsp;1.1, a &lt;code&gt;SOAPAction&lt;/code&gt; HTTP header must be included with each HTTP request (although its value may be empty).  A SAML requester may give the following value to the &lt;code&gt;SOAPAction&lt;/code&gt; header:&lt;/p&gt;

&lt;pre style="font-size: 80%"&gt;SOAPAction: http://www.oasis-open.org/committees/security&lt;/pre&gt;

&lt;p&gt;A SAML responder must not depend on this value, however.&lt;/p&gt;

&lt;p&gt;A secure connection is not required for SAML requests and responses, but in those situations where message &lt;em&gt;integrity&lt;/em&gt; and &lt;em&gt;confidentiality&lt;/em&gt; are required, HTTP over SSL&amp;nbsp;3.0 or TLS&amp;nbsp;1.0 with a server-side certificate is required.&lt;/p&gt;

&lt;p&gt;A SAML responder may return a "403 Forbidden" response when it refuses to respond to a SAML requester.  A responder must return a "500 Internal Server Error" response in the event of a SOAP error (a SOAP fault element must be included as well).  Otherwise, a "200 OK" response is returned, even in the presence of a SAML processing error.  Such a response will include a SAML &lt;code&gt;Status&lt;/code&gt; element in the SOAP body.&lt;/p&gt;

&lt;h5&gt;&lt;a name="profiles"&gt;SAML&amp;nbsp;1.1 Profiles&lt;/a&gt;&lt;/h5&gt;

&lt;p&gt;[&amp;nbsp;&lt;a href="#artifact"&gt;Browser/Artifact&amp;nbsp;Profile&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="#post"&gt;Browser/POST&amp;nbsp;Profile&lt;/a&gt;&amp;nbsp;]&lt;/p&gt;

&lt;p&gt;In general, &lt;em&gt;profiles&lt;/em&gt; describe the HTTP exchanges required to ultimately transfer assertions from an identity provider to a service provider.  SAML&amp;nbsp;1.1 specifies two browser-based, single sign-on profiles:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Browser/Artifact Profile&lt;/li&gt;
  &lt;li&gt;Browser/POST Profile&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These profiles support cross-domain single sign-on (SSO).  The specification does not define any additional profiles.  In particular, SAML&amp;nbsp;1.1 does not support a profile to secure a web service message nor does it support a single logout profile.&lt;/p&gt;

&lt;p&gt;Both SAML&amp;nbsp;1.1 profiles begin at the &lt;em&gt;inter-site transfer service&lt;/em&gt;, which is managed by the identity provider.  How the principal arrives at the transfer service in the first place is not dictated by the specification.  See sections&amp;nbsp;4.1 and 4.2 of [&lt;a href="http://www.oasis-open.org/committees/download.php/6837/sstc-saml-tech-overview-1.1-cd.pdf"&gt;SAMLOverview&lt;/a&gt;] for possible scenarios.  In practice, a client accessing a secured resource at a service provider will be redirected to the inter-site transfer service at the identity provider.  Note, however, that the precise sequence of steps needed to accomplish this is not outlined by SAML&amp;nbsp;1.1.  (See section&amp;nbsp;4.3 of [&lt;a href="http://www.oasis-open.org/committees/download.php/6837/sstc-saml-tech-overview-1.1-cd.pdf"&gt;SAMLOverview&lt;/a&gt;] for some rough ideas along these lines.)  This issue is thoroughly addressed in SAML&amp;nbsp;2.0.&lt;/p&gt;

&lt;p&gt;After visiting the inter-site transfer service, the principal is transferred to the &lt;em&gt;assertion consumer service&lt;/em&gt; at the service provider.  Exactly how the principal is transferred from the inter-site transfer service to the assertion consumer service depends on the profile used.  In the case of the Browser/Artifact Profile, a redirect is used; in the case of the Browser/POST Profile, the client issues a POST request (with or without user intervention).&lt;/p&gt;

&lt;p&gt;To expedite processing by the assertion consumer service, two separate URLs are specified:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Artifact Receiver URL (Browser/Artifact Profile)&lt;/li&gt;
  &lt;li&gt;Assertion Consumer URL (Browser/POST Profile)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These and other URLs may be recorded in a SAML metadata archive.&lt;/p&gt;

&lt;p&gt;Note that a conforming SAML&amp;nbsp;1.1 identity provider &lt;em&gt;must&lt;/em&gt; provide an inter-site transfer service.  Similarly, a SAML&amp;nbsp;1.1 service provider &lt;em&gt;must&lt;/em&gt; provide an assertion consumer service.&lt;/p&gt;

&lt;h6&gt;&lt;a name="artifact"&gt;SAML&amp;nbsp;1.1 Browser/Artifact Profile&lt;/a&gt;&lt;/h6&gt;

&lt;p&gt;The Browser/Artifact Profile employs a "pull" mechanism.  The profile essentially passes an &lt;em&gt;SSO assertion&lt;/em&gt; from the identity provider to the service provider &lt;em&gt;by reference&lt;/em&gt;, which is subsequently dereferenced via a back-channel exchange (i.e., the service provider "pulls" the assertion from the identity provider).&lt;/p&gt;

&lt;p&gt;The SAML&amp;nbsp;1.1 Browser/Artifact Profile specifies the following six (6) steps (the terminology used in the original document has been modified slightly to conform to the emerging SAML&amp;nbsp;2.0 specification):&lt;/p&gt;

&lt;ol&gt;

  &lt;li&gt;&lt;p&gt;Request the Inter-site Transfer Service&lt;/p&gt;
  &lt;p&gt;The principal (user) requests the inter-site transfer service at the identity provider:&lt;/p&gt;

  &lt;pre style="font-size: 80%"&gt;https://idp.org/saml/TransferService?TARGET=&lt;em&gt;target&lt;/em&gt;&lt;/pre&gt;

  &lt;p&gt;where &lt;code&gt;&lt;em&gt;target&lt;/em&gt;&lt;/code&gt; is the location of the desired resource at the service provider, say, &lt;code&gt;https://www.sp.org/home&lt;/code&gt;.  In other words, the following GET request is issued by the client:&lt;/p&gt;

  &lt;pre style="font-size: 80%"&gt;GET /saml/TransferService?TARGET=&lt;em&gt;target&lt;/em&gt; HTTP/1.1
Host: idp.org&lt;/pre&gt;

  &lt;p&gt;The profile does not specify how the URL to the transfer service (with &lt;code&gt;target&lt;/code&gt; parameter) is obtained by the client.&lt;/p&gt;&lt;/li&gt;

  &lt;li&gt;&lt;p&gt;Redirect to the Assertion Consumer Service&lt;/p&gt;

  &lt;p&gt;The principal is redirected to the assertion consumer service at the service provider; that is, the following response is returned to the client:&lt;/p&gt;

  &lt;pre style="font-size: 60%"&gt;HTTP/1.1 302 Found
Location: https://sp.org/saml/ACS/Artifact?TARGET=&lt;em&gt;target&lt;/em&gt;&amp;SAMLart=&lt;em&gt;artifact&lt;/em&gt;&lt;/pre&gt;

  &lt;p&gt;where &lt;code&gt;&lt;em&gt;artifact&lt;/em&gt;&lt;/code&gt; is a reference to an assertion the identity provider is willing to provide upon request.  &lt;strong&gt;Important:&lt;/strong&gt; It is assumed that the principal has already established a security context at the identity provider, otherwise the identity provider would not be able to subsequently assert the authenticity of the principal.&lt;/p&gt;&lt;/li&gt;

  &lt;li&gt;&lt;p&gt;Request the Assertion Consumer Service&lt;/p&gt;

  &lt;p&gt;The client requests the assertion consumer service at the service provider:&lt;/p&gt;

  &lt;pre style="font-size: 80%"&gt;https://sp.org/saml/ACS/Artifact?TARGET=&lt;em&gt;target&lt;/em&gt;&amp;SAMLart=&lt;em&gt;artifact&lt;/em&gt;&lt;/pre&gt;

  &lt;p&gt;where &lt;code&gt;&lt;em&gt;target&lt;/em&gt;&lt;/code&gt; and &lt;code&gt;&lt;em&gt;artifact&lt;/em&gt;&lt;/code&gt; are as before.  In other words, the following GET request is issued by the client:&lt;/p&gt;

  &lt;pre style="font-size: 80%"&gt;GET /saml/ACS/Artifact?TARGET=&lt;em&gt;target&lt;/em&gt;&amp;SAMLart=&lt;em&gt;artifact&lt;/em&gt; HTTP/1.1
Host: sp.org&lt;/pre&gt;&lt;/li&gt;

  &lt;li&gt;&lt;p&gt;Request the Artifact Resolution Service&lt;/p&gt;

  &lt;p&gt;The assertion consumer service at the service provider begins a back-channel exchange with the &lt;em&gt;artifact resolution service&lt;/em&gt; at the identity provider.  The following SAML SOAP message is bound to an HTTP POST request:&lt;/p&gt;

  &lt;pre style="font-size: 80%"&gt;POST /saml/ArtifactResolutionService HTTP/1.1
Host: idp.org
Content-Type: text/xml
Content-Length: nnn
SOAPAction: http://www.oasis-open.org/committees/security

&amp;lt;?xml version="1.0"?&amp;gt;
&amp;lt;SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"&amp;gt;
  &amp;lt;SOAP-ENV:Header/&amp;gt;
  &amp;lt;SOAP-ENV:Body&amp;gt;
    &amp;lt;samlp:Request 
      xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" 
      MajorVersion="1" MinorVersion="1" 
      RequestID="_192.168.16.51.1024506224022" 
      IssueInstant="2002-06-19T17:03:44.022Z"&amp;gt;
      &amp;lt;samlp:AssertionArtifact&amp;gt;
        &lt;strong&gt;&lt;em&gt;artifact&lt;/em&gt;&lt;/strong&gt;
      &amp;lt;/samlp:AssertionArtifact&amp;gt;
    &amp;lt;/samlp:Request&amp;gt;
  &amp;lt;/SOAP-ENV:Body&amp;gt;
&amp;lt;/SOAP-ENV:Envelope&amp;gt;&lt;/pre&gt;

  &lt;p&gt;where &lt;code&gt;&lt;em&gt;artifact&lt;/em&gt;&lt;/code&gt; was previously sent from the identity provider to the service provider in steps&amp;nbsp;2 and 3.&lt;/p&gt;&lt;/li&gt;

  &lt;li&gt;&lt;p&gt;Respond with a SAML Assertion&lt;/p&gt;

  &lt;p&gt;The artifact resolution service at the identity provider completes the back-channel exchange by responding with a SAML assertion:&lt;/p&gt;

  &lt;pre style="font-size: 80%"&gt;HTTP/1.1 200 OK
Content-Type: text/xml
Content-Length: nnnn

&amp;lt;?xml version="1.0"?&amp;gt;
&amp;lt;SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"&amp;gt;
  &amp;lt;SOAP-ENV:Header/&amp;gt;
  &amp;lt;SOAP-ENV:Body&amp;gt;
    &amp;lt;samlp:Response
      xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol"
      MajorVersion="1" MinorVersion="1"
      ResponseID="_P1YaA+Q/wSM/t/8E3R8rNhcpPTM="
      InResponseTo="_192.168.16.51.1024506224022"
      IssueInstant="2002-06-19T17:05:37.795Z"&amp;gt;
      &amp;lt;samlp:Status&amp;gt;
        &amp;lt;samlp:StatusCode Value="samlp:Success"/&amp;gt;
      &amp;lt;/samlp:Status&amp;gt;
      &lt;strong&gt;&amp;lt;!-- insert Assertion element here --&amp;gt;&lt;/strong&gt;
    &amp;lt;/samlp:Response&amp;gt;
  &amp;lt;/SOAP-ENV:Body&amp;gt;
&amp;lt;/SOAP-ENV:Envelope&amp;gt;&lt;/pre&gt;

  &lt;p&gt;where the &lt;code&gt;Assertion&lt;/code&gt; element was discussed earlier.&lt;/p&gt;&lt;/li&gt;

  &lt;li&gt;&lt;p&gt;Respond to the Principal's Original Request&lt;/p&gt;

  &lt;p&gt;The assertion consumer service inspects the SAML &lt;code&gt;Response&lt;/code&gt; element returned by the artifact resolution service, creates a security context at the service provider and redirects the client to the target resource.&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;

&lt;h6&gt;&lt;a name="post"&gt;SAML&amp;nbsp;1.1 Browser/POST Profile&lt;/a&gt;&lt;/h6&gt;

&lt;p&gt;The Browser/POST Profile relies on a "push" operation.  In contrast to the Browser/Artifact Profile, the Browser/POST Profile passes an SSO assertion &lt;em&gt;by value&lt;/em&gt;.  No back-channel communication is needed in this case.  In effect, the identity provider "pushes" the assertion to the service provider.&lt;/p&gt;

&lt;p&gt;The SAML&amp;nbsp;1.1 Browser/POST Profile specifies the following four (4) steps (the terminology used in the original document has been modified slightly to conform to the emerging SAML&amp;nbsp;2.0 specification):&lt;/p&gt;

&lt;ol&gt;

  &lt;li&gt;&lt;p&gt;Request the Inter-Site Transfer Service&lt;/p&gt;

  &lt;p&gt;The principal (user) requests the inter-site transfer service at the identity provider:&lt;/p&gt;

  &lt;pre style="font-size: 80%"&gt;https://idp.org/saml/TransferService?TARGET=&lt;em&gt;target&lt;/em&gt;&lt;/pre&gt;

  &lt;p&gt;where &lt;code&gt;&lt;em&gt;target&lt;/em&gt;&lt;/code&gt; is the desired resource at the service provider, say, &lt;code&gt;https://www.sp.org/home&lt;/code&gt;.  In other words, the following GET request is issued by the client:&lt;/p&gt;

  &lt;pre style="font-size: 80%"&gt;GET /saml/TransferService?TARGET=&lt;em&gt;target&lt;/em&gt; HTTP/1.1
Host: idp.org&lt;/pre&gt;

  &lt;p&gt;The profile does not specify how the URL to the transfer service (with &lt;code&gt;target&lt;/code&gt; parameter) is obtained by the client.&lt;/p&gt;&lt;/li&gt;

  &lt;li&gt;&lt;p&gt;Respond with an HTML Form&lt;/p&gt;

  &lt;p&gt;The inter-site transfer service returns an HTML document containing a FORM element whose ACTION attribute is the URL of the assertion consumer service:&lt;/p&gt;

  &lt;pre style="font-size: 80%"&gt;HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: nnnn

...
&amp;lt;form method="post" 
      action="https://sp.org/saml/ACS/post" ...&amp;gt;
  &amp;lt;input type="hidden" name="TARGET" value="&lt;em&gt;target&lt;/em&gt;"&amp;gt;
  &amp;lt;input type="hidden" name="SAMLResponse" value="&lt;em&gt;response&lt;/em&gt;"&amp;gt;
  ...
  &amp;lt;input type="submit" value="Submit"&amp;gt;
&amp;lt;/form&amp;gt;
...&lt;/pre&gt;

  &lt;p&gt;where the value of the &lt;code&gt;TARGET&lt;/code&gt; parameter has been preserved from step&amp;nbsp;1.  The value of the &lt;code&gt;SAMLResponse&lt;/code&gt; parameter is the base64 encoding of a SAML &lt;code&gt;Response&lt;/code&gt; element, more-or-less the same SAML &lt;code&gt;Response&lt;/code&gt; element returned by the identity provider in step&amp;nbsp;5 of the Browser/Artifact Profile.  In the case of the Browser/Artifact Profile, however, the SAML &lt;code&gt;Response&lt;/code&gt; must be digitally signed by the identity provider.&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; It is assumed that the principal has already established a security context at the identity provider, otherwise the inter-site transfer service would not be able to provide an authentication statement in the SAML &lt;code&gt;Response&lt;/code&gt; element.&lt;/p&gt;&lt;/li&gt;

  &lt;li&gt;&lt;p&gt;Request the Assertion Consumer Service&lt;/p&gt;

  &lt;p&gt;The client requests the assertion consumer service at the service provider:&lt;/p&gt;

  &lt;pre style="font-size: 80%"&gt;POST /saml/ACS/post HTTP/1.1
Host: sp.org
Content-Type: application/x-www-form-urlencoded
Content-Length: nnnn

TARGET=&lt;em&gt;target&lt;/em&gt;&amp;amp;SAMLResponse=&lt;em&gt;response&lt;/em&gt;&lt;/pre&gt;

  &lt;p&gt;To automate the submission of the form, the following line of JavaScript may appear anywhere on the page:&lt;/p&gt;

  &lt;pre style="font-size: 80%"&gt;window.onload = function () { document.forms[0].submit(); }&lt;/pre&gt;

  &lt;p&gt;This assumes of course that the page contains a single FORM element.&lt;/p&gt;&lt;/li&gt;

  &lt;li&gt;&lt;p&gt;Respond to the Principal's Original Request&lt;/p&gt;

  &lt;p&gt;The assertion consumer service inspects the SAML &lt;code&gt;Response&lt;/code&gt; element, creates a security context on the service provider and redirects the client to the target resource.&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7514525-109758942916160225?l=trscavo.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/109758942916160225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/109758942916160225'/><link rel='alternate' type='text/html' href='http://trscavo.blogspot.com/2004/10/saml1.html' title='SAML1'/><author><name>Tom Scavo</name><uri>http://www.blogger.com/profile/07476406033382071801</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01418569831996406907'/></author></entry><entry><id>tag:blogger.com,1999:blog-7514525.post-109727153745872568</id><published>2004-10-08T15:44:00.000-04:00</published><updated>2004-12-14T10:33:17.453-05:00</updated><title type='text'>SOAP</title><content type='html'>&lt;p&gt;&lt;em&gt;SOAP&lt;/em&gt; is an XML technology for sending and receiving messages across the Internet.  More often than not, SAML assertions are bound to SOAP messages, so a basic understanding of SOAP is essential for &lt;a href="http://trscavo.blogspot.com/2004/10/federated-identity-management.html"&gt;federated identity management&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;SOAP is not necessarily bound to HTTP, but HTTP is the only substrate we consider here.  In other words, for the purposes of this discussion, SOAP runs on top of HTTP, and SAML is wrapped inside of SOAP.  We often use the phrase "SAML over SOAP over HTTP" when discussing these related technologies.&lt;/p&gt;

&lt;p&gt;Originally, SOAP was an acronym for "Simple Object Access Protocol", but this turned out to be a misnomer since SOAP has nothing to do with "object access" in the object-oriented programming sense of the phrase.  So today we no longer think of "SOAP" as an acronym although the capitalization persists.&lt;/p&gt;

&lt;p&gt;SOAP&amp;nbsp;1.1 is based on &lt;a href="http://www.w3.org/TR/2000/NOTE-SOAP-20000508/"&gt;a note sent to the W3C&lt;/a&gt; (from Microsoft, IBM and others) in May 2002.  This note did not become a formal W3C recommendation but SOAP&amp;nbsp;1.1 remains a de facto SOAP standard nonetheless.  For example, all versions of SAML rely on SOAP&amp;nbsp;1.1.&lt;/p&gt;

&lt;p&gt;Subsequently, the W3C began work on SOAP&amp;nbsp;1.2, which culminated in a comprehensive set of recommendations published in June 2003.  See the W3C page &lt;a href="http://www.w3.org/2000/xp/Group/"&gt;XML Protocol Working Group&lt;/a&gt; for links to these documents and other SOAP-related activity.  The document &lt;a href="http://www.w3.org/TR/2003/REC-soap12-part0-20030624/"&gt;&lt;em&gt;SOAP Version&amp;nbsp;1.2 Part&amp;nbsp;0: Primer&lt;/em&gt;&lt;/a&gt; is particularly useful for a basic understanding of SOAP messaging.&lt;/p&gt;

&lt;p&gt;A SOAP message consists of a so-called &lt;em&gt;SOAP envelope&lt;/em&gt; inside an HTTP wrapper.  Like HTTP, a soap envelope consists of two parts, a &lt;em&gt;header&lt;/em&gt; and a &lt;em&gt;body&lt;/em&gt;.  Of these, only the SOAP body is required.  As we will see, all parts of a SOAP message are XML-encoded (although SOAP&amp;nbsp;1.2 permits MIME attachments to SOAP messages, much like SMTP).&lt;/p&gt;

&lt;p&gt;A SOAP&amp;nbsp;1.1 message inside an HTTP POST request might look like this:&lt;/p&gt;

&lt;pre style="font-size: 80%"&gt;POST /trscavo/servlet/HttpEchoServlet HTTP/1.1
Host: voyager.cs.bgsu.edu:8080
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction:

&amp;lt;?xml version="1.0"&amp;gt;
&amp;lt;SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"&amp;gt;
  &amp;lt;SOAP-ENV:Header&amp;gt;...&amp;lt;/SOAP-ENV:Header&amp;gt;
  &amp;lt;SOAP-ENV:Body&amp;gt;...&amp;lt;/SOAP-ENV:Body&amp;gt;
&amp;lt;/SOAP-ENV:Envelope&amp;gt;&lt;/pre&gt;

&lt;p&gt;Note that in SOAP&amp;nbsp;1.1, messages are bound to POST requests only.  Also, since the &lt;code&gt;SOAPAction&lt;/code&gt; header has been removed in SOAP&amp;nbsp;1.2, we will not discuss it further.&lt;/p&gt;

&lt;p&gt;A similar SOAP&amp;nbsp;1.1 message wrapped inside an HTTP response would be:&lt;/p&gt;

&lt;pre style="font-size: 80%"&gt;HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn

&amp;lt;?xml version="1.0"&amp;gt;
&amp;lt;SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"&amp;gt;
  &amp;lt;SOAP-ENV:Header&amp;gt;...&amp;lt;/SOAP-ENV:Header&amp;gt;
  &amp;lt;SOAP-ENV:Body&amp;gt;...&amp;lt;/SOAP-ENV:Body&amp;gt;
&amp;lt;/SOAP-ENV:Envelope&amp;gt;&lt;/pre&gt;

&lt;p&gt;Some changes to the SOAP message structure were made in version&amp;nbsp;1.2.  First of all, SOAP&amp;nbsp;1.2 messages may be bound to either GET or POST requests.  An example of the latter is the following:&lt;/p&gt;

&lt;pre style="font-size: 80%"&gt;POST /trscavo/servlet/HttpEchoServlet HTTP/1.1
Host: voyager.cs.bgsu.edu:8080
Content-Type: application/soap+xml; charset="utf-8"
Content-Length: nnnn

&amp;lt;?xml version="1.0"&amp;gt;
&amp;lt;env:Envelope 
  xmlns:env="http://www.w3.org/2003/05/soap-envelope"&amp;gt;
  &amp;lt;env:Header&amp;gt;...&amp;lt;/env:Header&amp;gt;
  &amp;lt;env:Body&amp;gt;...&amp;lt;/env:Body&amp;gt;
&amp;lt;/env:Envelope&amp;gt;&lt;/pre&gt;

&lt;p&gt;Observe the differences between SOAP&amp;nbsp;1.1 and 1.2 (when bound to HTTP POST requests):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The &lt;code&gt;SOAPAction&lt;/code&gt; header has been removed, which is generally true in SOAP&amp;nbsp;1.2.&lt;/li&gt;
  &lt;li&gt;A new content type called &lt;code&gt;application/soap+xml&lt;/code&gt; has been declared, a content type specifically defined for use with SOAP&amp;nbsp;1.2.&lt;/li&gt;
  &lt;li&gt;An XML declaration has been added to the request body.&lt;/li&gt;
  &lt;li&gt;The SOAP namespace URI has changed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A SOAP&amp;nbsp;1.2 message bound to an HTTP response is formulated much like before:&lt;/p&gt;

&lt;pre style="font-size: 80%"&gt;HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset="utf-8"
Content-Length: nnnn

&amp;lt;?xml version="1.0"&amp;gt;
&amp;lt;env:Envelope 
  xmlns:env="http://www.w3.org/2003/05/soap-envelope"&amp;gt;
  &amp;lt;env:Header&amp;gt;...&amp;lt;/env:Header&amp;gt;
  &amp;lt;env:Body&amp;gt;...&amp;lt;/env:Body&amp;gt;
&amp;lt;/env:Envelope&amp;gt;&lt;/pre&gt;

&lt;p&gt;The primary differences are the content type and namespace URI as mentioned above.&lt;/p&gt;

&lt;p&gt;A popular open source SOAP processor is called &lt;a href="http://ws.apache.org/axis/"&gt;&lt;em&gt;Axis&lt;/em&gt;&lt;/a&gt; from the Apache project.  The current production release of Axis (v1.1) fully supports SOAP&amp;nbsp;1.1 and partially implements SOAP&amp;nbsp;1.2.  Version&amp;nbsp;1.2 of Axis, which is at "release candidate" stage at the time of this writing, is said to be fully compatible with SOAP&amp;nbsp;1.2.&lt;/p&gt;

&lt;p&gt;SOAP can be used for synchronous or asynchronous messaging.  &lt;em&gt;Synchronous messaging&lt;/em&gt;, where the sender blocks until a reply is received, is simplest.  Fortunately, SAML SOAP bindings are synchronous, which we consider in detail in the next thread.&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7514525-109727153745872568?l=trscavo.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/109727153745872568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/109727153745872568'/><link rel='alternate' type='text/html' href='http://trscavo.blogspot.com/2004/10/soap.html' title='SOAP'/><author><name>Tom Scavo</name><uri>http://www.blogger.com/profile/07476406033382071801</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01418569831996406907'/></author></entry><entry><id>tag:blogger.com,1999:blog-7514525.post-109726308852265851</id><published>2004-10-08T14:22:00.000-04:00</published><updated>2005-02-08T11:05:44.863-05:00</updated><title type='text'>Federated Identity Management</title><content type='html'>&lt;p&gt;&lt;em&gt;Identity Management&lt;/em&gt; includes the process and infrastructure associated with the creation, maintenance, and use of digital identities. The Burton Group defines &lt;em&gt;Federated Identity Management&lt;/em&gt; as the&lt;/p&gt;

&lt;blockquote&gt;Use of agreements, standards, and technologies to make identity and entitlements portable across loosely coupled, autonomous identity domains. &amp;lt;&lt;a style="font-size: 60%" href="http://www.cio.gov/eauthentication/documents/BurtonGroupEAreport.pdf"&gt;http://www.cio.gov/eauthentication/documents/BurtonGroupEAreport.pdf&lt;/a&gt;&amp;gt;&lt;/blockquote&gt;

&lt;p&gt;Informally, Federated Identity Management is authentication, authorization, and single sign-on at the inter-enterprise level, that is, at the level of the extranet.  The mantra of federated identity management solutions is:&lt;/p&gt;

&lt;blockquote&gt;Authenticate locally, authorize globally.&lt;/blockquote&gt;

&lt;p&gt;In a typical federated scenario, a &lt;em&gt;principal&lt;/em&gt; (user) is enrolled with a small number of &lt;em&gt;identity providers&lt;/em&gt;.  Any number of &lt;em&gt;service providers&lt;/em&gt; may authorize access to their respective web resources on the basis of &lt;em&gt;SAML assertions&lt;/em&gt; obtained from the principal's identity provider(s).  These assertions never contain credentials and need not even reveal the identity of the principal; that is, privacy is a primary concern of federated systems.&lt;/p&gt;

&lt;p&gt;SAML, Shibboleth, and Liberty Alliance are important technologies within the &lt;em&gt;identity management&lt;/em&gt; (IdM) problem space:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;SAML &amp;lt;&lt;a href="http://www.oasis-open.org/committees/security/"&gt;http://www.oasis-open.org/committees/security/&lt;/a&gt;&amp;gt;&lt;/li&gt;
  &lt;li&gt;Shibboleth &amp;lt;&lt;a href="http://shibboleth.internet2.edu/"&gt;http://shibboleth.internet2.edu/&lt;/a&gt;&amp;gt;&lt;/li&gt;
  &lt;li&gt;Liberty Alliance &amp;lt;&lt;a href="http://www.projectliberty.org/"&gt;http://www.projectliberty.org/&lt;/a&gt;&amp;gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most, if not all federated IdM solutions are based on &lt;em&gt;Security Assertion Markup Language&lt;/em&gt; (SAML).  For example, the current versions of Shibboleth and Liberty are based on SAML&amp;nbsp;1.1.  Note that SAML is more than a markup language.  It consists of &lt;em&gt;protocols&lt;/em&gt;, &lt;em&gt;bindings&lt;/em&gt; and &lt;em&gt;profiles&lt;/em&gt;, in addition to the standard XML markup used for assertions.&lt;/p&gt;

&lt;p&gt;Diverse IdM standards are converging upon SAML&amp;nbsp;2.0, recently released for public comment by OASIS.  SAML&amp;nbsp;2.0 builds on previous work, especially Liberty.  Future versions of Shibboleth and Liberty will no doubt be compatible with SAML&amp;nbsp;2.0.&lt;/p&gt;

&lt;p&gt;An important related development within the federal government is the &lt;em&gt;E-Authentication Initiative&lt;/em&gt;, which focuses on SAML&amp;nbsp;1.0:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;E-Authentication &amp;lt;&lt;a href="http://www.cio.gov/eauthentication/"&gt;http://www.cio.gov/eauthentication/&lt;/a&gt;&amp;gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of particular interest is the &lt;em&gt;E-Authentication Interoperability Lab&lt;/em&gt;, which certifies the compatibility of vendor systems.&lt;/p&gt;

&lt;p&gt;It is apparent that the technology is converging (SAML&amp;nbsp;2.0) and quickly becoming a commodity.  The next important step is the development of &lt;em&gt;federations&lt;/em&gt;, sometimes called &lt;em&gt;circles of trust&lt;/em&gt;.  There are a number of production quality federations under development around the world, including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;SWITCH &amp;lt;&lt;a href="http://www.switch.ch/aai/about.html"&gt;http://www.switch.ch/aai/about.html&lt;/a&gt;&amp;gt;&lt;/li&gt;
  &lt;li&gt;InCommon &amp;lt;&lt;a href="http://www.incommonfederation.org/"&gt;http://www.incommonfederation.org/&lt;/a&gt;&amp;gt;&lt;/li&gt;
  &lt;li&gt;FEIDE &amp;lt;&lt;a href="http://www.feide.no/englishwww/doc.html"&gt;http://www.feide.no/englishwww/doc.html&lt;/a&gt;&amp;gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The enterprise question whether or not to federate is a difficult one involving significant legal, administrative, and political issues.&lt;/p&gt;

&lt;p&gt;Subsequent threads will explore the various versions of SAML, Shibboleth and Liberty, and summarize the issues surrounding cross-enterprise federation.&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7514525-109726308852265851?l=trscavo.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/109726308852265851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/109726308852265851'/><link rel='alternate' type='text/html' href='http://trscavo.blogspot.com/2004/10/federated-identity-management.html' title='Federated Identity Management'/><author><name>Tom Scavo</name><uri>http://www.blogger.com/profile/07476406033382071801</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01418569831996406907'/></author></entry><entry><id>tag:blogger.com,1999:blog-7514525.post-109122012290293651</id><published>2004-07-30T16:11:00.000-04:00</published><updated>2004-07-30T17:38:18.656-04:00</updated><title type='text'>Building Blocks Conference Notes</title><content type='html'>&lt;h2&gt;Blackboard Developers Conference&lt;br&gt;Georgetown University, 2004&lt;/h2&gt;

&lt;h2&gt;Monday, July&amp;nbsp;26&lt;/h2&gt;

&lt;h3&gt;09:00&amp;ndash;09:45 a.m.&lt;br&gt;&lt;em&gt;Keynote Session&lt;/em&gt;&lt;br&gt;Matthew Pittinsky&lt;/h3&gt;

&lt;dl&gt;

&lt;dt&gt;Highlights:
&lt;dd&gt;
&lt;ul&gt;
  &lt;li&gt;We are in the midst of a transition from e-learning applications in individual courses to a campus-wide network learning environment involving all members of the institution
  &lt;li&gt;Blackboard is now a public company
  &lt;li&gt;One third of this year's conference attendees attended last year's conference as well
  &lt;li&gt;The Blackboard Developers Network (BbDN) has grown from 115 (2003) to 245 (2004)
  &lt;li&gt;6141 Building Blocks SDK downloads
  &lt;li&gt;7276 Building Blocks (B2) downloads
  &lt;li&gt;Of the 104 Building Blocks in the catalogue, 74 are for the Academic Suite, and 50% are free
  &lt;li&gt;.NET SDK released Feb 2004
  &lt;li&gt;Commitment to standards continues (IMS e-Portfolio, SIF integration)
&lt;/ul&gt;

&lt;dt&gt;Top 10 Building Blocks:
&lt;dd&gt;
&lt;ol style="list-style-type: none"&gt;
  &lt;li&gt;10. User Performance Module (USF)
  &lt;li&gt;9. SCORM 1.2 Compliant Player 1.0
  &lt;li&gt;8. Discussion Grader (JJC)
  &lt;li&gt;7. Dictionary and Thesaurus
  &lt;li&gt;6. User Participation Portal Module (USF)
  &lt;li&gt;5. My Journal (Baylor U)
  &lt;li&gt;4. Blackboard Link Checker
  &lt;li&gt;3. Who's Online Portal Module (Seneca)
  &lt;li&gt;2. Bb Content Player (IMS, SCORM, etc.)
  &lt;li&gt;1. Advanced Group Management (FSU)
&lt;/ol&gt;

&lt;dt&gt;Sneak Peaks:
&lt;dd&gt;
&lt;ul&gt;
&lt;li&gt;Application Pack strategy continues
&lt;li&gt;App Pack 2 due in about a month
&lt;ul&gt;
  &lt;li&gt;Content System SDK
  &lt;li&gt;built-in SCORM support
  &lt;li&gt;internationalization
  &lt;li&gt;ChalkBox
  &lt;ul&gt;
    &lt;li&gt;"chalktitles" offered by Houghton Mifflin, Pearson Education, Thomson Learning
    &lt;li&gt;synchronize rosters, SSO, post to gradebook
  &lt;/ul&gt;
  &lt;li&gt;Continued development of Content System
  &lt;ul&gt;
    &lt;li&gt;v1.2 Q3 2004
    &lt;li&gt;v2.0 Q4 2004
  &lt;/ul&gt;
  &lt;li&gt;Academic Suite 7.0 due Q1 2005
&lt;/ul&gt;
&lt;/ul&gt;

&lt;dt&gt;2003&amp;ndash;2004 Priorities:
&lt;dd&gt;
&lt;ol&gt;
  &lt;li&gt;Increase access to BbDN
  &lt;ul&gt;
    &lt;li&gt;Free accounts to Academic Suite clients (enterprise)
    &lt;li&gt;"Not quite free" accounts to Commerce Suite clients
  &lt;/ul&gt;
  &lt;li&gt;Comply with evolving standards (SAKAI membership sought)
  &lt;li&gt;Improve developer support
  &lt;ul&gt;
    &lt;li&gt;Provide comprehensive test data
    &lt;li&gt;Provide B2 training courses (such as B2 Essentials)
  &lt;/ul&gt;
  &lt;li&gt;Grow market receptivity (e.g., "Blackboard Enabled" program)
  &lt;li&gt;Hire Building Blocks Architect/Evangelist
&lt;/ol&gt;

&lt;/dl&gt;

&lt;h3&gt;09:45&amp;ndash;10:30 a.m.&lt;br /&gt;&lt;em&gt;What is .NET?&lt;/em&gt;&lt;br /&gt;Bruce Jackson&lt;/h3&gt;

&lt;dl&gt;

&lt;dt&gt;Take-Home Lesson:
&lt;dd&gt;.NET is a web application framework modeled after J2EE

&lt;dt&gt;Important Fact Learned:
&lt;dd&gt;CLR runs on Windows only

&lt;dt&gt;Important Fact Learned:
&lt;dd&gt;Passport is going away!

&lt;dt&gt;Notes:
&lt;dd&gt;
&lt;ul&gt;
  &lt;li&gt;Common Language Runtime (CLR) manages .NET "managed code"
  &lt;li&gt;Primary advantage of .NET is code agnosticism
  &lt;li&gt;Source code compiles to "intermediate language" (IL)
  &lt;li&gt;CLR manages memory automatically (like Java)
  &lt;li&gt;IL code is portable across architectures (32b, 64b, etc.)
  &lt;li&gt;.NET is not yet UI independent- .NET addresses security issues (big changes coming!)
  &lt;li&gt;Objects passed by value (not reference), which assumes copius bandwidth
  &lt;li&gt;Service Oriented Architecture (SOA) is emphasized
  &lt;li&gt;WS-Security, a form of "federated trust", is supported
  &lt;li&gt;WS-Security and Liberty Alliance may be merging!
  &lt;li&gt;[Even Liberty Alliance and Shibboleth are talking!]
  &lt;li&gt;Kerberos remains a major player
&lt;/ul&gt;

&lt;/dl&gt;

&lt;h3&gt;10:45&amp;ndash;11:30 a.m.&lt;br&gt;&lt;em&gt;Data Storage and Migration (Java)&lt;/em&gt;&lt;br&gt;Bob Alcorn&lt;/h3&gt;

&lt;dl&gt;

&lt;dt&gt;Take-Home Lesson:
&lt;dd&gt;Data storage possibilities are somewhat limited

&lt;dt&gt;Important Fact Learned:
&lt;dd&gt;Can not write into the Blackboard database!

&lt;dt&gt;Notes:
&lt;dd&gt;
&lt;ul&gt;
  &lt;li&gt;Goals: Portability and structured data
  &lt;li&gt;Types of data:
  &lt;ol&gt;
    &lt;li&gt;private data (config data, e.g.)
    &lt;li&gt;content data
    &lt;li&gt;tool data (discussion tool, e.g.)
    &lt;li&gt;extended attributes
  &lt;/ol&gt;
  &lt;li&gt;Private data stored in properties files in local directories (see blackboard.platform.plugin.PlugInConfig)
  &lt;li&gt;Extended data provided via "registries" (see blackboard.data.registry)
  &lt;li&gt;Content organized by course
  &lt;li&gt;Use @X@object.attribute@X@ template variables (which have a corresponding API)
  &lt;li&gt;Tool storage:
  &lt;ul&gt;
    &lt;li&gt;Properties files (the lowest common denominator)
    &lt;li&gt;XML documents
    &lt;li&gt;3rd party storage (e.g., Berkeley DB, Lucene)
  &lt;/ul&gt;
  &lt;li&gt;Migration from R5 to R6 is one-time operation
  &lt;li&gt;Course Copy is a handy tool
&lt;/ul&gt;

&lt;/dl&gt;

&lt;h3&gt;11:30&amp;ndash;12:15 p.m.&lt;br&gt;&lt;em&gt;My First Building Block (.NET)&lt;/em&gt;&lt;br&gt;Biran Zhang&lt;/h3&gt;

&lt;dl&gt;

&lt;dt&gt;Take-Home Lesson:
&lt;dd&gt;.NET/C# is very similar to J2EE

&lt;dt&gt;Important Fact Learned:
&lt;dd&gt;Visual Studio is required for .NET development

&lt;dt&gt;Notes:
&lt;dd&gt;
&lt;ul&gt;
  &lt;li&gt;A Building Block (B2) is a web application
  &lt;li&gt;See package blackboard.security.authorization for access control
  &lt;li&gt;Possible uses of B2:
  &lt;ul&gt;
    &lt;li&gt;bridge to external system
    &lt;li&gt;publish a web service
    &lt;li&gt;content type
    &lt;li&gt;tools
    &lt;ul&gt;
      &lt;li&gt;student tool
      &lt;li&gt;course tool
      &lt;li&gt;system tool
      &lt;li&gt;communication tool
    &lt;/ul&gt;
    &lt;li&gt;portal module
  &lt;/ul&gt;
  &lt;li&gt;MS .NET framework requires Visual Studio .NET
  &lt;li&gt;File structure is similar to J2EE (/WEB-INF directory, e.g.)
  &lt;li&gt;MS Virtual PC development environment permits standardization
&lt;/ul&gt;

&lt;/dl&gt;

&lt;h3&gt;01:30&amp;ndash;02:15 p.m.&lt;br&gt;&lt;em&gt;.NET APIs in Detail&lt;/em&gt;&lt;br&gt;Biran Zhang&lt;/h3&gt;

&lt;dl&gt;

&lt;dt&gt;Notes:
&lt;dd&gt;
&lt;ul&gt;
  &lt;li&gt;Blackboard .NET namespace is very similar to Java API
  &lt;li&gt;See blackboard.data.announcement, e.g.
  &lt;li&gt;Strongly typed enumerations are useful
&lt;/ul&gt;

&lt;/dl&gt;

&lt;h3&gt;02:15&amp;ndash;03:00 p.m.&lt;br&gt;&lt;em&gt;Java APIs in Detail&lt;/em&gt;&lt;br&gt;Bob Alcorn&lt;/h3&gt;

&lt;dl&gt;

&lt;dt&gt;Take-Home Lesson:
&lt;dd&gt;A comprehensive Buidling Block will touch numerous APIs

&lt;dt&gt;Important Fact Learned:
&lt;dd&gt;Use new reflection-based persistence methods instead of standard persisters and loaders

&lt;dt&gt;Notes:
&lt;dd&gt;
&lt;ul&gt;
  &lt;li&gt;General in-depth introduction to B2 Java APIs
  &lt;li&gt;Base object: blackboard.data.BbObject
  &lt;li&gt;Data objects
  &lt;ul&gt;
    &lt;li&gt;Content: blackboard.data.content
    &lt;li&gt;Course: blackboard.data.course
    &lt;li&gt;Gradebook: blackboard.data.gradebook
  &lt;/ul&gt;
  &lt;li&gt;Persistence objects
  &lt;li&gt;Use new reflection-based persistence methods (e.g., persist)
  &lt;li&gt;The persistance manager is proprietary
  &lt;li&gt;Service lookups via BbServiceManager
  &lt;li&gt;Other services:
  &lt;ul&gt;
    &lt;li&gt;Context: blackboard.platform.context
    &lt;li&gt;Session: blackboard.platform.session
    &lt;li&gt;File System: blackboard.platform.filesystem
    &lt;li&gt;Log: blackboard.platform.log
    &lt;li&gt;Security: blackboard.platform.security
  &lt;/ul&gt;
  &lt;li&gt;Note: Not all clients honor cookies, so sometimes session data is encoded in the URL (URL rewriting)
  &lt;li&gt;Don't use BbList and BbEnum in package blackboard.base (since J2SE 1.5 is coming)
  &lt;li&gt;blackboard.base.FormattedText provides "smart" text handling
  &lt;li&gt;blackboard.base.GenericComparator for sorting
  &lt;li&gt;Portal: blackboard.portal.external
  &lt;li&gt;Tag libraries facilitate UI standardization and integration
  &lt;li&gt;XML manifest file enables deployment
&lt;/ul&gt;

&lt;/dl&gt;

&lt;h3&gt;03:30&amp;ndash;04:15 p.m.&lt;br&gt;&lt;em&gt;Blackboard and Content Types&lt;/em&gt;&lt;br&gt;Tracy Engwirda&lt;/h3&gt;

&lt;dl&gt;
&lt;dt&gt;Notes:
&lt;dd&gt;
&lt;ul&gt;
  &lt;li&gt;Updated JSPs can be dropped into place without restarting the server
  &lt;li&gt;Enable the /webapps/manager context in development environment
  &lt;li&gt;Custom style sheets can not be applied (in a standard way) to custom content
  &lt;li&gt;External data is stored in properties files
&lt;/ul&gt;

&lt;/dl&gt;

&lt;h3&gt;05:00&amp;ndash;08:00 p.m.&lt;br&gt;&lt;em&gt;International Spy Museum&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;Appetizers, libations, and a delicious catered dinner were provided at the International Spy Museum in downtown Washington, D.C.  After dinner, we toured the museum, which was very entertaining!  (The highlight exhibit was a working replica of James Bond's Austin-Martin getaway car.)  An hour and a half was barely enough time to scratch the surface.&lt;/p&gt;

&lt;h2&gt;Tuesday, July&amp;nbsp;27&lt;/h2&gt;

&lt;h3&gt;09:00&amp;ndash;09:45 a.m.&lt;br&gt;&lt;em&gt;Java Event API&lt;/em&gt;&lt;br&gt;Tracy Engwirda&lt;/h3&gt;

&lt;dl&gt;

&lt;dt&gt;Take-Home Lesson:
&lt;dd&gt;The event API is a real-time alternative to the snapshot mechanism

&lt;dt&gt;Important Fact Learned:
&lt;dd&gt;Event API data model based on IMS specification

&lt;dt&gt;Important Fact Learned:
&lt;dd&gt;The "event" API is geared towards data integration, not "events" in the usual sense of the word

&lt;dt&gt;Notes:
&lt;dd&gt;
&lt;ul&gt;
  &lt;li&gt;In Bb6, the event API is exposed by package blackboard.admin.*
  &lt;li&gt;Read:
  &lt;ul&gt;
    &lt;li&gt;Advanced Integration and Data Management Manual
    &lt;li&gt;Administrative API Specifications
  &lt;/ul&gt;
  &lt;li&gt;The event API data model mirrors the snapshot mechanism
  &lt;li&gt;The data model is based on the &lt;a href="http://www.imsglobal.org/enterprise/index.cfm"&gt;IMS 1.01 Enterprise Specification&lt;/a&gt;)
  &lt;li&gt;In terms of data model, the event API is an extension of the B2 API (entities and persisters)
  &lt;li&gt;Classes are stored in cms-admin.jar (add this JAR file to your classpath)
  &lt;li&gt;Using the event APIs:
  &lt;ul&gt;
    &lt;li&gt;command-line application
    &lt;ul&gt;
      &lt;li&gt;on Bb app server
      &lt;li&gt;on other server via snapshot client
    &lt;/ul&gt;
    &lt;li&gt;Building Blocks application (but use care)
    &lt;li&gt;Web Service
    &lt;li&gt;RPC wrappers
  &lt;/ul&gt;
  &lt;li&gt;Event handlers are constructed with database triggers (outside of the LS)
  &lt;li&gt;Event listener classes will be added in future APIs
&lt;/ul&gt;

&lt;/dl&gt;

&lt;h3&gt;09:45&amp;ndash;10:30 a.m.&lt;br&gt;&lt;em&gt;Blackboard&amp;nbsp;6 Authentication&lt;/em&gt;&lt;br&gt;Tom Scavo&lt;/h3&gt;

&lt;dl&gt;

&lt;dt&gt;Take-Home Lesson:
&lt;dd&gt;A custom authentication module should extend BaseAuthenticationModule

&lt;dt&gt;Important Fact Learned:
&lt;dd&gt;A lightweight web service can provide validation services to arbitrary web applications

&lt;dt&gt;Notes:
&lt;dd&gt;
&lt;ul&gt;
  &lt;li&gt;Blackboard 6 Standard Authentication
  &lt;ul&gt;
    &lt;li&gt;Authentication Types
    &lt;li&gt;Authentication API (HttpAuthModule)
    &lt;li&gt;BaseAuthenticationModule
    &lt;li&gt;Authentication Framework
  &lt;/ul&gt;
  &lt;li&gt;Blackboard 6 Custom Authentication
  &lt;ul&gt;
    &lt;li&gt;LogAuthenticationModule
    &lt;li&gt;AbstractAuthModule
    &lt;li&gt;GenericAuthModule
    &lt;li&gt;Installation
  &lt;/ul&gt;
  &lt;li&gt;BGSU Authentication
  &lt;ul&gt;
    &lt;li&gt;BGAuth and BGAuthValidator
    &lt;li&gt;BGAuthModule
  &lt;/ul&gt;
  &lt;li&gt;Developer's Workshop
&lt;/ul&gt;

&lt;/dl&gt;

&lt;h3&gt;10:45&amp;ndash;11:30 a.m.&lt;br&gt;&lt;em&gt;Building Blocks and Web Services (Java)&lt;/em&gt;&lt;br&gt;Bob Alcorn&lt;/h3&gt;

&lt;h3&gt;12:45&amp;ndash;01:30 p.m.&lt;br&gt;&lt;em&gt;Security and Authentication with Building Blocks (Java)&lt;/em&gt;&lt;br&gt;Tom Joyce&lt;/h3&gt;

&lt;dl&gt;

&lt;dt&gt;Take-Home Lesson:
&lt;dd&gt;Blackboard security built on Java security model

&lt;dt&gt;Important Fact Learned:
&lt;dd&gt;Custom authentication is not possible in .NET because Bb security is built on the Java security model

&lt;dt&gt;Notes:
&lt;dd&gt;
&lt;ul&gt;
  &lt;li&gt;General security concepts
  &lt;ul&gt;
    &lt;li&gt;Authentication
    &lt;li&gt;Authorization
    &lt;li&gt;Privacy
    &lt;li&gt;Integrity
  &lt;/ul&gt;
  &lt;li&gt;Declaring permissions in the manifest file is often a trial-and-error process
  &lt;li&gt;Blackboard security is based on the Java security model:
  &lt;ul&gt;
    &lt;li&gt;Java Secure Sockets Extension (JSSE)
    &lt;li&gt;Java Cryptography Extensions (JCE)
    &lt;li&gt;Java Generic Security Services (GSS) API
    &lt;li&gt;CertPath API
    &lt;li&gt;Java Authentication and Authorization Service (JAAS)
    &lt;li&gt;Code Security Model
  &lt;/ul&gt;
  &lt;li&gt;Authentication services are available to Building Blocks via AccessManagerService
  &lt;li&gt;Authorization services are also available to Building Blocks (see PlugInUtil)
  &lt;li&gt;Two types of roles: system (e.g., admin) and course (e.g., TA)
  &lt;li&gt;Security information available via java.lang.Class
&lt;/ul&gt;

&lt;/dl&gt;

&lt;h3&gt;02:00&amp;ndash;02:45 p.m.&lt;br&gt;&lt;em&gt;Building Blocks and Blackboard&amp;mdash;A Look Ahead&lt;/em&gt;&lt;br&gt;Bob Alcorn, Dan Cane, David Yaskin&lt;/h3&gt;

&lt;dl&gt;

&lt;dt&gt;Notes:
&lt;dd&gt;
&lt;ul&gt;
  &lt;li&gt;Internal event queues are coming (forced by the introduction of the Content System, which must coordinate with the Learning System)
  &lt;li&gt;e-Portfolios provided by the Content System
  &lt;li&gt;Selective release of content is coming
  &lt;li&gt;Transaction System Account Management
  &lt;li&gt;JJC's Discussion Board Grader would be useful to faculty
&lt;/ul&gt;

&lt;/dl&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7514525-109122012290293651?l=trscavo.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/109122012290293651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/109122012290293651'/><link rel='alternate' type='text/html' href='http://trscavo.blogspot.com/2004/07/building-blocks-conference-notes.html' title='Building Blocks Conference Notes'/><author><name>Tom Scavo</name><uri>http://www.blogger.com/profile/07476406033382071801</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01418569831996406907'/></author></entry><entry><id>tag:blogger.com,1999:blog-7514525.post-108921762908782699</id><published>2004-07-07T11:51:00.000-04:00</published><updated>2004-12-17T11:48:59.573-05:00</updated><title type='text'>Web Security</title><content type='html'>&lt;p&gt;Basic security principles include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Availability&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Integrity&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Authentication&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Confidentiality&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Non-repudiation&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Secure Sockets Layer (SSL), a web encryption technology originally developed by Netscape, provides basic web security.  All HTTP traffic over SSL (https) is encrypted (in both directions).  Beneficial consequences include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Confidentiality&lt;/em&gt;: The contents of messages are unreadable by 3rd-party observers&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Integrity&lt;/em&gt;: The contents of messages can not be altered or tampered with in transit&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Authentication&lt;/em&gt;: The sender and receiver are assured of each other's identity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most browsers ship with SSL certificates installed.  On the server, SSL modules (e.g., openSSL) and certificates (from Verisign, e.g.) must be installed.  A crypto card can alleviate server bottlenecks.&lt;/p&gt;
  
&lt;p&gt;The SSL network layer lies between IP and HTTP on the protocol stack.  Versions include SSL&amp;nbsp;v2.0 and SSL&amp;nbsp;v3.0.  Transport Layer Security (TLS) is an extension of SSL proposed by the Internet Engineering Task Force (IETF).  TLS&amp;nbsp;v1.0 is roughly equivalent to SSL&amp;nbsp;v3.0.  When an SSL connection is established, a client and server negotiate the best combination of cryptographic techniques.&lt;/p&gt;
  
&lt;p&gt;To avoid security issues, the following are recommended:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Store only hashed passwords in the database&lt;/li&gt;
  &lt;li&gt;Submit the login page over SSL, otherwise the password is passed in the clear and may be sniffed&lt;/li&gt;
  &lt;li&gt;Make passwords difficult to guess and install intruder alarms that detect random or systematic guessing of passwords&lt;/li&gt;
  &lt;li&gt;Avoid sensitive data in URLs (i.e., GET requests) since URLs are logged&lt;/li&gt;
  &lt;li&gt;To avoid GET requests (the result of redirects), return an HTML form with an onload handler that automatically POSTs the hidden fields in the form&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A session ID (like a password) must be protected.  To prevent session hijacking, a session-based application must run over SSL.  If the session mechanism uses cookies:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Set the secure attribute on the cookie, otherwise it will be passed over insecure (non-SSL) connections&lt;/li&gt;
  &lt;li&gt;Avoid setting a timeout on the cookie, even a short timeout, since browsers might then write the cookie to disk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Set session timeouts (on the server) as short as possible.  Like passwords, make the session ID difficult to guess and install intruder alarms that detect random or systematic guessing of session IDs.&lt;/p&gt;

&lt;p&gt;Do not use IP addresses in an attempt to prevent session hijacking (since it doesn't work and only raises support issues).  Remember: Logging out is a user's single best defense against session hijacking.&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7514525-108921762908782699?l=trscavo.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/108921762908782699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/108921762908782699'/><link rel='alternate' type='text/html' href='http://trscavo.blogspot.com/2004/07/web-security.html' title='Web Security'/><author><name>Tom Scavo</name><uri>http://www.blogger.com/profile/07476406033382071801</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01418569831996406907'/></author></entry><entry><id>tag:blogger.com,1999:blog-7514525.post-108921379326722864</id><published>2004-07-07T10:34:00.000-04:00</published><updated>2004-08-02T12:50:42.106-04:00</updated><title type='text'>Access Control</title><content type='html'>&lt;p&gt;The &lt;a href="http://trscavo.blogspot.com/2004/07/authentication-database-components.html#roles"&gt;roles table&lt;/a&gt; discussed earlier provides &lt;em&gt;Role-Based Access Control&lt;/em&gt;, a typical approach.  It would be better, however, if the application were precluded from making access control decisions.  Other types of access control are possible (a complex topic).  Another approach involves groups and resources, which we discuss now.&lt;/p&gt;
  
&lt;p&gt;For &lt;em&gt;Group-Based Access Control&lt;/em&gt;, define groups and resources as follows:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;groups( group, description )&lt;/li&gt;
  &lt;li&gt;resources( resource, url, link_text )&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The url field is the URL of the protected resource.  The link_text field is suitable for constructing hyperlinks (on a portal page, for instance).&lt;/p&gt;
  
&lt;p&gt;The groups table has two columns:&lt;/p&gt;

&lt;pre&gt;CREATE TABLE groups (
  group       VARCHAR(12)  NOT NULL,
  description VARCHAR(60)  NOT NULL,
  PRIMARY KEY (group) );&lt;/pre&gt;

&lt;p&gt;The resources table has three columns:&lt;/p&gt;

&lt;pre&gt;CREATE TABLE resources (
  resource   VARCHAR(16)  NOT NULL,
  url        VARCHAR(80)  NOT NULL,
  link_text  VARCHAR(40)  NOT NULL,
  PRIMARY KEY (resource) );&lt;/pre&gt;

&lt;p&gt;The group and username fields are the primary keys of the groups and users tables, respectively.&lt;/p&gt;

&lt;p&gt;A number of intersect tables are defined:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;group_membership( group, username )&lt;/li&gt;
  &lt;li&gt;group_access( group, resource )&lt;/li&gt;
  &lt;li&gt;user_access( username, resource )&lt;/li&gt;
&lt;/ul&gt;
    
&lt;p&gt;The group_membership table assigns users to groups.  It has two columns:&lt;/p&gt;

&lt;pre&gt;CREATE TABLE group_membership (
  group      VARCHAR(12)  NOT NULL,
  username   VARCHAR( 8)  NOT NULL,
  PRIMARY KEY (group,username) );&lt;/pre&gt;

&lt;p&gt;The group_access table attaches groups to resources.  It has two columns:&lt;/p&gt;

&lt;pre&gt;CREATE TABLE group_access (
  group      VARCHAR(12)  NOT NULL,
  resource   VARCHAR(16)  NOT NULL,
  PRIMARY KEY (group,resource) );&lt;/pre&gt;

&lt;p&gt;The group and resource fields are the the primary keys of the groups and resources tables, respectively.&lt;/p&gt;
  
&lt;p&gt;The user_access table attaches individual users to resources.  Like the group_access table, the user_access table has two columns:&lt;/p&gt;

&lt;pre&gt;CREATE TABLE user_access (
  username   VARCHAR( 8)  NOT NULL,
  resource   VARCHAR(16)  NOT NULL,
  PRIMARY KEY (username,resource) );&lt;/pre&gt;

&lt;p&gt;Individual user access is primarily for convenience.&lt;/p&gt;
  
&lt;p&gt;What groups does a particular user belong to?&lt;/p&gt;

&lt;pre&gt;SELECT group FROM group_membership
  WHERE username = '&lt;em&gt;username&lt;/em&gt;';&lt;/pre&gt;

&lt;p&gt;What groups have access to a particular resource?&lt;/p&gt;

&lt;pre&gt;SELECT group FROM group_access
  WHERE resource = '&lt;em&gt;resource&lt;/em&gt;';&lt;/pre&gt;

&lt;p&gt;What users have direct access to a particular resource?&lt;/p&gt;

&lt;pre&gt;SELECT username FROM user_access
  WHERE resource = '&lt;em&gt;resource&lt;/em&gt;';&lt;/pre&gt;
  
&lt;p&gt;Now assume the web service knows the name of the protected resource that requests it.  The web service does the following:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Validates the session ID&lt;/li&gt;
  &lt;li&gt;Authorizes the corresponding user&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The latter depends on whether the user belongs to a privileged group.&lt;/p&gt;

&lt;p&gt;What users have group access to a particular resource?&lt;/p&gt;

&lt;pre&gt;SELECT username FROM group_membership
  WHERE group IN (
    SELECT group FROM group_access
      WHERE resource = '&lt;em&gt;resource&lt;/em&gt;'
  );&lt;/pre&gt;

&lt;p&gt;Rewriting the subselect as a join:&lt;/p&gt;

&lt;pre&gt;SELECT username FROM group_membership, group_access
  WHERE group_membership.group = group_access.group
  AND resource = '&lt;em&gt;resource&lt;/em&gt;';&lt;/pre&gt;
  
&lt;p&gt;List &lt;em&gt;all&lt;/em&gt; users having access to a particular resource:&lt;/p&gt;

&lt;pre&gt;SELECT username FROM user_access
  WHERE resource = '&lt;em&gt;resource&lt;/em&gt;'
UNION
SELECT username FROM group_membership
  WHERE group IN (
    SELECT group FROM group_access
      WHERE resource = '&lt;em&gt;resource&lt;/em&gt;'
  );&lt;/pre&gt;
  
&lt;p&gt;Recall that the default login target is a portal home page.  Any authenticated user is allowed access to the portal page.  The web service returns a list of URLs to the portal page, which it uses to construct a &lt;em&gt;personalized home page&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;What resources does a particular user have direct access to?&lt;/p&gt;

&lt;pre&gt;SELECT resource FROM user_access
  WHERE username = '&lt;em&gt;username&lt;/em&gt;';&lt;/pre&gt;

&lt;p&gt;What resources does a particular user have group access to?&lt;/p&gt;

&lt;pre&gt;SELECT resource FROM group_access
  WHERE group IN (
    SELECT group FROM group_membership
      WHERE username = '&lt;em&gt;username&lt;/em&gt;'
  );&lt;/pre&gt;

&lt;p&gt;Rewriting the subselect as a join:&lt;/p&gt;

&lt;pre&gt;SELECT resource FROM group_access, group_membership
  WHERE group_access.group = group_membership.group
  AND username = '&lt;em&gt;username&lt;/em&gt;';&lt;/pre&gt;
  
&lt;p&gt;What are the URLs of &lt;em&gt;all&lt;/em&gt; the resources a particular user has access to?&lt;/p&gt;

&lt;pre&gt;SELECT url, link_text FROM resources
  WHERE resource IN (
    SELECT resource FROM user_access
      WHERE username = '&lt;em&gt;username&lt;/em&gt;'
    UNION
    SELECT resource FROM group_access
      WHERE group IN (
        SELECT group FROM group_membership
          WHERE username = '&lt;em&gt;username&lt;/em&gt;'
      )
  );&lt;/pre&gt;

&lt;p&gt;The URLs and the corresponding text are sufficient to construct a list of links.&lt;/p&gt;
  
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7514525-108921379326722864?l=trscavo.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/108921379326722864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/108921379326722864'/><link rel='alternate' type='text/html' href='http://trscavo.blogspot.com/2004/07/access-control.html' title='Access Control'/><author><name>Tom Scavo</name><uri>http://www.blogger.com/profile/07476406033382071801</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01418569831996406907'/></author></entry><entry><id>tag:blogger.com,1999:blog-7514525.post-108915553650261214</id><published>2004-07-06T16:49:00.000-04:00</published><updated>2004-10-05T08:38:45.793-04:00</updated><title type='text'>Authentication Web Service Components</title><content type='html'>&lt;p&gt;Assume the &lt;a href="http://trscavo.blogspot.com/2004/07/authentication-database-components.html"&gt;database components&lt;/a&gt; and &lt;a href="http://trscavo.blogspot.com/2004/07/authentication-web-components.html"&gt;web components&lt;/a&gt; for authentication/SSO are already in place.  The next step is to integrate an application into the authentication/SSO framework.&lt;/p&gt;

&lt;p&gt;Any given application must validate the session ID stored in the client-side cookie.  Validation occurs at the time a protected resource is requested.  Rather than install elaborate validation components in the application itself, we describe a &lt;em&gt;validation web service&lt;/em&gt; that accepts validation requests via HTTP.  To make use of the web service, an application need only do two things: 1)&amp;nbsp;make an HTTP request, and 2)&amp;nbsp;parse an XML document.  These modest requirements make it relatively easy to integrate an application into the authentication/SSO framework.&lt;/p&gt;

&lt;p&gt;The web service and the authentication controller share the same database (but are otherwise separate).  When the web service receives a validation request, it checks to see if the given session ID is in the database.  Validation succeeds if and only if the session ID is in the database.  Subsequently an XML document is returned to the client application.  The XML document encodes the validation response.&lt;/p&gt;

&lt;p&gt;The web service relies on an XML template.  This template is used to formulate a validation response.  The XML DTD may be of ad hoc design or standard design (e.g., SAML).&lt;/p&gt;

&lt;p&gt;The web service supports one action: validate.  The corresponding URL is:&lt;/p&gt;

&lt;pre&gt;/auth/service?action=validate&amp;SID=&lt;em&gt;sid&lt;/em&gt;&lt;/pre&gt;

&lt;p&gt;A request for the validate action always results in an XML document.  Both parameters (action and SID) are required.  For enhanced security, a request for the validate action should be a POST request with SID parameter encoded in the body of the request.&lt;/p&gt;

&lt;p&gt;When requested, a protected resource performs the following steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Extract the cookie (SID) from the request&lt;/li&gt;
  &lt;li&gt;If the cookie does not exist, redirect the client to the login page with parameter &lt;code&gt;target=&lt;em&gt;self&lt;/em&gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;If the cookie does exist, request the web service with SID as parameter&lt;/li&gt;
  &lt;li&gt;If the parsed XML indicates failure, redirect the client to the login page&lt;/li&gt;
  &lt;li&gt;If the parsed XML indicates success and the user possesses the desired role, return the requested resource to the client&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When requested, the web service performs the following operations.  If the session ID is in the sessions table, the request is valid:&lt;/p&gt;

&lt;pre&gt;SELECT username FROM sessions
  WHERE SID = '&lt;em&gt;sid&lt;/em&gt;';&lt;/pre&gt;

&lt;p&gt;Since the SID is the primary key of the sessions table, this query will return 0 or 1 results.  If the request is valid, the web service determines the corresponding roles:&lt;/p&gt;

&lt;pre&gt;SELECT role FROM roles
  WHERE username = '&lt;em&gt;username&lt;/em&gt;';&lt;/pre&gt;

&lt;p&gt;The resulting roles are encoded in the XML and returned in the response along with the username.&lt;/p&gt;
  
&lt;p&gt;It is up to the client application whether to enforce access restrictions.  If the desired role is contained in the list of roles returned from the web service, access is allowed.  Other approaches to access control (discussed later) remove this decision-making process from the application.&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7514525-108915553650261214?l=trscavo.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/108915553650261214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/108915553650261214'/><link rel='alternate' type='text/html' href='http://trscavo.blogspot.com/2004/07/authentication-web-service-components.html' title='Authentication Web Service Components'/><author><name>Tom Scavo</name><uri>http://www.blogger.com/profile/07476406033382071801</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01418569831996406907'/></author></entry><entry><id>tag:blogger.com,1999:blog-7514525.post-108914170378088384</id><published>2004-07-06T14:45:00.000-04:00</published><updated>2004-08-02T11:06:33.263-04:00</updated><title type='text'>Authentication Web Components</title><content type='html'>&lt;p&gt;Once the &lt;a href="http://trscavo.blogspot.com/2004/07/authentication-database-components.html"&gt;database components&lt;/a&gt; have been installed, the web components may be implemented.  The web components needed for authentication include a login page and a controller.  The login page has four form elements:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;a text field (username)&lt;/li&gt;
  &lt;li&gt;a password field (password)&lt;/li&gt;
  &lt;li&gt;a hidden field (target)&lt;/li&gt;
  &lt;li&gt;a submit button (Login)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When the Login button is pressed, the form is submitted to the controller.&lt;/p&gt;

&lt;p&gt;The controller processes all login and logout requests.  After processing, the controller issues an HTTP&amp;nbsp;302 redirect or forwards the request to another component (e.g., the login page).  The controller does not return HTML (or other markup).&lt;/p&gt;

&lt;p&gt;The controller supports two actions: login and logout.  The corresponding URLs are:&lt;/p&gt;

&lt;pre&gt;/auth/controller[?action=login[&amp;amp;target=&lt;em&gt;target&lt;/em&gt;]]
/auth/controller?action=logout[&amp;amp;target=&lt;em&gt;target&lt;/em&gt;]&lt;/pre&gt;

&lt;p&gt;The default action is the login action.  A GET request for the login action results in the login page.  A POST request for the login action includes two additional parameters: username and password.  A POST request for the login action always results in a redirect.&lt;/p&gt;

&lt;p&gt;A POST request for the login action causes the following steps to occur (in order):&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;authenticate the user&lt;/li&gt;
  &lt;li&gt;update the sessions table&lt;/li&gt;
  &lt;li&gt;create the cookie&lt;/li&gt;
  &lt;li&gt;redirect the client&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each step depends on the success of the previous step.&lt;/p&gt;
  
&lt;p&gt;To authenticate the user, the controller hashes the password and queries the users table:&lt;/p&gt;

&lt;pre&gt;SELECT username FROM users
  WHERE username = '&lt;em&gt;username&lt;/em&gt;'
  AND password = '&lt;em&gt;hashedPswd&lt;/em&gt;';&lt;/pre&gt;

&lt;p&gt;The username and hashedPswd are the input username and the MD5 hash of the input password (resp.).  The login action proceeds to the next step if the SELECT returns a result.&lt;/p&gt;
  
&lt;p&gt;Next the controller creates and stores an unique session ID:&lt;/p&gt;

&lt;pre&gt;INSERT INTO sessions VALUES
  ( '&lt;em&gt;sid&lt;/em&gt;', '&lt;em&gt;username&lt;/em&gt;' );&lt;/pre&gt;

&lt;p&gt;These two steps constitute a database transaction, which must be executed atomically.  A better approach is to write a database stored procedure:&lt;/p&gt;

&lt;pre&gt;stored_proc( '&lt;em&gt;username&lt;/em&gt;', '&lt;em&gt;hashedPswd&lt;/em&gt;' ) ==&amp;gt; '&lt;em&gt;sid&lt;/em&gt;'&lt;/pre&gt;

&lt;p&gt;The stored procedure authenticates and creates a session in one step.&lt;/p&gt;
  
&lt;p&gt;If the login action succeeds, a cookie is created on the client:&lt;/p&gt;

&lt;pre&gt;Set-Cookie: SID=&lt;em&gt;sid&lt;/em&gt;; path=/; domain=.my.com; secure&lt;/pre&gt;

&lt;p&gt;This creates a secure cookie visible throughout the my.com domain.  The cookie persists for the life of the browser (max).&lt;/p&gt;
  
&lt;p&gt;If authentication is unsuccessful, the controller redirects to the login page.  If the authentication is successful and the request has a parameter called target, the controller redirects the client to the target URL.  If there is no target parameter, the user is redirected to a personalized portal page.&lt;/p&gt;
  
&lt;p&gt;A request for the logout action always results in a redirect.  A GET logout request is equivalent to a POST logout request.  In either case, the session ID is invalidated in the sessions table:&lt;/p&gt;

&lt;pre&gt;DELETE FROM sessions WHERE sid = '&lt;em&gt;sid&lt;/em&gt;';&lt;/pre&gt;

&lt;p&gt;Instead of physically deleting the session, it may be marked for deletion in the sessions table (with associated cleanup issues).&lt;/p&gt;

&lt;p&gt;To complete the logout action, the cookie is expired on the client:&lt;/p&gt;

&lt;pre&gt;Set-Cookie: SID=; path=/; domain=.my.com; secure; 
  expires=Thursday, 01-Jan-70 00:00:00 GMT&lt;/pre&gt;

&lt;p&gt;This is a relatively minor issue however, since the corresponding entry in the sessions table has been invalidated.  Any subsequent validation attempt will fail.&lt;/p&gt;

&lt;p&gt;The target parameter allows seemless integration of the authentication framework.  The value of the (optional) target parameter is an absolute URL.  The controller redirects to the target URL after completing the action.  The default login target is a portal page.  The default logout target is the login page.&lt;/p&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7514525-108914170378088384?l=trscavo.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/108914170378088384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/108914170378088384'/><link rel='alternate' type='text/html' href='http://trscavo.blogspot.com/2004/07/authentication-web-components.html' title='Authentication Web Components'/><author><name>Tom Scavo</name><uri>http://www.blogger.com/profile/07476406033382071801</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01418569831996406907'/></author></entry><entry><id>tag:blogger.com,1999:blog-7514525.post-108905808452014236</id><published>2004-07-05T15:47:00.000-04:00</published><updated>2004-08-02T12:46:03.406-04:00</updated><title type='text'>Authentication Database Components</title><content type='html'>&lt;p&gt;Three database tables are required to implement a minimal &lt;a href="http://trscavo.blogspot.com/2004/07/authentication-overview.html"&gt;authentication/single sign-on&lt;/a&gt; solution:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;users( username, password )&lt;/li&gt;
  &lt;li&gt;sessions( sid, username )&lt;/li&gt;
  &lt;li&gt;roles( username, role )&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Alternatively, an LDAP directory may be used in lieu of a relational database.&lt;/p&gt;

&lt;p&gt;The users table has two columns:&lt;/p&gt;

&lt;pre&gt;CREATE TABLE users (
  username  VARCHAR(8)  NOT NULL,
  password  CHAR(32)    NOT NULL,
  PRIMARY KEY (username) );&lt;/pre&gt;

&lt;p&gt;For security reasons, the password is stored as an MD5 hash (or other suitable hash value).  In particular, cleartext passwords are not stored in the database.  Instead, passwords are one-way hashed using MD5:&lt;/p&gt;

&lt;pre&gt;INSERT INTO users VALUES
  ( 'trscavo', MD5( 'nopass' ) ), ...&lt;/pre&gt;

&lt;p&gt;Regardless of input, an MD5 hash value is precisely 32&amp;nbsp;characters:&lt;/p&gt;

&lt;pre&gt;SELECT MD5( 'nopass' );
==&amp;gt; 0945fc9611f55fd0e183fb8b044f1afe&lt;/pre&gt;
  
&lt;p&gt;The sessions table has two columns:&lt;/p&gt;

&lt;pre&gt;CREATE TABLE sessions (
  sid       CHAR(13)    NOT NULL,
  username  VARCHAR(8)  NOT NULL,
  PRIMARY KEY (sid) );&lt;/pre&gt;

&lt;p&gt;The session ID (sid) is a unique sequence of 13&amp;nbsp;characters (or other suitable ID).&lt;/p&gt;

&lt;p&gt;&lt;a name="roles"&gt;The roles table&lt;/a&gt; has two columns:&lt;/p&gt;

&lt;pre&gt;CREATE TABLE roles (
  username  VARCHAR(8)  NOT NULL,
  role      VARCHAR(20) NOT NULL,
  PRIMARY KEY (username,role) );&lt;/pre&gt;

&lt;p&gt;Access to protected resources is based on roles, which are assigned by the system administrator:&lt;/p&gt;

&lt;pre&gt;INSERT INTO roles VALUES
  ( 'trscavo', 'user' ),
  ( 'trscavo', 'administrator' );&lt;/pre&gt;

&lt;p&gt;Any given user may be assigned multiple roles.&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7514525-108905808452014236?l=trscavo.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/108905808452014236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/108905808452014236'/><link rel='alternate' type='text/html' href='http://trscavo.blogspot.com/2004/07/authentication-database-components.html' title='Authentication Database Components'/><author><name>Tom Scavo</name><uri>http://www.blogger.com/profile/07476406033382071801</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01418569831996406907'/></author></entry><entry><id>tag:blogger.com,1999:blog-7514525.post-108904050758962632</id><published>2004-07-05T10:56:00.000-04:00</published><updated>2004-07-06T15:45:15.693-04:00</updated><title type='text'>Authentication Overview</title><content type='html'>&lt;p&gt;Basic topics of interest:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Authentication&lt;/li&gt;
  &lt;li&gt;Single sign-on&lt;/li&gt;
  &lt;li&gt;Validation&lt;/li&gt;
  &lt;li&gt;Authorization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Authentication answers the question "Who are you?"  The authentication process requires user credentials, typically a username and password.  The credentials are passed to an authentication server and compared to credentials stored in a database or LDAP repository.&lt;/p&gt;
  
&lt;p&gt;Single sign-on (SSO) alleviates the need to authenticate more than once.  This may be accomplished by saving state (a session ID) in a client-side cookie, for example.  The session ID is then associated with a username in a sessions table.&lt;/p&gt;

&lt;p&gt;Single sign-on can occur at various levels:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Application&lt;/li&gt;
  &lt;li&gt;Server&lt;/li&gt;
  &lt;li&gt;Intranet&lt;/li&gt;
  &lt;li&gt;Extranet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will concentrate on SSO at the intranet level, that is, across servers throughout a domain.  (Later we will discuss SSO across domains.)&lt;/p&gt;
  
&lt;p&gt;Validation is the process that protects web resources.  When a protected resource is requested, the session ID is extracted from the cookie.  If the session ID is valid (in the sessions table), the request is satisfied.&lt;/p&gt;
  
&lt;p&gt;Authorization answers the question "Do you have access to this resource?"  Authorization occurs in conjunction with validation.  If the session ID is valid and the username associated with the session ID possesses the desired role (in a roles table), the request is satisfied.&lt;/p&gt;

&lt;p&gt;The following system components are required to implement a simple authentication/SSO solution:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;auth database&lt;/li&gt;
  &lt;li&gt;login page&lt;/li&gt;
  &lt;li&gt;auth controller&lt;/li&gt;
  &lt;li&gt;auth web service&lt;/li&gt;
  &lt;li&gt;XML template&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We start by examining the database components necessary to support authentication and single sign-on.&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7514525-108904050758962632?l=trscavo.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/108904050758962632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/108904050758962632'/><link rel='alternate' type='text/html' href='http://trscavo.blogspot.com/2004/07/authentication-overview.html' title='Authentication Overview'/><author><name>Tom Scavo</name><uri>http://www.blogger.com/profile/07476406033382071801</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01418569831996406907'/></author></entry><entry><id>tag:blogger.com,1999:blog-7514525.post-108888339531832612</id><published>2004-07-03T14:38:00.000-04:00</published><updated>2004-07-07T12:30:23.100-04:00</updated><title type='text'>Gearing Up for the Conference</title><content type='html'>&lt;p&gt;I'm giving a presentation entitled "Blackboard&amp;nbsp;6 Authentication" at the &lt;a href="http://www.blackboard.com/about/events/b2conference/index.htm"&gt;2nd Annual Blackboard Building Blocks Developers Conference&lt;/a&gt; on July&amp;nbsp;27, 2004.  Initially, I'll use this blog (thanks Blogger!) to flesh out some ideas related to authentication and single sign-on (SSO) at the enterprise level (intranet), and then perhaps speculate a bit about the current state of federated identity management solutions at the inter-enterprise level (extranet).  During the conference (7/26&amp;ndash;7/27), I'll capture my view of the conference proceedings here as well.&lt;/p&gt;

&lt;p&gt;Briefly, &lt;a href="http://www.blackboard.com/"&gt;Blackboard&lt;/a&gt; is a web e-learning platform.  The enterprise version of Blackboard (Bb) has an extensive set of APIs for enhancing and extending the platform.  In particular, there is a Java-based authentication API with hooks into the Bb authentication system, which allows institutions to integrate Blackboard into an existing enterprise authentication/SSO framework.&lt;/p&gt;

&lt;p&gt;This assumes, of course, that an authentication/SSO framework already exists at the enterprise level, so we'll start there...what might such a framework consist of?  Minimally, the framework I have in mind provides for 1)&amp;nbsp;authentication services, 2)&amp;nbsp;single sign-on, 3)&amp;nbsp;validation services, and 4)&amp;nbsp;authorization.  We will give a brief introduction to each of these topics in what follows.&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7514525-108888339531832612?l=trscavo.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/108888339531832612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7514525/posts/default/108888339531832612'/><link rel='alternate' type='text/html' href='http://trscavo.blogspot.com/2004/07/gearing-up-for-conference.html' title='Gearing Up for the Conference'/><author><name>Tom Scavo</name><uri>http://www.blogger.com/profile/07476406033382071801</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01418569831996406907'/></author></entry></feed>