<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
>

<channel>
	<title>willnorris.com &#187; saml</title>
	<atom:link href="http://willnorris.com/tag/saml/feed" rel="self" type="application/rss+xml" />
	<link>http://willnorris.com</link>
	<description>there&#039;s more to life than this</description>
	<lastBuildDate>Tue, 15 May 2012 21:57:32 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4-beta3-20574</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
		<item>
		<title>Best Practices with Directed Identity</title>
		<link>http://willnorris.com/2009/08/best-practices-with-directed-identity</link>
		<comments>http://willnorris.com/2009/08/best-practices-with-directed-identity#comments</comments>
		<pubDate>Mon, 03 Aug 2009 00:27:43 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
				<category><![CDATA[identity]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[directed identity]]></category>
		<category><![CDATA[openid]]></category>
		<category><![CDATA[saml]]></category>
		<category><![CDATA[shibboleth]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=831</guid>
		<description><![CDATA[Given the current discussion happening right now around federal website cookie policies, and the good response I got from my last post, I wanted to continue talking about directed identity a little bit. In this post, I want to talk about how directed identity has actually been implemented in projects I&#8217;ve been involved with, and [...]]]></description>
			<content:encoded><![CDATA[<p>Given the current discussion happening right now around federal website <a href="http://blog.ostp.gov/2009/07/24/cookiepolicy/">cookie policies</a>, and the good response I got from my <a href="http://willnorris.com/2009/07/openid-directed-identity-identifier-select">last post</a>, I wanted to continue talking about directed identity a little bit.  In this post, I want to talk about how directed identity has actually been implemented in projects I&#8217;ve been involved with, and what lessons can be learned from that.</p>

<p><span id="more-831"></span></p>

<h2>Shibboleth and SAML</h2>

<p><a href="http://shibboleth.internet2.edu/">Shibboleth</a> is an open source web single sign-on product which is very popular with universities around the world.  It is primarily an implementation of the <a href="http://saml.xml.org/saml-specifications">Security Assertion Markup Language</a> (SAML), but supports other identity protocols as well.  SAML v2 defines a specific type of identifier that may be used to identify a user within a transaction known as a <em>Persistent Identifier</em>.  The name itself does not convey it&#8217;s full meaning, but it is defined as &#8220;a persistent opaque identifier for a principal that is specific to an identity provider and a service provider or affiliation of service providers.&#8221;  This is SAML&#8217;s <em>directed identity</em>.</p>

<p>Shibboleth&#8217;s implementation of persistent identifiers has matured a bit over the years, but the main algorithm remains the same.  At it&#8217;s simplest, the identifier is simply a hash of three things: an identifier for the user, an identifier for the identity provider, and an identifier for the relying party.  Using md5 as our hashing algorithm, and using a few made up values, this would look like:</p>

<pre><code>md5( "jsmith" + "http://idp.example.com/" + "http://sp.example.com/" ) = 
    2f6bc52c7527747eff263f4183c7f402
</code></pre>

<p>When a relying party receives the string &#8220;2f6bc52c7527747eff263f4183c7f402&#8221;, it is completely opaque and reveals nothing about the identity of the user.</p>

<h2>Working with known algorithms</h2>

<p>As I mentioned before, Shibboleth is open source software.  All of our code is publicly available, including <a href="http://svn.middleware.georgetown.edu/view/java-shib-common/branches/REL_1/src/main/java/edu/internet2/middleware/shibboleth/common/attribute/resolver/provider/attributeDefinition/TransientIdAttributeDefinition.java?view=markup">the way that we calculate persistent identifiers</a>.  So how could a relying party use this knowledge to take the above opaque identifier and decipher the identity of the user it belongs to?  Pretty simply, if they have a list of possible usernames, or can reasonably guess them.  A list of usernames is far easier to get than you might imagine from unprotected university LDAP directories.  Then you simply iterate through the list and run the same algorithm until you find the matching hash value.  And even given a population of 30,000 usernames (the approximate number of students at <a href="http://www.usc.edu/">USC</a> where I worked), the following shell script churns through them in about 90 seconds:</p>

<pre><code>~$ date &amp;&amp; for i in `head -n 30000 /usr/share/dict/web2`; 
   do echo $i | md5 &gt;/dev/null; done &amp;&amp; date
Sun Aug  2 16:25:53 PDT 2009
Sun Aug  2 16:27:35 PDT 2009
</code></pre>

<p>To protect against such a brute-force attach to reveal the identity of a user, we added a secret salt to the hashing algorithm.  That way, you can&#8217;t regenerate the hash without also knowing the salt value:</p>

<pre><code>md5( "jsmith" + "http://idp.example.com/" + "http://sp.example.com/" 
    + "my-secret-salt" ) = cf79282c587897fb733d8338fe7bc9c2
</code></pre>

<p>It&#8217;s worth pointing out that, while use of a secret salt prevents a relying party from brute forcing the hash, it in no way prevents the identity provider from doing so, since they do of course know the secret salt.  Though we never ended up needing to do this at USC, we built the tools that would enable us to identify the user a persistent identifier belonged to.  In the event that a relying party reported that a particular user was abusing their system, we wanted to make sure we could identify who it was.</p>

<h2>The realities of deployment</h2>

<p>The above algorithm actually works pretty well for generating unique and secure opaque values for tuples of user, identity provider, and service provider.  But what happens when one of those values change?  At USC, users could request that their username be changed for a variety of reasons, and approximately 300 such requests were made each year.  So using the above algorithm, a username change would change every one of the user&#8217;s generated persistent identifiers.  And the reality is, businesses are often bought out by other businesses.  What happens when &#8220;http://sp.example.com/&#8221; needs to change to &#8220;http://sp.new-company.com/&#8221;?  That will effect the generated persistent identifier for <strong>every</strong> user.  How do you deal with these realities?  There are a number of ways, and I&#8217;ll outline just a few.  There is no one <em>right</em> solution, as the policy and practices of a particular institution will greatly impact their decision of how to address these situations.</p>

<p>Perhaps the simplest option in some respects would be to simply not change which identifiers are used for generating the hash and instead <strong>map the new identifiers</strong> to the old values.  Even if a user&#8217;s username has changed to &#8220;jjones&#8221;, you map it back to &#8220;jsmith&#8221; for the purposes of generated persistent identifiers.  While this allows a deployment to continue using the same hashes, it does introduce the burden of maintaining this map of identifiers.  And what is the institution&#8217;s policy with regards to re-issuing identifiers?  If &#8220;jsmith&#8221; is allowed to be re-issued to a different user at some point in the future, that is going to create problems.</p>

<p>An alternate solution would be to simply <strong>use better identifiers</strong>.  At USC, we had another user attribute called the &#8220;uscPVID&#8221; which we used instead of username.  This was itself an opaque identifier that effectively served as the primary key within the enterprise directory.  Even if all the other data for a user changed like their name and username, the uscPVID would remain the same.  The same kind of persistent key can be obtained for relying parties by creating a lookup table that maps the relying party&#8217;s public ID to some more persistent internal ID.  If and when a relying party changes their public ID, you simply modify, or add a new entry in your lookup table.</p>

<p>Finally, an identity provider could <strong>migrate from old to new identifiers</strong>, either with a one time update, or gradually.  For a one time update, the identity provider would generate the old and new identifier for a user or set of users, and provide that information to the relying part out of band.  The relying party would then be responsible for updating their database accordingly.  Alternately, the new and old mapping could be provided gradually at the time of user login by using attributes.  This was the technique used at USC for updating relying parties of changes to a different user attribute known as the USCID.  For reasons I won&#8217;t bother explaining here, this 10 digit ID could change for a user when certain events occurred.  To alert relying parties, we would include two attributes &#8212; the current USCID for the user, along with a list of &#8220;historical&#8221; USCIDs for that user.  Relying parties were then responsible for updating any records they had for one of the historical USCIDs to the current USCID of the user.</p>

<h2>Application to OpenID</h2>

<p>The above hashing method could be used with little or no modification to create directed identity URLs for OpenID users.  You could of course simply generate completely random IDs and store them in the database&#8230; that works too.  In my next post however, I&#8217;ll be talking about a new kind of OpenID service I&#8217;ve been doing a lot of thinking about, an OpenID proxy which works to protect the privacy of OpenIDs that don&#8217;t support directed identity themselves.  We&#8217;ll be using the above hashing algorithm, but doing some interesting things with the user identifier.</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2009/08/best-practices-with-directed-identity/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>try { reuse; } catch (Ex) { reinvent; }</title>
		<link>http://willnorris.com/2007/11/try-reuse-catch-ex-reinvent</link>
		<comments>http://willnorris.com/2007/11/try-reuse-catch-ex-reinvent#comments</comments>
		<pubDate>Tue, 06 Nov 2007 03:49:45 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
				<category><![CDATA[identity]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[hcard]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[microformats]]></category>
		<category><![CDATA[openid]]></category>
		<category><![CDATA[openid-ax]]></category>
		<category><![CDATA[saml]]></category>
		<category><![CDATA[shibboleth]]></category>

		<guid isPermaLink="false">http://willnorris.com/2007/11/try-reuse-catch-ex-reinvent</guid>
		<description><![CDATA[Earlier today, I wrote about the limitations of hCard primarily in regards to private data. After talking with Chris briefly and then reading Tantek&#8217;s thoughts on the topic, it clicked with me. I wouldn&#8217;t normally make two posts so close together about such similar topics, but I realize now these really are two different topics. [...]]]></description>
			<content:encoded><![CDATA[<p>Earlier today, I wrote about the <a href="http://willnorris.com/2007/11/hcard-is-not-a-provisioning-engine-for-private-data">limitations of hCard</a> primarily in regards to private data.  After talking with <a href="http://factoryjoe.com/blog/2007/11/01/hcard-for-openid-simple-registration-and-attribute-exchange/">Chris</a> briefly and then reading <a href="http://tantek.com/log/2007/11.html#d02t2318">Tantek&#8217;s thoughts</a> on the topic, it clicked with me.  I wouldn&#8217;t normally make two posts so close together about such similar topics, but I realize now these really are two different topics.  The concerns about hCard and privacy are very real and certainly worth consideration, but what Chris was really getting at was attribute naming.</p>

<p><span id="more-208"></span></p>

<h3>OpenID attributes</h3>

<p>The OpenID <a href="http://openid.net/specs/openid-simple-registration-extension-1_0.html">Simple Registration Extension</a> was designed, much like OpenID itself, to address a very specific use case &#8212; providing the most common data requested when registering at a new website (things like name, email, gender, etc).  It defines a fixed list of nine attributes that can be provided, and it works well for what it does, but it&#8217;s a bit rigid when one tries to do anything more with it.  Even before the final draft of the SREG extension had been published, work was already being done on a more flexible extension for <a href="http://openid.net/specs/openid-attribute-exchange-1_0-07.html">attribute exchange</a>.  This new extension defined only a mechanism for transferring attributes, but didn&#8217;t prescribe a fixed list of attributes.  But in order to be at all useful, two parties must be assured that they are both talking about the same attribute.  Therefore an attribute registry was established at <a href="http://www.axschema.org/">axschema.org</a> and a number of attributes (formatted as URLs) have <a href="http://www.axschema.org/types/">already been defined</a> which will likely be useful in common scenarios.</p>

<h3>Attributes in Higher Education</h3>

<p>Developed in the early 90s at the University of Michigan, LDAP quickly grew favor with higher education institutions to replace heavier-weight directory protocols.  A number of LDAP object classes were defined to provide attributes deemed useful in certain contexts, for example <a href="http://tools.ietf.org/html/rfc2798">rfc2798</a> defined <code>inetOrgPerson</code> which addressed the needs of &#8220;Internet and Intranet directory service deployments&#8221;.  Higher Education had its own unique needs, so in 2001 Internet2 published the first version of the <a href="http://www.educause.edu/eduperson/">eduPerson Object Class</a>.  If (and only if) institutions required additional attributes beyond those provided by some already published object class, it was common practice to define a local object class to house those attributes.</p>

<p>Within a few years, the SAML specification was published and <a href="http://shibboleth.internet2.edu/">Shibboleth</a> began finding its way onto many college campuses.  Though not required by SAML, Shibboleth recommended the use of URIs for SAML attribute names, and subsequently established a <a href="http://www.google.com/search?q=cache:http://middleware.internet2.edu/dir/docs/internet2-mace-dir-saml-attributes-200604.pdf">collection of URN values</a> to represent common LDAP attributes, including those defined in the eduPerson object class.  As before, if campuses needed to include additional attributes in a SAML assertion, they were defined within a local namespace.  Today, it is very common to see a mix of attributes at USC including those defined by Internet2:</p>

<ul>
<li><code>urn:mace:dir:attribute-def:displayName</code></li>
<li><code>urn:mace:dir:attribute-def:eduPersonAffiliation</code></li>
</ul>

<p>as well as those we have defined locally at USC:</p>

<ul>
<li><code>urn:mace:usc.edu:gds:attribute-def:uscUSCID</code></li>
<li><code>urn:mace:usc.edu:gds:attribute-def:uscStudentDegreeProgram</code></li>
</ul>

<h3>Applying Precedence</h3>

<p>No one is pretending that the fixed set of attributes defined in <a href="http://tools.ietf.org/html/rfc2426">rfc2426</a> is the definitive list of attributes that could possibly be useful in OpenID, no more than eduPerson was the exhaustive list of attributes for every university that used it.  All that is being questioned is why did Attribute Exchange redefine all that was already established in vCard?  I would strongly support Tantek&#8217;s third proposal of hosting the official hCard XMDP profile at <code>http://microformats.org/profile/hcard</code>, so that AX can leverage the hCard specification while maintaining URL based attribute names.  And given that it appears as though <a href="http://willnorris.com/openid-support">no one is currently supporting AX</a>, <strong>now</strong> is the time to make this change.</p>

<p>(For the non-technical, the title roughly reads &#8220;First try to reuse.  Only if that doesn&#8217;t work, then reinvent.&#8221;)</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2007/11/try-reuse-catch-ex-reinvent/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>hCard is not a provisioning engine (for private data)</title>
		<link>http://willnorris.com/2007/11/hcard-is-not-a-provisioning-engine-for-private-data</link>
		<comments>http://willnorris.com/2007/11/hcard-is-not-a-provisioning-engine-for-private-data#comments</comments>
		<pubDate>Mon, 05 Nov 2007 23:29:53 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
				<category><![CDATA[identity]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[hcard]]></category>
		<category><![CDATA[microformats]]></category>
		<category><![CDATA[openid]]></category>
		<category><![CDATA[openid-ax]]></category>
		<category><![CDATA[saml]]></category>
		<category><![CDATA[shibboleth]]></category>

		<guid isPermaLink="false">http://willnorris.com/2007/11/hcard-is-not-a-provisioning-engine-for-private-data</guid>
		<description><![CDATA[Last week I wrote about how hCard is much more appropriate than OpenID for the provisioning use-case and Chris continued that discussion, questioning why we need SREG and Attribute Exchange when hCard works just fine. So the question is, when OpenID is clearly a player in the future and part of that promise is about [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I wrote about how hCard is much more appropriate than OpenID for <a href="http://willnorris.com/2007/10/openid-is-not-a-provisioning-engine">the provisioning use-case</a> and Chris <a href="http://factoryjoe.com/blog/2007/11/01/hcard-for-openid-simple-registration-and-attribute-exchange/">continued that discussion</a>, questioning why we need SREG and Attribute Exchange when hCard works just fine.</p>

<blockquote>
  <p>So the question is, when OpenID is clearly a player in the future and part of that promise is about 
  making things easier, more consistent and more citizen-centric, why would we go and introduce a <strong>whole 
  new format</strong> for representing person-detail-data when a perfectly good one already exists and is so 
  widely supported?</p>
</blockquote>

<p>While I certainly agree with Chris that hCard has a role to play in the new world of online identity, I don&#8217;t want SREG or AX to be dismissed too quickly.  I don&#8217;t believe he was suggesting that hCard would replace SREG/AX in all use cases, but I want to labor this point just a little bit so that others are not confused.</p>

<p><span id="more-207"></span></p>

<p>There is one huge benefit to SREG and AX that hCard doesn&#8217;t (and by it&#8217;s nature, can&#8217;t) address&#8230; releasing different attributes to different relying parties.  This can take a number of forms.  The one most commonly supported in OpenID providers today is the idea of personas - a complete set of attribute values that reflect your online identity within a particular context.  You may have a &#8220;work&#8221; persona that includes your formal name, work email address and website, etc.  Separately, you may have a &#8220;personal&#8221; persona that has some informal nickname along with a personal email address, website. etc.  Separate still, you may have an &#8220;anonymous&#8221; persona that includes little (or fabricated) data about yourself.  Depending on which relying party you are authenticating to, you may use a particular persona.</p>

<p>Varying this slightly, one can imagine a use case that will be become increasingly important as OpenID continues to expand.  hCard is suitable for public attributes I want to post for the world to see, but what about not-so-public data?  It will likely be some time before we start transferring credit card numbers over OpenID+AX, but I have no doubt it will happen eventually (as nervous as that makes even me).  But even before then, I can imagine a host of data that I may need or want to provide to a relying party, but do not want to publish in my public hCard.  As I included in my <a href="http://willnorris.com/2007/03/openid-provider-wish-list">OpenID provider wish-list</a>, OpenID providers will need to provide the tools to manage the policies controlling this release of data, a feature that has the potential to really differentiate one provider from the rest of the pack.  This fine-grained level of control has always been a core requirement for the <a href="http://shibboleth.internet2.edu/">Shibboleth</a> SAML Identity provider, and I would argue that the (currently beta) Shibboleth 2.0 IdP has one of the most powerful and flexible (and admittedly, verbose) <a href="https://spaces.internet2.edu/display/SHIB2/AFPAttributeFilterPolicy">filtering engines</a> of its kind anywhere.</p>

<p>So there are really two issues at play in Chris&#8217;s question, that of the data format and separately, the mechanism for conveying that data.  I haven&#8217;t really addressed the issue of the data format, because I agree with Chris in principal at least.  His <a href="http://microformats.org/wiki/attribute-exchange">comparison table</a> of attribute names shows a very clear overlap between the different methods, and perhaps it would be useful to work to consolidate some of that.  But the mechanisms for making that data available address different, and equally valid, use cases and each play a role in making all of this stuff work.</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2007/11/hcard-is-not-a-provisioning-engine-for-private-data/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>OpenID is not a provisioning engine</title>
		<link>http://willnorris.com/2007/10/openid-is-not-a-provisioning-engine</link>
		<comments>http://willnorris.com/2007/10/openid-is-not-a-provisioning-engine#comments</comments>
		<pubDate>Tue, 30 Oct 2007 08:11:46 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
				<category><![CDATA[identity]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[hcard]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[microformats]]></category>
		<category><![CDATA[openid]]></category>
		<category><![CDATA[openid-ax]]></category>
		<category><![CDATA[provisioning]]></category>
		<category><![CDATA[saml]]></category>
		<category><![CDATA[shibboleth]]></category>

		<guid isPermaLink="false">http://willnorris.com/2007/10/openid-is-not-a-provisioning-engine</guid>
		<description><![CDATA[In talking about the future possibilities of OpenID 2.0 and the Attribute Exchange extension, James Henstridge mentions, Imagine being able to update your shipping address in one place when you move house and having all the online retailers you use receive the updated address immediately. Or changing your email address and having all the bugzilla [...]]]></description>
			<content:encoded><![CDATA[<p>In talking about the future possibilities of OpenID 2.0 and the <a href="http://openid.net/specs/openid-attribute-exchange-1_0-07.html">Attribute Exchange</a> extension, <a href="http://blogs.gnome.org/jamesh/2007/10/23/openid-20/">James Henstridge</a> mentions,</p>

<blockquote>
  <p>Imagine being able to update your shipping address in one place when you 
  move house and having all the online retailers you use receive the updated 
  address immediately. Or changing your email address and having all the 
  bugzilla instances you use pick up the new address instantly (perhaps 
  requiring you to verify the new address first, of course).</p>
</blockquote>

<p>While I agree this kind of experience would be very neat, it is not a use case for OpenID nor the Attribute Exchange extension.<span id="more-206"></span>  I am not surprised to hear someone say this, as this is a common point of confusion here at USC in regards to <a href="http://shibboleth.internet2.edu/">Shibboleth</a>.  When it comes to attribute delivery, both OpenID and SAML are primarily designed to provide data <em>at the time of login</em> <sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>.  So this means that if a user never logs in to your service, you never get any data about them.  And if a user&#8217;s data changes since their last login, you don&#8217;t find out about until they <em>next</em> login, since that is the only time attribute delivery occurs.  It is also important to note that you are typically only getting data about the user that is logging in, no one else.  You can&#8217;t treat an OpenID provider as a lookup service to get data about some other user.</p>

<p>So how does a relying party update their data without waiting on the user to login again?  One option is to have the data pushed to each service using some kind of messaging hub.  There is a whole market for enterprise messaging complete with its own set of acronyms like <a href="http://en.wikipedia.org/wiki/Enterprise_service_bus">ESB</a>, <a href="http://en.wikipedia.org/wiki/Enterprise_messaging_system">EMS</a>, <a href="http://en.wikipedia.org/wiki/Enterprise_application_integration">EAI</a>, and many many more.  I&#8217;m particularly interested in a project developed by a colleague of mine in Sweden called <a href="http://devel.it.su.se/pub/jsp/polopoly.jsp?d=1227">JEvent</a>, which uses the XMPP <a href="http://www.xmpp.org/extensions/xep-0060.html">Publish-Subscribe</a> protocol to deliver these types of messages using a standard XMPP server in the middle.  Your Jabber messaging window becomes your console. :)</p>

<p>The other method of getting at user data is for each relying party to pull the data.  This is the model we use at USC, where that mechanism for pulling data is LDAP.  A number of services on campus use LDAP to address both use cases mentioned above &#8212; refreshing data about users, as well as looking up data about someone other than the user who logged in.  So what&#8217;s the equivalent in the decentralized OpenID world?  Well honestly there isn&#8217;t anything just yet but we have a good foundation.  Thanks to <a href="http://microformats.org/">microformats</a> like <a href="http://microformats.org/wiki/hcard">hCard</a>, you can publish your data in a standard, machine-parsable format that your online retailers or bugzilla instances could watch periodically.  When you update your hCard on your homepage they can respond in kind, perhaps by immediately updating their databases or sending you a confirmation email of the change.  Right now all of this data is decentralized, published on personal blogs and webpages.  I don&#8217;t argue that this data should certainly be under individual control, but it puts an awful large burden on the individual service providers to do all that spidering.  I don&#8217;t know what the answer is, but I&#8217;ve been thinking about an hCard crawler with an LDAP front-end as a simple place to start.  Configure Apple AddressBook or Outlook to use LDAP, and you&#8217;re off and running.</p>

<div class="footnotes">
<hr />
<ol>

<li id="fn:1">
<p>SAML is actually a little more flexible here, but it&#8217;s not the common use case&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>

</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2007/10/openid-is-not-a-provisioning-engine/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

