<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Eugenio Pace</title><subtitle type="html">Clouds: one thing we really know about here in Redmond, WA, USA</subtitle><id>http://blogs.msdn.com/eugeniop/atom.xml</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/eugeniop/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/eugeniop/atom.xml" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2009-02-24T16:37:41Z</updated><entry><title>Claims based Identity &amp; Access Control Guide – Updated drafts &amp; samples available</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/eugeniop/archive/2009/10/20/claims-based-identity-access-control-guide-updated-drafts-samples-available.aspx" /><id>http://blogs.msdn.com/eugeniop/archive/2009/10/20/claims-based-identity-access-control-guide-updated-drafts-samples-available.aspx</id><published>2009-10-20T19:28:53Z</published><updated>2009-10-20T19:28:53Z</updated><content type="html">&lt;p&gt;Yesterday, we uploaded a new release of the Guide and the samples. You can download the content from &lt;a href="http://claimsid.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=34687"&gt;here&lt;/a&gt;. (Note: if you downloaded them yesterday, you might want to check again. We mistakenly uploaded the samples with no docs. It is fixed now). &lt;/p&gt;  &lt;p&gt;You’ll find:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Updated introduction &amp;amp; WebSSO chapters, incorporating quite a bit of feedback &lt;/li&gt;    &lt;li&gt;New updated samples, including scenario #2 (Federation with Partners). This is inspired in &lt;a href="http://blogs.msdn.com/eugeniop/archive/2009/08/24/next-station-federation-between-adatum-its-customers.aspx"&gt;this article&lt;/a&gt; I wrote some time ago.&amp;#160; &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Getting started with the samples:&lt;/h2&gt;  &lt;p&gt;Just download the zip file, expand somewhere in your disk. There’s a &lt;strong&gt;readme.htm&lt;/strong&gt; with some very basic instructions and prerequisites.You’ll have to run &lt;strong&gt;StartHere.cmd&lt;/strong&gt; batch file with elevated privileges (this essentially installs necessary certificates). Open the solution (as admin), compile and run.&lt;/p&gt;  &lt;p&gt;Prerequisites haven’t changed:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Visual Studio 2008 &lt;/li&gt;    &lt;li&gt;IIS (for HTTPS) &lt;/li&gt;    &lt;li&gt;WIF &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There are 2 scenarios folders now: scenario #1 (WebSSO), which is the same we published a couple of weeks ago. Then there’s the new one that shows federation between Adatum’s&lt;strong&gt;&lt;em&gt; a-Order&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;Litware&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;The first time you open Visual Studio, it will create some new web sites for you.It might happen that those websites already exist from previous drop, you might want to delete them beforehand if you expand the files in a different location.&lt;/p&gt;  &lt;p&gt;Make sure the default app is “Litware Portal”:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ClaimsbasedIdentityAccessControlGuideUpd_F691/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ClaimsbasedIdentityAccessControlGuideUpd_F691/image_thumb_1.png" width="392" height="395" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This is the launching point for the application from Litware’s perspective.&lt;/p&gt;  &lt;p&gt;The major changes from the code in Scenario #1 is that now &lt;strong&gt;&lt;em&gt;Adatum.IdentityProvider&lt;/em&gt;&lt;/strong&gt; has been extended to other things, namely manage the trust relationship between Adatum and Litware. That’s why we now call it &lt;strong&gt;Adatum.Issuer&lt;/strong&gt;. This new functionality includes transforming claims issued by Litware into claims understood by a-Order. All this is happening in the &lt;strong&gt;FederationSecurityTokenService&lt;/strong&gt; class.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ClaimsbasedIdentityAccessControlGuideUpd_F691/image_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ClaimsbasedIdentityAccessControlGuideUpd_F691/image_thumb_2.png" width="392" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Adatum.Issuer is a “mock” STS and its implementation is no more and no less than what is strictly needed for the sample to work. In the real world you would replace it, as we did in our test Lab, with a real/production quality issuer such as ADFS v2.&lt;/p&gt;  &lt;p&gt;The transformation rules in our mock STS are trivial and are all implemented in the &lt;strong&gt;&lt;em&gt;GetOutputClaimsIdentity&lt;/em&gt;&lt;/strong&gt; method override:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;protected override &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IClaimsIdentity &lt;/span&gt;GetOutputClaimsIdentity(&lt;span style="color: #2b91af"&gt;IClaimsPrincipal &lt;/span&gt;principal, &lt;span style="color: #2b91af"&gt;RequestSecurityToken &lt;/span&gt;request, &lt;span style="color: #2b91af"&gt;Scope &lt;/span&gt;scope)
        {
            &lt;span style="color: blue"&gt;var &lt;/span&gt;outputIdentity = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ClaimsIdentity&lt;/span&gt;();

            &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: blue"&gt;null &lt;/span&gt;== principal)
            {
                &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;InvalidRequestException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;The caller's principal is null.&amp;quot;&lt;/span&gt;);
            }

            &lt;span style="color: blue"&gt;var &lt;/span&gt;claimsIdentity = (&lt;span style="color: #2b91af"&gt;ClaimsIdentity&lt;/span&gt;) principal.Identity;
            &lt;span style="color: blue"&gt;var &lt;/span&gt;issuer = claimsIdentity.Claims.First().Issuer;

            &lt;span style="color: blue"&gt;switch &lt;/span&gt;(issuer)
            {
                &lt;span style="color: blue"&gt;case &lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;litware&amp;quot;&lt;/span&gt;:
                    ProcessClaimsFromLitwareIssuer(claimsIdentity, outputIdentity);
                    &lt;span style="color: blue"&gt;break&lt;/span&gt;;
                &lt;span style="color: blue"&gt;default&lt;/span&gt;:
                    &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Issuer not trusted.&amp;quot;&lt;/span&gt;);
            }

            &lt;span style="color: blue"&gt;return &lt;/span&gt;outputIdentity;
        }&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;The samples contain a number of annotations and hints here and there to explain what is happening. Make sure you hover with the mouse over this little information icon to get extra context:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ClaimsbasedIdentityAccessControlGuideUpd_F691/image_8.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ClaimsbasedIdentityAccessControlGuideUpd_F691/image_thumb_3.png" width="402" height="326" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;This is still under development of course, so expect quite some changes. But we hope you’ll find it useful anyway. Feedback is very much welcome as always.&lt;/p&gt;

&lt;p&gt;Very special thanks to the following people for their extensive feedback and suggestions for this Guide:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/mszcool/default.aspx"&gt;Mario Szpuszta&lt;/a&gt;, &lt;a href="http://weblogs.asp.net/cibrax/"&gt;Pablo Cibraro&lt;/a&gt;, &lt;a href="http://travisspencer.com/"&gt;Travis Spencer&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/mariofontana/default.aspx"&gt;Mario Fontana&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/thehoggblog/"&gt;Jason Hogg&lt;/a&gt;, &lt;a href="http://www.dasblonde.net/"&gt;Michele Leroux Bustamante&lt;/a&gt;, &lt;a href="http://pfelix.wordpress.com/"&gt;Pedro Felix&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9910140" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/members/eugeniop.aspx</uri></author><category term="Architecture" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Architecture/default.aspx" /><category term="Security" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Security/default.aspx" /><category term="Federated Identity" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Federated+Identity/default.aspx" /><category term="Claims" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Claims/default.aspx" /><category term="S+S" scheme="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S/default.aspx" /><category term="Federation Provider" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Federation+Provider/default.aspx" /><category term="Identity Provider" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Identity+Provider/default.aspx" /><category term="WebSSO" scheme="http://blogs.msdn.com/eugeniop/archive/tags/WebSSO/default.aspx" /><category term="Claims Guide" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Claims+Guide/default.aspx" /><category term="Geneva" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Geneva/default.aspx" /></entry><entry><title>RIA Services and Windows Identity Foundation – Claims enabling a RIA application</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/eugeniop/archive/2009/10/09/ria-services-and-windows-identity-foundation-claims-enabling-a-ria-application.aspx" /><id>http://blogs.msdn.com/eugeniop/archive/2009/10/09/ria-services-and-windows-identity-foundation-claims-enabling-a-ria-application.aspx</id><published>2009-10-09T20:35:34Z</published><updated>2009-10-09T20:35:34Z</updated><content type="html">&lt;p&gt;Recently a Customer asked me if an application using RIA Services could use WIF. I’m fairly new to RIA Services so I didn’t know the answer right away, however I suspected the integration should not be too hard, so I spend a couple of days spiking a solution.&lt;/p&gt;  &lt;p&gt;The good news: it just works!&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;What I did:&lt;/p&gt;  &lt;p&gt;I took one of the samples available from the RIA Services website (&lt;b&gt;&lt;i&gt;HRApp&lt;/i&gt;&lt;/b&gt;, you can download it here: &lt;a href="http://code.msdn.microsoft.com/RiaServices"&gt;http://code.msdn.microsoft.com/RiaServices&lt;/a&gt;, more specifically: &lt;a href="http://code.msdn.microsoft.com/RiaServices/Release/ProjectReleases.aspx?ReleaseId=2387"&gt;http://code.msdn.microsoft.com/RiaServices/Release/ProjectReleases.aspx?ReleaseId=2387&lt;/a&gt; ) &lt;/p&gt;  &lt;p&gt;After installing and verifying everything worked, I “claims enabled” it by running “FedUtil.exe”. I configured it to point to Adatum Issuer (exactly the same you can download from the Guide CodePlex site: &lt;a href="http://claimsid.codeplex.com"&gt;http://claimsid.codeplex.com&lt;/a&gt;). &lt;/p&gt;  &lt;p&gt;As expected, FedUtil changed a few setting in the app config file to enable claims: WIF modules were registered and the relationship with Adatum Issuer was established:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/RIAServicesandClaims_9341/clip_image001_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/RIAServicesandClaims_9341/clip_image001_thumb.jpg" width="640" height="201" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/RIAServicesandClaims_9341/clip_image002_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/RIAServicesandClaims_9341/clip_image002_thumb.jpg" width="640" height="97" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I then ran the application again and I was gladly surprised to be first redirected to the Issuer for authentication:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/RIAServicesandClaims_9341/clip_image003_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image003" border="0" alt="clip_image003" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/RIAServicesandClaims_9341/clip_image003_thumb.jpg" width="614" height="480" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If you have installed the Guide samples, you are probably familiar with this screen and you know that it will issue a set of claims for a user “Mary” that includes 2 roles “Orders approvers”, “Employees”. When I click on “continue button”, claims are issued and sent to the RIA application where now I’m authenticated and recognized:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/RIAServicesandClaims_9341/clip_image004_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/RIAServicesandClaims_9341/clip_image004_thumb.jpg" width="618" height="542" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If you break into the application (server side) and inspect the &lt;b&gt;&lt;i&gt;User&lt;/i&gt;&lt;/b&gt; object from the &lt;b&gt;&lt;i&gt;HttpContext&lt;/i&gt;&lt;/b&gt; you’ll notice there’s a “&lt;b&gt;&lt;i&gt;ClaimsIdentity&lt;/i&gt;&lt;/b&gt;” and you have access of course to the claims collection, etc. That is part of the “magic” performed by WIF modules:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/RIAServicesandClaims_9341/clip_image005_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image005" border="0" alt="clip_image005" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/RIAServicesandClaims_9341/clip_image005_thumb.jpg" width="584" height="480" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;On the Silverlight side, you can see that now the &lt;b&gt;&lt;i&gt;User&lt;/i&gt;&lt;/b&gt; object in the &lt;b&gt;&lt;i&gt;RiaContext&lt;/i&gt;&lt;/b&gt; also reflects the content obtained in the server side. This is thanks to some of the magic wiring RIA Services does for us:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/RIAServicesandClaims_9341/clip_image006_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/RIAServicesandClaims_9341/clip_image006_thumb.jpg" width="640" height="285" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;RIA Services out of the box implementations rely on ASP.NET infrastructure. I didn’t want to change the sample app too much, so I created a very simple &lt;b&gt;&lt;i&gt;RoleProvider&lt;/i&gt;&lt;/b&gt; that would simply resolve &lt;em&gt;GetRolesForUser&lt;/em&gt; through the &lt;i&gt;ClaimsIdentity&lt;/i&gt;. Here’s the (only) method that I implemented from the &lt;b&gt;&lt;i&gt;RoleProvider&lt;/i&gt;&lt;/b&gt; base class:&lt;/p&gt;  &lt;p&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color: blue"&gt;public override string&lt;/span&gt;[] GetRolesForUser(&lt;span style="color: blue"&gt;string &lt;/span&gt;username)    &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var &lt;/span&gt;id = &lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.User.Identity &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IClaimsIdentity&lt;/span&gt;;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;from &lt;/span&gt;c &lt;span style="color: blue"&gt;in &lt;/span&gt;id.Claims    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;where &lt;/span&gt;c.ClaimType == &lt;span style="color: #2b91af"&gt;ClaimTypes&lt;/span&gt;.Role    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;select &lt;/span&gt;c.Value).ToArray();    &lt;br /&gt;}&lt;/p&gt; &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Roles are enabled in the web.config:&lt;/p&gt;  &lt;p&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;roleManager &lt;/span&gt;&lt;span style="color: red"&gt;enabled&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;true&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;defaultProvider&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;GenevaRoles&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;providers&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;GenevaRoles&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;HRApp.Web.GenevaRolesProvider, HRApp.Web&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;providers&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;roleManager&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Of course, Roles are Claims, but not all Claims are roles. You could extend the RIA User object to hold whatever other information you want. So you could end up having any other profile data in the user object that comes from a Claim (e.g. the “Cost Center” claim that our Issuer gives us).&lt;/p&gt;  &lt;p&gt;Many thanks to &lt;a href="http://blogs.msdn.com/erwinvandervalk"&gt;Erwin&lt;/a&gt; for his help.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9905540" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/members/eugeniop.aspx</uri></author><category term="Federated Identity" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Federated+Identity/default.aspx" /><category term="Claims" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Claims/default.aspx" /><category term="SSO" scheme="http://blogs.msdn.com/eugeniop/archive/tags/SSO/default.aspx" /><category term="Identity Provider" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Identity+Provider/default.aspx" /><category term="Claims Guide" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Claims+Guide/default.aspx" /><category term="RIA Services" scheme="http://blogs.msdn.com/eugeniop/archive/tags/RIA+Services/default.aspx" /><category term="RIA" scheme="http://blogs.msdn.com/eugeniop/archive/tags/RIA/default.aspx" /><category term="Silverlight" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Silverlight/default.aspx" /></entry><entry><title>Claims based Identity &amp; Access Control Guide – Early drafts available</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/eugeniop/archive/2009/10/02/claims-based-identity-access-control-guide-early-drafts-available.aspx" /><id>http://blogs.msdn.com/eugeniop/archive/2009/10/02/claims-based-identity-access-control-guide-early-drafts-available.aspx</id><published>2009-10-03T02:20:21Z</published><updated>2009-10-03T02:20:21Z</updated><content type="html">&lt;p&gt;We finally have a &lt;a href="http://claimsid.codeplex.com/"&gt;CodePlex site&lt;/a&gt; for sharing early content with you all. Check the &lt;a href="http://claimsid.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=33883"&gt;downloads section&lt;/a&gt; for:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A few intro chapters (some of the “theory”, technologies and protocols behind claims based identity) &lt;/li&gt;    &lt;li&gt;The first scenario (roughly described in my post &lt;a href="http://blogs.msdn.com/eugeniop/archive/2009/08/19/welcome-to-the-enterprise-line-our-next-stop-will-be-station-1-sso-mind-the-gap.aspx"&gt;here&lt;/a&gt;, but better and nicer, and written in English :-)) &lt;/li&gt;    &lt;li&gt;The sample code for this first chapter &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The first scenario is fairly basic. However, I think people with little previous experience with Claims will find this really useful. Those who are very experienced, will probably not find a lot of new content at this point.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Few things to highlight:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;On the code:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;We wanted to keep it very very simple. Right now the only pre-requisites are: IIS and Windows Identity Foundation (WIF). IIS is needed because some pieces of the samples require HTTPS. WIF is needed because, well…this is about claims right? All the rest is mocked or simulated.&lt;/p&gt;  &lt;p&gt;We tried to minimize the amount of setup required, but there are a few steps that are needed (e.g. installing a certificate, enabling HTTPS). There’s a small script that explains what to do. But we added quite some checking and verification here and there to highlight if something is likely to fail due to a problem in the configuration.&lt;/p&gt;  &lt;p&gt;The IIS web sites are created the first time you open the solution in Visual Studio. Running the samples you should see:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ClaimsbasedIdentityAccessControlGuideEar_13EB8/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ClaimsbasedIdentityAccessControlGuideEar_13EB8/image_thumb.png" width="640" height="376" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Wherever you see the little blue “i” icon, there will be a tip with further explanations.&lt;/p&gt;  &lt;p&gt;Many things in the samples are simulated. For example, &lt;strong&gt;&lt;em&gt;a-Order &lt;/em&gt;&lt;/strong&gt;in the chapter is described as a Windows Authentication enabled app. We don’t want to mess-up with your AD or with your machine accounts &amp;amp; groups. Also, when we claims-enable an app we don’t want to require you to necessarily deploy ADFS. Therefore we included in the solution a “fake” Issuer to create the required claims. The Guide explains the differences between the real scenario and the simulation though; and steps to configure a real scenario.&lt;/p&gt;  &lt;p&gt;Following a-Expense (Claims Aware), for example leads you to:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ClaimsbasedIdentityAccessControlGuideEar_13EB8/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ClaimsbasedIdentityAccessControlGuideEar_13EB8/image_thumb_1.png" width="640" height="411" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Notice the extra explanation. Generally, you will not see anything automagically happening. The intent is that everything not obvious will have a tips like this or an in-line comment.&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;On the chapters:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The first three chapters are introductory and you will see a lot of TBDs and comments. All of this is, of course, work in progress; but we’d love your input. &lt;/p&gt;  &lt;p&gt;The introduction chapters are mostly “theory”: background, context, terminology, etc. The fourth chapter is the first scenario: WebSSO. You will see callouts here and there from one of our four main characters in the book:&lt;/p&gt;  &lt;p&gt;- &lt;strong&gt;Bharath&lt;/strong&gt;, the Security Expert&lt;/p&gt;  &lt;p&gt;- &lt;strong&gt;Jana&lt;/strong&gt;, the Architect&lt;/p&gt;  &lt;p&gt;- &lt;strong&gt;Poe&lt;/strong&gt;, the Operations guy&lt;/p&gt;  &lt;p&gt;- &lt;strong&gt;Markus&lt;/strong&gt;, the Developer&lt;/p&gt;  &lt;p&gt;The intent is to highlight specific points of views from each of these guys and enrich the guidance we want to provide.&lt;/p&gt;  &lt;p&gt;Important note: these chapters are NOT formatted to the final layout. So, for example, the callouts will be on the margins in the final book. Please concentrate on the content and not on the format for now.&lt;/p&gt;  &lt;p&gt;Hope you like it! Let us know what you think!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9902625" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/members/eugeniop.aspx</uri></author><category term="Federated Identity" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Federated+Identity/default.aspx" /><category term="Claims" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Claims/default.aspx" /><category term="SSO" scheme="http://blogs.msdn.com/eugeniop/archive/tags/SSO/default.aspx" /><category term="Identity Provider" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Identity+Provider/default.aspx" /><category term="WebSSO" scheme="http://blogs.msdn.com/eugeniop/archive/tags/WebSSO/default.aspx" /><category term="Claims Guide" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Claims+Guide/default.aspx" /><category term="Geneva" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Geneva/default.aspx" /></entry><entry><title>Exploring the Service Provider track – Fabrikam Shipping Part II (Solution)</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/eugeniop/archive/2009/09/03/exploring-the-service-provider-track-fabrikam-shipping-part-ii-solution.aspx" /><id>http://blogs.msdn.com/eugeniop/archive/2009/09/03/exploring-the-service-provider-track-fabrikam-shipping-part-ii-solution.aspx</id><published>2009-09-04T07:45:10Z</published><updated>2009-09-04T07:45:10Z</updated><content type="html">&lt;p&gt;Now that we presented the &lt;a href="http://blogs.msdn.com/eugeniop/archive/2009/09/01/exploring-the-service-provider-track-first-station-fabrikam-shipping-part-i-the-scenario-challenges.aspx"&gt;scenario &amp;amp; the requirements&lt;/a&gt;, let’s take a look at the solution. &lt;/p&gt;  &lt;h2&gt;What is conceptual solution we propose?&lt;/h2&gt;  &lt;p&gt;&lt;strong&gt;Fabrikam Shipping in the pre-Claims era: &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This diagram shows &lt;strong&gt;Fabrikam Shipping&lt;/strong&gt; today if used by Adatum (no claims, no federation):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ExploringtheServiceProvidertrackFabrikam_9DAE/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ExploringtheServiceProvidertrackFabrikam_9DAE/image_thumb.png" width="640" height="398" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You will see the usual suspects for a typical .NET web application. Furthermore, Fabrikam is using standard providers for authentication, authorization and profile. In this configuration, everyone in Adatum must use, of course, user name &amp;amp; passwords. The username is the handle associated with a role in the roles database, which drives application behavior (what you can do).&lt;/p&gt;  &lt;p&gt;In the example, John from sales, can only Order New Shipments, but Peter from Customer Service, can Manage them.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Making Fabrikam Shipping Claims-Aware&lt;/h3&gt;  &lt;p&gt;What we want now, is Fabrikam to be claims aware and trust claims issued by Adatum. Claims issued by Adatum will be used for authentication and authorization. We also want to map Adatum &lt;em&gt;internal&lt;/em&gt; roles to Fabrikam’s for authorization purposes: who will be a “&lt;strong&gt;Shipment Creator&lt;/strong&gt;”? Who will be an “&lt;strong&gt;Administrator&lt;/strong&gt;”?&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ExploringtheServiceProvidertrackFabrikam_9DAE/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ExploringtheServiceProvidertrackFabrikam_9DAE/image_thumb_1.png" width="640" height="396" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Let’s see how this would work:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;When John attempts to use &lt;strong&gt;FS&lt;/strong&gt; for the first time (e.g. htt&lt;strong&gt;ps://adatum.fabrikamshipping.com&lt;/strong&gt;), because there’s no session established yet (John is un-authenticated from &lt;strong&gt;FS&lt;/strong&gt; point of view) he will be redirected to Fabrikam’s Issuer (e.g. &lt;strong&gt;https://login.fabrikam.com&lt;/strong&gt;). Fabrikam’s Issuer is trusted by the application. &lt;/li&gt;    &lt;li&gt;Again, John will be redirected to Adatum’s Issuer, because that is what Fabrikam’s Issuer trusts. &lt;/li&gt;    &lt;li&gt;If John uses a domain joined desktop, he’d already be authenticated in his network and will have a valid Kerberos token. This token is used by the Adatum’s Issuer to create Adatum’s claims: &lt;strong&gt;employee name&lt;/strong&gt;, &lt;strong&gt;employee address&lt;/strong&gt;, &lt;strong&gt;cost center&lt;/strong&gt;, and &lt;strong&gt;department&lt;/strong&gt; John works for.&amp;#160;&amp;#160; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The process unwinds then: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Adatum’s claims are sent back to Fabrikam’s Issuer, where they are transformed: &lt;/li&gt; &lt;/ol&gt;  &lt;blockquote&gt;   &lt;p&gt;- &lt;strong&gt;Name&lt;/strong&gt;, &lt;strong&gt;address&lt;/strong&gt; and &lt;strong&gt;cost center&lt;/strong&gt; are simply copied (no transformation)&lt;/p&gt;    &lt;p&gt;- Other rules are applied that will result in a “role” claims to be issued (any of the valid roles &lt;strong&gt;FS&lt;/strong&gt; understands)&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;More examples of mappings:&lt;/p&gt;    &lt;p&gt;&lt;em&gt;exists([issuer == &amp;quot;Adatum&amp;quot;]) =&amp;gt; issue(type = &amp;quot;Role&amp;quot;, value = &amp;quot;Shipment Creator&amp;quot;);&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;Which can be interpreted as:&lt;/p&gt;    &lt;p&gt;&lt;em&gt;“Any employee from Adatum can create shipment orders”&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;c:[type == “http://schemas.xmlsoap.org/claims/Group”, value == &amp;quot;Shipments&amp;quot;] =&amp;gt; issue(type = “Role”, value = “Shipment Manager”);&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;that would implement the rule:&lt;/p&gt;    &lt;p&gt;&lt;em&gt;“Any employee from Adatum in “Shipments” (indicated by group membership) department can manage shipment orders”&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/em&gt;2&lt;em&gt;. &lt;/em&gt;After these transformation happens, John is finally directed back to the application with the transformed claims.&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="855"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="853"&gt;         &lt;blockquote style="margin-right: 0px" dir="ltr"&gt;           &lt;p&gt;Adatum &lt;em&gt;could&lt;/em&gt; issue Fabrikam’s specific claims, but we don’t want to pollute Adatum’s Issuer with Fabrikam specific concepts (like Fabrikam roles). Fabrikam will allow Adatum to issue any claims they want or can, and then will allow Adatum to configure the system to map these Adatum claims into Fabrikam claims.&amp;#160;&amp;#160; &lt;/p&gt;         &lt;/blockquote&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Fabrikam will do this for &lt;em&gt;every new Customer&lt;/em&gt; using &lt;strong&gt;Fabrikam Shipping&lt;/strong&gt;. Yet, their application will always understand &lt;em&gt;the same&lt;/em&gt; set of claims: “&lt;strong&gt;Shipment Creator&lt;/strong&gt;”, etc. &lt;strong&gt;FS&lt;/strong&gt; stays decoupled.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="856"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="854"&gt;&lt;strong&gt;Note 1:            &lt;br /&gt;&lt;/strong&gt;This scenario is almost identical to &lt;a href="http://blogs.msdn.com/eugeniop/archive/2009/03/09/architecting-cloud-applications-for-the-enterprise-part-iv-supercloudysoftware-sketches-issuetracker-enterprise-edition.aspx"&gt;IssueTracker&lt;/a&gt;. If you feel &lt;em&gt;deja-vu,&lt;/em&gt; don’t be surprised. Only in IssueTracker, we used .NET Services ACS as the Service Provider (Fabrikam) Issuer.           &lt;br /&gt;          &lt;br /&gt;&lt;strong&gt;Note 2:            &lt;br /&gt;&lt;/strong&gt;This scenario is also similar (but not quite the same) to &lt;a href="http://blogs.msdn.com/eugeniop/archive/2009/08/24/next-station-federation-between-adatum-its-customers.aspx"&gt;Adatum’s a-Order&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt;. Some key differences: Fabrikam is a multi-tenant system, probably with a provisioning experience, that &lt;strong&gt;a-Order&lt;/strong&gt; lacked. This is because in our fictitious (but hopefully realistic) world, the Customer &lt;em&gt;churn&lt;/em&gt; in &lt;strong&gt;Fabrikam Shipping&lt;/strong&gt; is much higher than in &lt;strong&gt;a-Order. &lt;/strong&gt;That is, we assume the frequency customers join and leave Fabrikam is higher. Thus, Fabrikam needs to automate this as much as possible.&amp;#160; &lt;br /&gt;          &lt;br /&gt;&lt;strong&gt;Note 3:            &lt;br /&gt;&lt;/strong&gt;Yes, there will be another post with Adatum’s side of the story. But I’m sure by now you’ll guess what’s in there. &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I’ll cover provisioning in the next post, as it has some interesting discussion points. But you can see some hints &lt;a href="http://blogs.msdn.com/eugeniop/archive/2009/03/16/azure-issuetracker-enterprise-simple-demos.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Feedback very much welcome.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Post-post announcement:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;We hope to have a some running code and much much polished chapters soon. We’ll probably upload those to a CodePlex site. Stay tuned!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9891204" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/members/eugeniop.aspx</uri></author><category term="Architecture" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Architecture/default.aspx" /><category term="Web Client" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Web+Client/default.aspx" /><category term="SaaS" scheme="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx" /><category term="Security" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Security/default.aspx" /><category term="Federated Identity" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Federated+Identity/default.aspx" /><category term="Claims" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Claims/default.aspx" /><category term="S+S" scheme="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S/default.aspx" /><category term=".NET Services" scheme="http://blogs.msdn.com/eugeniop/archive/tags/.NET+Services/default.aspx" /><category term="IssueTracker" scheme="http://blogs.msdn.com/eugeniop/archive/tags/IssueTracker/default.aspx" /><category term="Federation Provider" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Federation+Provider/default.aspx" /><category term="Identity Provider" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Identity+Provider/default.aspx" /></entry><entry><title>Exploring the Service Provider track – First station: Fabrikam Shipping – Part I (the scenario &amp; challenges)</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/eugeniop/archive/2009/09/01/exploring-the-service-provider-track-first-station-fabrikam-shipping-part-i-the-scenario-challenges.aspx" /><id>http://blogs.msdn.com/eugeniop/archive/2009/09/01/exploring-the-service-provider-track-first-station-fabrikam-shipping-part-i-the-scenario-challenges.aspx</id><published>2009-09-02T01:57:10Z</published><updated>2009-09-02T01:57:10Z</updated><content type="html">&lt;p&gt;Once again, thanks everybody that wrote us with reviews, feedback and suggestions! Please keep it coming! Also: we hope to have soon a CodePlex site where we can start sharing more. We are still working out some details. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;As usual, the Disclaimer:&lt;/strong&gt; this post and the next ones are early drafts to share with you the direction we are taking. They might (and I hope they will) change quite a bit in the &lt;a href="http://blogs.msdn.com/eugeniop/archive/2009/08/11/announcing-new-project-patterns-practices-claims-based-authentication-authorization-guide.aspx"&gt;actual Guide&lt;/a&gt;! We might end up not covering one of these scenarios in the book. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;An additional disclaimer for this post:&lt;/strong&gt; I wrote the whole scenario following the same template of the previous posts and it resulted in a very loooong article. So I divided it into two parts. This is Part I –&amp;gt; the scenario, the challenges and the requirements. Part II will be the solution.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;An Ode to Simplification: &lt;/strong&gt;there’s been quite some debate internally to this project as how to name things, especially “STS” vs. “Issuer” vs. “I-STS” vs. “R-STS” vs. “FP”, etc. Keith has started this on &lt;a href="http://www.pluralsight.com/community/blogs/keith/archive/2009/07/14/issuer-vs-sts.aspx"&gt;his blog&lt;/a&gt; some time ago. We definitely want to keep things &lt;u&gt;simple&lt;/u&gt;. As simple as possible, but not simpler. For now we have settled on the term “Issuer”, independently of the logical role it takes part in. In simpler words: what we used to call “Identity Provider” is now an “Issuer”. What we called a “Federation provider” is also an “Issuer”.&lt;/p&gt;  &lt;p&gt;Keith is writing a whole section of our book on “Jargon” and meaning of the different terms.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Credits:&lt;/strong&gt; this scenario is largely inspired on Vittorio’s PDC demo. See &lt;a href="http://blogs.msdn.com/vbertocci/archive/2009/06/16/announcing-fabrikamshipping-in-depth-semi-realistic-sample-for-geneva-framework.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ExploringtheServiceProvidertrackFirststa_880A/image_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ExploringtheServiceProvidertrackFirststa_880A/image_thumb_2.png" width="189" height="131" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;themes&lt;/strong&gt; for the first “Service Provider” scenario are:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Identity in a SaaS application &lt;/li&gt;    &lt;li&gt;Federation with multiple Customers &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;There’s 1 &lt;strong&gt;variations&lt;/strong&gt; in this scenario:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Automating the on-boarding process &lt;/li&gt; &lt;/ol&gt;  &lt;h2&gt;The Introduction&lt;/h2&gt;  &lt;p&gt;Fabrikam is a company that provides shipping services. As part of their offering, they have an application (&lt;strong&gt;Fabrikam Shipping&lt;/strong&gt; – &lt;strong&gt;FS&lt;/strong&gt;) that allows its customers to create new shipping orders, track them, etc. &lt;strong&gt;Fabrikam Shipping&lt;/strong&gt; is delivered as a service and runs in Fabrikam’s datacenter. Fabrikam Customers use a browser to access it.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;FS&lt;/strong&gt; is a fairly standard .NET web application: the web site is based on ASP.NET 3.5, the backend is SQL Server, etc. In the current version, users are required to authenticate using (guess what): username and password!!&lt;/p&gt;  &lt;p&gt;Fabrikam uses ASP.NET standard providers for authentication (Membership), authorization (Roles provider) and personalization (Profile).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Fabrikam Shipping&lt;/strong&gt; is also a &lt;em&gt;multi-tenant&lt;/em&gt; application: the same instance of the app is used by many customers.&lt;/p&gt;  &lt;p&gt;One sunny day in Seattle, they sign a great deal with a marquee Customer: Adatum Corp. And Adatum doesn’t like the username and password, because they are &lt;a href="http://blogs.msdn.com/eugeniop/archive/2009/08/19/welcome-to-the-enterprise-line-our-next-stop-will-be-station-1-sso-mind-the-gap.aspx"&gt;working hard to get rid of identity silos&lt;/a&gt;. They have 3 concerns:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Usability&lt;/strong&gt; for their employees. Lack of SSO, forgetting passwords, using sticky notes to remember them, etc. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Maintenance costs&lt;/strong&gt;: &lt;/li&gt;    &lt;ol&gt;     &lt;li&gt;What happens if an employee forgets his or her corporate password? He will probably call Adatum’s IT help desk. What happens if they use FS and they forget its password? who should they call? Consider this:&lt;/li&gt;      &lt;ol&gt;       &lt;li&gt;If they instruct employees to call &lt;strong&gt;Fabrikam’s&lt;/strong&gt; help desk, there would be a special procedure for IT guys, would probably require training, etc.&lt;/li&gt;        &lt;li&gt;If they instruct employees to call Fabrikam directly, they would impact #1 &lt;/li&gt;     &lt;/ol&gt;      &lt;li&gt;When a new employee is hired, he is already provisioned in Adatum’s systems. They don’t want special processes for &lt;strong&gt;FS.&lt;/strong&gt; &lt;/li&gt;   &lt;/ol&gt;    &lt;li&gt;&lt;strong&gt;Liability&lt;/strong&gt;:       &lt;ol&gt;       &lt;li&gt;Adatum has authentication policies that are there for a reason. They also want to retail control on who has access to what (regardless of where that is deployed) and &lt;strong&gt;FS&lt;/strong&gt; is no exception. &lt;/li&gt;        &lt;li&gt;If an employee leaves the company, he should &lt;u&gt;not&lt;/u&gt; have access to &lt;strong&gt;FS&lt;/strong&gt; anymore, effective immediately. If they used username / passwords, they could potentially access &lt;strong&gt;FS&lt;/strong&gt; from other places, even if they are not an Adatum employee anymore. &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Back to &lt;strong&gt;FS&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;Access Control to &lt;strong&gt;FS&lt;/strong&gt; is based on Roles. There are 3 roles:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;“&lt;strong&gt;Shipment Creators&lt;/strong&gt;”. Anyone in this role can create new orders. &lt;/li&gt;    &lt;li&gt;“&lt;strong&gt;Shipment Managers&lt;/strong&gt;”. Can create and modify existing shipment orders. &lt;/li&gt;    &lt;li&gt;“&lt;strong&gt;Administrators&lt;/strong&gt;”. Can configure the system (e.g. look and feel, shipping preferences, billing, etc). &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;FS&lt;/strong&gt; also keeps profile information for users, to avoid repeatedly entering common information and preferences. More concretely, &lt;strong&gt;FS&lt;/strong&gt; allows its users to store:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Package &lt;strong&gt;Sender&lt;/strong&gt; information (sender address) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Cost Center&lt;/strong&gt; information for billing &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Fabrikam can open the bills to its Customers by Cost Center. With this, 2 employees from Adatum belonging to 2 different departments would get 2 different bills.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Key Requirements.&lt;/h2&gt;  &lt;p&gt;Adatum wants &lt;strong&gt;SSO&lt;/strong&gt; for its employees.&lt;/p&gt;  &lt;p&gt;Fabrikam wants to &lt;strong&gt;avoid storing configuration information&lt;/strong&gt; about the shipment that can become stale later on (e.g. the package sender information).&lt;/p&gt;  &lt;p&gt;Fabrikam wants to &lt;strong&gt;bill customers by Cost Center&lt;/strong&gt; if they supply one. &lt;/p&gt;  &lt;p&gt;Some assumptions:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Adatum has an &lt;strong&gt;Issuer&lt;/strong&gt; (see &lt;a href="http://blogs.msdn.com/eugeniop/archive/2009/08/19/welcome-to-the-enterprise-line-our-next-stop-will-be-station-1-sso-mind-the-gap.aspx"&gt;Scenario #1&lt;/a&gt;) &lt;/li&gt;    &lt;li&gt;Fabrikam can change anything in their application&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;We’ll look at the solution space in the next post.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9890115" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/members/eugeniop.aspx</uri></author><category term="Web Client" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Web+Client/default.aspx" /><category term="SaaS" scheme="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx" /><category term="S+S_Run" scheme="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Run/default.aspx" /><category term="S+S_Build" scheme="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Build/default.aspx" /><category term="Security" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Security/default.aspx" /><category term="Federated Identity" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Federated+Identity/default.aspx" /><category term="Claims" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Claims/default.aspx" /><category term="Federation Provider" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Federation+Provider/default.aspx" /><category term="Identity Provider" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Identity+Provider/default.aspx" /></entry><entry><title>Next station: Federation between Adatum &amp; its Customers.</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/eugeniop/archive/2009/08/24/next-station-federation-between-adatum-its-customers.aspx" /><id>http://blogs.msdn.com/eugeniop/archive/2009/08/24/next-station-federation-between-adatum-its-customers.aspx</id><published>2009-08-25T03:07:59Z</published><updated>2009-08-25T03:07:59Z</updated><content type="html">&lt;p&gt;&lt;strong&gt;First things first&lt;/strong&gt;: thanks everybody who wrote me about the &lt;a href="http://blogs.msdn.com/eugeniop/archive/2009/08/19/welcome-to-the-enterprise-line-our-next-stop-will-be-station-1-sso-mind-the-gap.aspx"&gt;first scenario article&lt;/a&gt;. I got quite some e-mail on it with great suggestions to improve, but in general it seems it resonates well with. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; this post and the next ones are early drafts to share with you the direction we are taking. They might (and I hope they will) change quite a bit in the &lt;a href="http://blogs.msdn.com/eugeniop/archive/2009/08/11/announcing-new-project-patterns-practices-claims-based-authentication-authorization-guide.aspx"&gt;actual Guide&lt;/a&gt;! We might end up not covering one of these scenarios in the book. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/NextstationAdatumPartners_11A34/image_8.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/NextstationAdatumPartners_11A34/image_thumb_3.png" width="191" height="147" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;There was a little bit of a “down payment” in the first stage for Adatum, but hopefully even in the first chapter you could see the value of approach. For example: how easy it was to enable extranet access and how easy it was to move an app to Windows Azure.&lt;/p&gt;  &lt;p&gt;We’ll look now at a new scenario (probably chapter 2 of the Guide) and take further advantage of Adatum’s investments.&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;themes&lt;/strong&gt; for the second “enterprise” scenario are:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Federation with Partners &lt;/li&gt;    &lt;li&gt;Home realm discovery &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;There’s 1 &lt;strong&gt;variations&lt;/strong&gt; in this scenario:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Federating with a Partner with no Identity infrastructure (No IP) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;The introduction&lt;/h4&gt;  &lt;p&gt;The situation here is pretty straight forward. As explained before, Adatum uses the &lt;strong&gt;a-Orders&lt;/strong&gt; system to enter and process purchase orders for its Customers. (see &lt;a href="http://blogs.msdn.com/eugeniop/archive/2009/08/19/welcome-to-the-enterprise-line-our-next-stop-will-be-station-1-sso-mind-the-gap.aspx"&gt;scenario #1&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;Adatum has received many requests in the past from its customers to have direct access to the order tracking feature in &lt;strong&gt;a-Order.&lt;/strong&gt; They essentially want to be able to track the status of a new purchase order themselves. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;a-Order&lt;/strong&gt; is built on ASP.NET 3.5 and already relies on Adatum’s identity provider as described in the previous article.&lt;/p&gt;  &lt;p&gt;Litware is one of such Adatum’s Customers. Rick is an employee @ Litware that frequently submits orders with Adatum. He wants to track orders on a-Order, but he doesn’t want to enter special credentials to do so (yet another username/password). Again, he would like a seamless experience, including SSO.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;a-Order &lt;/strong&gt;is based on roles for access control. In order to query orders’ status, you need to present a claim of type &lt;strong&gt;&lt;em&gt;role&lt;/em&gt;&lt;/strong&gt;, with a value &lt;strong&gt;&lt;em&gt;“Order Tracker”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Key requirements. What do Adatum &amp;amp; Litware want?&lt;/h2&gt;  &lt;p&gt;Seamless access to &lt;strong&gt;a-Order&lt;/strong&gt; for Litware employees. Access control based on Customer and employee. We want Litware to just browse status of Litware orders, not somebody else’s.&lt;/p&gt;  &lt;p&gt;Since &lt;strong&gt;a-Order&lt;/strong&gt; (or more specifically the public pages to check order status) will be public, Adatum needs to know which IP the user is affiliated with (a.k.a. home realm discovery).&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;What is conceptual solution we propose?&lt;/h4&gt;  &lt;p&gt;The solution introduces a few new artifacts:&lt;/p&gt;  &lt;p&gt;1- Litware Identity Provider (which we assume it already exists and is compatible with Adatum’s. That is WS-Fed)&lt;/p&gt;  &lt;p&gt;2- A &lt;strong&gt;&lt;em&gt;Federation Provider&lt;/em&gt;&lt;/strong&gt; (FP) in Adatum (which is more of a logical role. It might be physically the same infrastructure the IP is deployed on). &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The FP in Adatum will maintain a trust relationship with Litware’s IP, and therefore it will trust and understand claims issued by it. In the initial configuration, the claims issued by Litware will just be the &lt;strong&gt;name&lt;/strong&gt; &lt;strong&gt;of the employee&lt;/strong&gt; and the &lt;strong&gt;company name&lt;/strong&gt; (Litware). &lt;/p&gt;  &lt;p&gt;In this (simplified) stage we assume &lt;strong&gt;a-Order&lt;/strong&gt; will just filter orders by company (sent as a claim) and by “owner” of the order (also submitted as a claim). Adatum will create a set of new web pages in &lt;strong&gt;a-Order&lt;/strong&gt; that will be published on the internet for Litware.&lt;/p&gt;  &lt;p&gt;However, &lt;strong&gt;a-Order &lt;/strong&gt;is built to understand &lt;em&gt;Adatum’s&lt;/em&gt; claims, not Litware’s. Moreover, &lt;strong&gt;a-Order&lt;/strong&gt; uses roles to authorize users on different functions, which might not be necessarily issued by Litware (all that Litware issues is the name of the company and the name of the employee submitting the query). Therefore, the FP will also have the responsibility of &lt;strong&gt;&lt;em&gt;mapping claims: &lt;/em&gt;&lt;/strong&gt;translating Litware’s into Adatum’s so the application understands them: &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/NextstationAdatumPartners_11A34/image_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/NextstationAdatumPartners_11A34/image_thumb_2.png" width="640" height="351" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Transformation rules in Adatum’s FP:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;There are 3 rules to define in the FP:&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="642"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="309"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;font size="4"&gt;Input&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="331"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;font size="4"&gt;Output&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="309"&gt;Claim Type: Employee Name&lt;/td&gt;        &lt;td valign="top" width="331"&gt;(Copy input claim)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="309"&gt;Claim Issuer: Litware&lt;/td&gt;        &lt;td valign="top" width="331"&gt;Claim Type: Role&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Claim Value: Order Tracker         &lt;br /&gt;Claim Type: Company&amp;#160;&amp;#160;&amp;#160; Claim Value: Company&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Using ADFS &lt;a href="http://technet.microsoft.com/en-us/library/dd807118(WS.10).aspx"&gt;Claim Rule Language&lt;/a&gt;: &lt;/p&gt;  &lt;p&gt;&lt;em&gt;exists([issuer == &amp;quot;Litware&amp;quot;]) =&amp;gt; issue(type = &amp;quot;Role&amp;quot;, value = &amp;quot;Order Tracker&amp;quot;);&lt;/em&gt; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;exists([issuer == &amp;quot;Litware&amp;quot;]) =&amp;gt; issue(type = &amp;quot;Company&amp;quot;, value = &amp;quot;Litware&amp;quot;);&lt;/em&gt; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;c:[type == http://Litware/Employee Name] =&amp;gt; issue(claim = c);&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;So, in our example, when &lt;strong&gt;&lt;em&gt;Rick@Litware&lt;/em&gt;&lt;/strong&gt; connects to &lt;strong&gt;a-Order&lt;/strong&gt; it will first obtain a claim with his name (“Rick”) from his IP, send them to Adatum’s FP where a new set of claims will be issued: &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Employee name\Rick –&amp;gt; &lt;strong&gt;Employee name\Rick&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Issuer: Litware –&amp;gt; &lt;strong&gt;Role\Order Tracker&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Issuer: Litware –&amp;gt; &lt;strong&gt;Company\Litware&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Notice that this mapping will allow &lt;strong&gt;&lt;em&gt;anyone&lt;/em&gt;&lt;/strong&gt; in Litware to track his or her orders, because any valid request will result in the issue of a role claims with “Order Tracker” value.&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="855"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="853"&gt;&lt;strong&gt;Caveats:&lt;/strong&gt;           &lt;br /&gt;          &lt;br /&gt;In a real app you would probably have finer grained access control rules. Like: “&lt;em&gt;only Litware employees working in the Purchasing department can track orders”&lt;/em&gt; or something like that. We’ll get there in a more advanced chapter. Be patient! This chapter’s purpose is to introduce a few concepts: claims mapping, FP, home realm discovery, etc.&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Notice a few things however: new Adatum Customers can easily be added by just setting up the trust relationship in the FP and by creating the right claims mappings. Again, there’s no changes in the app itself. We are also reusing most of the infrastructure we laid out before (like the IP). Thanks to WIF, dealing with claims in &lt;strong&gt;a-Order&lt;/strong&gt; is straight forward and because Adatum is using ADFS v2, creating the claims mapping is also fairly simple.&lt;/p&gt;  &lt;p&gt;Also important, notice that the claims Litware issues are about things &lt;em&gt;they are an authority on&lt;/em&gt;: the name of one of&lt;strong&gt;&lt;em&gt; their&lt;/em&gt;&lt;/strong&gt; employees and &lt;em&gt;&lt;strong&gt;their own&lt;/strong&gt;&lt;/em&gt; name. All “identity mismatches” are adjusted on the receiving endpoint (Adatum’s FP). We don’t feel it would be appropriate to request Litware to issue Adatum’s specific claims. Although it is technically possible, we would be contaminating Litware with alien concepts. Think maintenance, troubleshooting issues, etc.&amp;#160; &lt;/p&gt;  &lt;p&gt;Last thing in the solution: home realm discovery. &lt;strong&gt;a-Order&lt;/strong&gt; needs to know which IP to direct users to for authentication. If Rick@Litware opens his browser and types &lt;a href="http://www.adatum.com/ordertracking"&gt;http://www.adatum.com/ordertracking&lt;/a&gt; how does &lt;strong&gt;a-Order&lt;/strong&gt; know that Rick can be authenticated in Litware’s IP? There are several ways of doing this. Here’s a &lt;a href="http://blogs.msdn.com/vbertocci/archive/2009/04/08/one-does-not-simply-walk-into-mordor-or-home-realm-discovery-for-the-internet.aspx"&gt;great (long) article&lt;/a&gt;. A simple way would be to ask Rick which company he works for on the web page: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/NextstationAdatumPartners_11A34/image_14.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/NextstationAdatumPartners_11A34/image_thumb_6.png" width="640" height="470" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Or using the trick of a dedicated url: &lt;a href="http://www.adatum.com/ordertracking/litware"&gt;http://www.adatum.com/ordertracking/litware&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Variation 1: Adatum working with Customers with NO IP&lt;/h2&gt;  &lt;p&gt;This is interesting. What could we do if a Litware Customer doesn’t have an IP? Or maybe they have one, but they don’t want to create the trust relationship? Lets say Contoso is such a Customer (Note: &lt;a href="http://en.wikipedia.org/wiki/Contoso"&gt;Contoso&lt;/a&gt; is a truly agile company, isn’t it? :-)).&lt;/p&gt;  &lt;p&gt;One solution would be for Adatum&amp;#160; to deploy an IP for customers. This is essentially providing an “convenience IP” for those Customers with no such infrastructure. Interesting question to address is how you would build such IP: could you use ADFS (needs AD behind), or would you build your own (using WIF)? &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/NextstationAdatumPartners_11A34/image_10.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/NextstationAdatumPartners_11A34/image_thumb_4.png" width="640" height="439" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;There’s obviously no SSO for poor Jim@Contoso here. But we keep the architecture clean so when Contoso does have one available, migration is trivial.&lt;/p&gt;  &lt;p&gt;More importantly perhaps, &lt;strong&gt;a-Order &lt;/strong&gt;treats Contoso in the same way it treats any other Customer. There’re no exceptions.&amp;#160; &lt;/p&gt;  &lt;p&gt;Another option for this variation would be to rely on an external IP such as LiveID. But that’s something we have reserved for the ISV track in the Guide, so we would explore that sometime else.&lt;/p&gt;  &lt;p&gt;As usual, feedback is greatly welcome.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I changed the original claims mappings proposed for new ones suggested by colleague Peter M. Thompson. In his words:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;“I was thinking that the mapping rule should determine Company based on the Claim Issuer instead of the Company claim.&amp;#160; This reduces the risk of an information disclosure attack: a rogue Litware employee (with proper access) sets the Company claim = “Fabrikam” and now Litware employees can view Fabrikam’s orders.”&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Thanks Peter!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9883080" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/members/eugeniop.aspx</uri></author><category term="Architecture" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Architecture/default.aspx" /><category term="Federated Identity" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Federated+Identity/default.aspx" /><category term="Claims" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Claims/default.aspx" /><category term="Federation Provider" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Federation+Provider/default.aspx" /><category term="Identity Provider" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Identity+Provider/default.aspx" /></entry><entry><title>Welcome to the Enterprise Line, our next stop will be Station #1: “SSO”. Mind the gap.</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/eugeniop/archive/2009/08/19/welcome-to-the-enterprise-line-our-next-stop-will-be-station-1-sso-mind-the-gap.aspx" /><id>http://blogs.msdn.com/eugeniop/archive/2009/08/19/welcome-to-the-enterprise-line-our-next-stop-will-be-station-1-sso-mind-the-gap.aspx</id><published>2009-08-19T21:38:22Z</published><updated>2009-08-19T21:38:22Z</updated><content type="html">&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; this post and the next ones are early drafts to share with you the direction we are taking. They might (and I hope they will) change quite a bit in the actual Guide! We might end up not covering one of these scenarios in the book. These posts represent my ideas and not those of my employer, my colleagues, friends, enemies, associates, pets. Read this at your own risk, got it? :-).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/Station1SSO_FDFD/image_8.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/Station1SSO_FDFD/image_thumb_3.png" width="141" height="83" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;themes&lt;/strong&gt; for our first “enterprise” scenario are:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Intranet and extranet Web SSO &lt;/li&gt;    &lt;li&gt;Using claims for user profile information &lt;/li&gt;    &lt;li&gt;RBAC with Claims &lt;/li&gt;    &lt;li&gt;Single Sign Off &lt;/li&gt;    &lt;li&gt;Single company &lt;/li&gt;    &lt;li&gt;No federation &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;Variations&lt;/strong&gt; in the scenario:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Hosting on Windows Azure &lt;/li&gt; &lt;/ol&gt;  &lt;h2&gt;The introduction&lt;/h2&gt;  &lt;p&gt;Adatum is a medium company that uses Active Directory to authenticate its employees.&lt;/p&gt;  &lt;p&gt;John, is a salesman @ Adatum. He uses &lt;strong&gt;a-Order&lt;/strong&gt;, Adatum’s order processing system to enter, process, track and manage customer orders. John also uses &lt;strong&gt;a-Expense&lt;/strong&gt;, an expense tracking and reimbursement system to enter his business related expenses.&lt;/p&gt;  &lt;p&gt;Both are built with ASP.NET 3.5 and deployed in Adatum’s datacenter. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;a-Order&lt;/strong&gt; uses Windows integrated authentication. When John uses a Windows domain joined machine, &lt;strong&gt;a-Order&lt;/strong&gt; recognizes the same credentials he used for login on his PC. He’s never prompted for username and password. &lt;strong&gt;a-Order&lt;/strong&gt; user roles are stored in the company’s Active Directory.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;a-Expense&lt;/strong&gt; on the other hand uses a custom authentication, authorization and user profile information. All these data is stored in custom tables in a SQL Server database. John is normally prompted for username and password whenever he uses this application.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;a-Expense&lt;/strong&gt; AuthZ rules are tied to a user name and it’s deeply integrated into the application business logic at all levels (e.g. inside pages, code, stored procedures, etc). It is also something that belongs to the app itself. That is, the roles and information stored in &lt;strong&gt;a-Expense&lt;/strong&gt; doesn’t exist anywhere else in Adatum.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;a-Expense&lt;/strong&gt; was initially used by a handful of employees and over the years, as Adatum grew, it was used by more and more employees. Maintaining the user database (e.g new hires, retiring users, etc) is a cumbersome process and it is not well integrated into Adatum’s &lt;em&gt;existing&lt;/em&gt; processes for managing employee accounts. &lt;/p&gt;  &lt;p&gt;Some information about the employees using &lt;strong&gt;a-Expense&lt;/strong&gt; &lt;em&gt;does&lt;/em&gt; exist somewhere else and needs to the replicated. For example: the “Cost Center” an employee belongs to, is already stored in the corporate AD. Updating Cost Center information in a-Expense is a difficult, error prone process as it is completely manual (each employee has to update its own Cost Center in his profile). Other user preferences (e.g. the reimbursement method: check, direct deposit, cash, etc) is something private to &lt;strong&gt;a-Expense&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;John as most sales people in Adatum are mobile, often on the road visiting customers. Adatum wants to offer all sales staff the ability to use both applications from anywhere they are, not just its Corpnet (e.g. working from Home, connecting through WiFi access points, etc).&lt;/p&gt;  &lt;p&gt;Adatum has many other departmental applications like &lt;strong&gt;a-Expense&lt;/strong&gt; (e.g. &lt;strong&gt;a-Vacation&lt;/strong&gt;, &lt;strong&gt;a-Facilities&lt;/strong&gt;) that are not part of core corporate IT (e.g they have their own user, role and profile databases). Some of these applications are Windows based and others are not. Small applications like this appear all the time.&lt;/p&gt;  &lt;p&gt;These apps might not be critical in isolation, but together they add up.&lt;/p&gt;  &lt;p&gt;Adatum IT Dept is considering moving some of these applications to “the cloud” to decrease CAPEX and simplify management. &lt;/p&gt;  &lt;p&gt;Adatum has also received requests from partners to access their systems. Especially &lt;strong&gt;a-Order&lt;/strong&gt;. Adatum’s customers want to be able to track their orders on Adatum’s system. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/Station1SSO_FDFD/image6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/Station1SSO_FDFD/image6_thumb.png" width="621" height="480" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;What does Adatum want?&lt;/h2&gt;  &lt;p&gt;Adatum wants to avoid keeping a username/password just for a-Expense. They want their employees to &lt;strong&gt;use the same credentials&lt;/strong&gt; they use to log on on their desktops. &lt;/p&gt;  &lt;p&gt;Adatum also wants a &lt;strong&gt;standards based&lt;/strong&gt; solution that works with multiple platforms and vendors.&lt;/p&gt;  &lt;p&gt;Adatum also wants to &lt;strong&gt;eliminate common user profile&lt;/strong&gt; information that needs to be replicated and maintained between multiple repositories (e.g. the Cost Center) where possible&lt;/p&gt;  &lt;p&gt;Adatum wants secure internet access for its employees to their systems.&lt;/p&gt;  &lt;p&gt;Adatum has big plans in the future. They want to &lt;strong&gt;lay the foundation for more advanced scenarios&lt;/strong&gt; (like providing access to their Customers to other systems, like &lt;strong&gt;a-Order&lt;/strong&gt;). &lt;/p&gt;  &lt;p&gt;They also want an architecture that would allow them to easily&lt;strong&gt; move some applications to “the cloud”&lt;/strong&gt; (Windows Azure in particular), and decrease management and CAPEX costs.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;What is conceptual solution we propose?&lt;/h2&gt;  &lt;p&gt;We’ll do some forward looking in this scenario, and we’ll make some decisions considering the things we want to achieve in the future &lt;/p&gt;  &lt;p&gt;We’ll solve these in multiple steps. &lt;/p&gt;  &lt;p&gt;First we’ll introduce an Identity Provider (IP) in the organization. In general we want applications to trust this IP to authenticate its users. In Adatum, an “employee” is a “corporate asset”. No application should keep a custom employee database. It might not be realistic to move all applications initially to use an IP, but for now we just care about &lt;strong&gt;a-Expense&lt;/strong&gt; and &lt;strong&gt;a-Order&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;This IP will authenticate users and also return common, company wide user information such as the name, the e-mail, the employee cost center, the office number, his phone, etc. &lt;/p&gt;  &lt;p&gt;This information is already in AD. We are not requiring (or even suggesting) to change the schema of AD for the needs of any specific application. We are just reusing what’s in there already.&lt;/p&gt;  &lt;p&gt;Therefore, some applications will still keep other user profile information that will not be moved to the corporate IP. We want to avoid polluting AD with app specific attributes, we want to keep management decentralized, etc. &lt;/p&gt;  &lt;p&gt;We’ll modify &lt;strong&gt;a-Order&lt;/strong&gt; to use &lt;em&gt;IClaimsPrincipal&lt;/em&gt; as opposed to &lt;em&gt;IPrincipal&lt;/em&gt; and simply return the AD groups as claims. This is in preparation for opening &lt;strong&gt;a-Order&lt;/strong&gt; to external Partners of Adatum later. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;a-Expense&lt;/strong&gt; will continue to use its own application specific roles database associated with the users, but will discontinue to use the user database as authentication is moved to the IP. &lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="841"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="839"&gt;&lt;em&gt;&lt;strong&gt;Aha! I got you!              &lt;br /&gt;&lt;/strong&gt;            &lt;br /&gt;At this point, the smart reader could say: what a minute! why all this? Shouldn’t I just enable Windows Authentication in a-Expense? That will give me SSO and it is much much simpler than deploying an IP, issuing claims, configuring the application, etc.             &lt;br /&gt;            &lt;br /&gt;The answer is yes! If that’s all you need, by all means do that. But consider these:&amp;#160; &lt;br /&gt;            &lt;br /&gt;&lt;strong&gt;- &lt;/strong&gt;This is our first step in a longer journey. We are simplifying things and slightly (we hope) over-complicating others in preparation for other requirements. An investment so to say. (e.g. Customers using &lt;strong&gt;a-Order&lt;/strong&gt; later on)&amp;#160; &lt;br /&gt;            &lt;br /&gt;&lt;strong&gt;-&lt;/strong&gt; Even now, we want more than just SSO. We want also the ability to move a-Expense to Windows Azure for instance. Windows Authentication is not an option there.&lt;/em&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;In this first stage then we propose:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/Station1SSO_FDFD/image11.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/Station1SSO_FDFD/image11_thumb.png" width="640" height="438" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Adatum wanted to enable John to work from home. One option is to simply publish the apps and the IP on the internet (probably with some firewall rules + proxy). Because there’s no Kerberos authentication happening, the IP will prompt John for Username &amp;amp; Password (the same he uses to login into Adatum network), then it will issue the same token with John claims, and finally he will be redirected to the app:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/Station1SSO_FDFD/image_10.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/Station1SSO_FDFD/image_thumb.png" width="640" height="457" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Adatum c&lt;em&gt;ould&lt;/em&gt; choose to add other authentication factors when connecting from the internet (smart card, pin, etc). But whatever they do, the applications don’t care! They are still receiving the same set of claims. Here you see one advantage of factoring out authentication from the application.&lt;/p&gt;  &lt;p&gt;The last stage is moving &lt;strong&gt;a-Expense&lt;/strong&gt; to Windows Azure. Can we do that? Sure!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/Station1SSO_FDFD/image5.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/Station1SSO_FDFD/image5_thumb.png" width="640" height="444" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Isn’t this beautiful?&lt;/p&gt;  &lt;p&gt;Feedback is very much welcome of course.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: fixed images size.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9875856" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/members/eugeniop.aspx</uri></author><category term="Architecture" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Architecture/default.aspx" /><category term="Security" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Security/default.aspx" /><category term="Federated Identity" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Federated+Identity/default.aspx" /><category term="Claims" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Claims/default.aspx" /><category term="Windows Azure" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Windows+Azure/default.aspx" /></entry><entry><title>Claims based Authentication &amp; Authorization Guide – The design of the book</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/eugeniop/archive/2009/08/12/claims-based-authentication-authorization-guide-the-design-of-the-book.aspx" /><id>http://blogs.msdn.com/eugeniop/archive/2009/08/12/claims-based-authentication-authorization-guide-the-design-of-the-book.aspx</id><published>2009-08-13T03:36:16Z</published><updated>2009-08-13T03:36:16Z</updated><content type="html">&lt;p&gt;As I mentioned in my &lt;a href="http://blogs.msdn.com/eugeniop/archive/2009/08/11/announcing-new-project-patterns-practices-claims-based-authentication-authorization-guide.aspx"&gt;previous post&lt;/a&gt;, we are going to use a “case study” approach in this book in which we will be presenting a series of concrete scenarios, each one will introduce some very specific requirements. Then we will be showing and discussing possible solutions in that context. &lt;/p&gt;  &lt;p&gt;The intent is that each chapter would be more or less self contained, but with references to other sections of the book as needed. The content model for each chapter is roughly this:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ClaimsbasedAuthenticationAuthorizationGu_F78A/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ClaimsbasedAuthenticationAuthorizationGu_F78A/image_thumb.png" width="640" height="420" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;So in the solution space, we will go all the way from design to a complete running example. &lt;/p&gt;  &lt;p&gt;There’s some implicit roadmap hinted in the “tube map” for all scenarios. Our intention is to create “learning paths”, so you can choose what to read and in which sequence based on your specific needs. Like taking one train and then a connection somewhere else. Kind of Cortazar’s “&lt;a href="http://en.wikipedia.org/wiki/Rayuela"&gt;Hopscotch&lt;/a&gt;”, but without the magic realism. :-)&lt;/p&gt;  &lt;p&gt;Before all chapters, there will be an introduction for those who are new to the subject. That’s one of &lt;a href="http://www.pluralsight.com/community/blogs/keith/archive/2009/08/12/what-i-m-up-to-p-amp-p-guidance-for-federated-identity.aspx"&gt;Keith’s&lt;/a&gt; key contributions to this project. This&lt;em&gt; “Zen of Federated Identity”&lt;/em&gt; will introduce terminology (e.g. what is a &lt;strong&gt;claim&lt;/strong&gt;?, what is a &lt;strong&gt;relaying party&lt;/strong&gt;?, what is an &lt;strong&gt;identity provider&lt;/strong&gt;? an &lt;strong&gt;STS&lt;/strong&gt;? a &lt;strong&gt;security token&lt;/strong&gt;?), explain the basic mechanics of a claims based architecture, its benefits, show some key advantages, etc. In essence we hope it will convince you to keep reading :-). Or help you to quickly make a decision whether this is for you or not. We are all kind of busy to read something not very useful, right? &lt;/p&gt;  &lt;p&gt;Apart from sharing with you general information for the project, I plan to discuss quite some detail of each chapter here, so…stay tuned!&lt;/p&gt;  &lt;p&gt;My next post we’ll take us to station #1: “&lt;strong&gt;&lt;em&gt;SSO&lt;/em&gt;&lt;/strong&gt;”, where we’ll set the foundation for everything else.&lt;/p&gt;  &lt;p&gt;As usual, we’d &lt;em&gt;&lt;u&gt;love&lt;/u&gt;&lt;/em&gt; your feedback.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Update: &lt;/strong&gt;fixed graphic.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9867409" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/members/eugeniop.aspx</uri></author></entry><entry><title>Announcing new project – patterns &amp; practices - Claims based Authentication &amp; Authorization Guide</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/eugeniop/archive/2009/08/11/announcing-new-project-patterns-practices-claims-based-authentication-authorization-guide.aspx" /><id>http://blogs.msdn.com/eugeniop/archive/2009/08/11/announcing-new-project-patterns-practices-claims-based-authentication-authorization-guide.aspx</id><published>2009-08-11T23:02:22Z</published><updated>2009-08-11T23:02:22Z</updated><content type="html">&lt;p&gt;For the next couple of months I’ll be working on a new project here at &lt;a href="http://msdn.microsoft.com/practices"&gt;patterns &amp;amp; practices&lt;/a&gt;, developing a new guide for claims based authentication and authorization.&lt;/p&gt;  &lt;p&gt;I’m personally very happy to be working on this project, for many reasons. I believe frameworks like “Geneva” (previously known as “Zermatt”, now Windows Identity Foundation), products like “Geneva Server” (now ADFS) are great platform additions to enable a new set of scenarios.&lt;/p&gt;  &lt;p&gt;I realize that SSO, Federated Identity and Claims are not &lt;u&gt;&lt;em&gt;new&lt;/em&gt;&lt;/u&gt;. It’s just that we have much better tools and higher abstractions to implement these scenarios much more easily than ever.&lt;/p&gt;  &lt;p&gt;I also feel privileged to work with such a great team. I’ll be sitting on giants shoulders: &lt;a href="http://www.leastprivilege.com/"&gt;Dominick Baier&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/vbertocci/"&gt;Vittorio Bertocci&lt;/a&gt;, &lt;a href="http://www.pluralsight.com/community/blogs/keith/default.aspx"&gt;Keith Brown&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/dphill/default.aspx"&gt;David Hill&lt;/a&gt; and &lt;a href="http://blogs.southworks.net/mwoloski/"&gt;Matias Woloski&lt;/a&gt;. Many others are joining as advisors and reviewers.&lt;/p&gt;  &lt;p&gt;As it is customary now in the patterns &amp;amp; practices team, we will be publishing our content often and very early. I’ll post details here soon.&lt;/p&gt;  &lt;p&gt;We also want to try a few new things in this project. In this guide we want to be very focused on the &lt;b&gt;&lt;i&gt;practices&lt;/i&gt;&lt;/b&gt; rather than on the “theory”, the “principles” or “philosophy” of claims based security.&lt;/p&gt;  &lt;p&gt;We want to have very concrete scenarios, with a high fidelity of what happens out there in the real world. Almost a “case study” approach in which we weave a story across the book that takes the reader into more ambitious requirements as he proceeds. &lt;/p&gt;  &lt;p&gt;With each chapter, we will introduce more complex solutions to address increasingly more ambitious requirements. &lt;/p&gt;  &lt;p&gt;The current backlog for the scenarios we want to cover is illustrated below. Each “station” is a core scenario. Some will have small variations (like Azure hosting in the first one).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/AnnouncingnewprojectpatternspracticesCla_E870/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/AnnouncingnewprojectpatternspracticesCla_E870/image_thumb.png" width="640" height="454" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The two lines (yellow and light blue) refer to the two perspectives we plan to include: that of someone &lt;em&gt;consuming&lt;/em&gt; software (the blue), and that of some &lt;em&gt;building&lt;/em&gt; software (the yellow).&lt;/p&gt;  &lt;p&gt;Stay tuned!&lt;/p&gt;  &lt;p&gt;Eugenio&lt;/p&gt;  &lt;p&gt;Update: fixed image size.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9864880" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/members/eugeniop.aspx</uri></author><category term="SaaS" scheme="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx" /><category term="Federated Identity" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Federated+Identity/default.aspx" /><category term="Claims" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Claims/default.aspx" /><category term="S+S" scheme="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S/default.aspx" /><category term="SSO" scheme="http://blogs.msdn.com/eugeniop/archive/tags/SSO/default.aspx" /><category term="Azure" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Azure/default.aspx" /><category term="Federation Provider" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Federation+Provider/default.aspx" /><category term="WebSSO" scheme="http://blogs.msdn.com/eugeniop/archive/tags/WebSSO/default.aspx" /><category term="Claims Guide" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Claims+Guide/default.aspx" /><category term="Geneva" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Geneva/default.aspx" /></entry><entry><title>First experiments with (new) SQL Data Services</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/eugeniop/archive/2009/06/12/first-experiments-with-new-sql-data-services.aspx" /><id>http://blogs.msdn.com/eugeniop/archive/2009/06/12/first-experiments-with-new-sql-data-services.aspx</id><published>2009-06-12T22:03:29Z</published><updated>2009-06-12T22:03:29Z</updated><content type="html">&lt;p&gt;Last week I got my new login to the new &lt;a href="http://www.microsoft.com/azure/data.mspx"&gt;SQL Data Services&lt;/a&gt;. As a reminder for all readers:&lt;/p&gt;  &lt;h5&gt;&lt;em&gt;SDS accelerates its plans to offer relational capabilities &lt;/em&gt;&lt;/h5&gt;  &lt;p&gt;&lt;em&gt;May 11, 2009 - Based on customer feedback, SDS has accelerated its plans and will be offering true relational capabilities through SQL Server’s existing network protocol, Tabular Data Stream (TDS) and existing query language Transact-SQL (T-SQL). This will provide customers direct access to the familiar relational model, T-SQL programming language and the existing development and management tools, while continuing to deliver on our key value props of fault tolerance, high availability, friction free provisioning and pay as you grow scaling. For more information, see the &lt;/em&gt;&lt;a href="http://www.microsoft.com/azure/data.mspx"&gt;&lt;em&gt;SDS product site&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and the &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd557595.aspx"&gt;&lt;em&gt;MSDN Library&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;What I’ve done? After some initial “hello world-ish” tests, I wanted to try something more interesting so I decided to port &lt;a href="http://www.codeplex.com/azureissuetracker"&gt;IssueTracker&lt;/a&gt; into SDS. &lt;/p&gt;  &lt;p&gt;As you know, &lt;strong&gt;&lt;em&gt;IssueTracker&lt;/em&gt;&lt;/strong&gt; was originally designed for SDS’ previous ACE model (Authority, Container, Entity), so my first task was to re-write the data access layer to use SQL Server. &lt;/p&gt;  &lt;p&gt;One of my goals in this experiment was to test SDS “&lt;a href="http://en.wikipedia.org/wiki/Impedance_matching"&gt;impedance match&lt;/a&gt;” with on-premises SQL Server. Also, I wanted to develop independently of the availability of SDS. Not that SDS is unreliable, but currently it is available only inside Microsoft’s corporate network. I didn’t want to VPN into corpnet for this when working from home.&lt;/p&gt;  &lt;p&gt;So I chose to develop exclusively against my local SQL Express instance first and then make a switch to the real SDS.&lt;/p&gt;  &lt;p&gt;Fortunately, the app was designed with a couple of layers that isolated the persistence details, so writing the new data tier was a fairly mechanical process. &lt;/p&gt;  &lt;p&gt;This diagram roughly captures the architecture:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.codeplex.com/azureissuetracker"&gt;&lt;/a&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/FirstexperimentswithSQLDataServices_7AB8/clip_image001_2.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/FirstexperimentswithSQLDataServices_7AB8/clip_image001_thumb.gif" width="3" height="3" /&gt;&lt;/a&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/FirstexperimentswithSQLDataServices_7AB8/clip_image002_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/FirstexperimentswithSQLDataServices_7AB8/clip_image002_thumb.jpg" width="629" height="478" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The repository classes implement a common interface the app uses, the Model is just a collection of rather simple C# objects with no knowledge of the database being used. The Mappers are responsible for the transformations between the application model and the entities that do have knowledge of the database.&lt;/p&gt;  &lt;p&gt;In the diagram, classes marked with &lt;font color="#ff0000" size="4"&gt;&lt;strong&gt;*&lt;/strong&gt;&lt;/font&gt; are new, the numbers indicate variability points in the implementation, meaning that I can switch between one implementation and the other. Because I used LINQ to SQL, the types in the box labeled as “SQL Model” were generated     &lt;br /&gt;automatically by the LINQ to SQL designer.&lt;/p&gt;  &lt;p&gt;When my unit tests compiled again, I switched the connection string to point from the “.\SQLEXPRESS” to the SDS instance in our network and…it worked! First attempt!&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/FirstexperimentswithSQLDataServices_7AB8/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/FirstexperimentswithSQLDataServices_7AB8/image_thumb.png" width="404" height="411" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Overall, it was a rather painless and pleasant experience. Of course the data model in the app is simple and I’m not using any advanced queries or any sophisticated features in SQL yet.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Things missing and Possible next steps:&lt;/h2&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;The original implementation had 2 requirements that leveraged features in SDS previous ACE model: &lt;/p&gt;  &lt;p&gt;1- &lt;b&gt;Multi-tenant isolation&lt;/b&gt;: achieved through containers. Each tenant got its own container.&lt;/p&gt;  &lt;p&gt;2- &lt;b&gt;Schema flexibility&lt;/b&gt;: tenants could customize the application, extending the schema of some core entities. Flexible entities made this very easy, because they are essentially property bags.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;For #1, I considered two options:&lt;/p&gt;  &lt;p&gt;1- Partitioning by tenant&lt;/p&gt;  &lt;p&gt;2- Do not partition at all and have all tenants on the same database (single-instance, multi-tenant)&lt;/p&gt;  &lt;p&gt;The first option is fairly straight forward. Each tenant gets its own database that is created at provisioning time. The “tenant id” is part of the calling context in the application, so I dynamically connect to each database as needed. Two advantages of this approach: there’s high isolation between tenants (no data from one can leak into another), and the application code is simpler, because from the data perspective, the application is “single-tenant”.&lt;/p&gt;  &lt;p&gt;I haven’t implemented the extensibility feature yet, but I’m planning on reusing some techniques we did some research on &lt;a href="http://msdn.microsoft.com/en-us/library/aa479086.aspx"&gt;in the past&lt;/a&gt;, probably through extension tables.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;There’re other interesting areas for research such as:&lt;/p&gt;  &lt;p&gt;1- &lt;b&gt;Strategies for partitioning&lt;/b&gt;: in discussions with &lt;a href="http://dunnry.com/blog/"&gt;Ryan&lt;/a&gt;, he suggested I should consider more sophisticated ways of partitioning the information: by tenant, by tenant + project, etc. and I agree this would be interesting .&lt;/p&gt;  &lt;p&gt;2- &lt;b&gt;Unit of Work&lt;/b&gt;: currently I’m simply reusing the original ACE implicit &lt;strong&gt;&lt;em&gt;UoW&lt;/em&gt;&lt;/strong&gt; that comes with each interaction. This is, each time you called Create, Delete or Update on SDS, the operation was completed in the context of a unit of work. You could not logically group multiple operation (say, 2 creates and 1 delete). This is suboptimal with the SQL implementation, because the new SDS supports transactions and I would like to leverage that.&lt;/p&gt;  &lt;p&gt;3- &lt;b&gt;Performance and scalability issues&lt;/b&gt;: I haven’t spent any time looking at the application’s “chattiness” with the database that might lead to degraded performance, or any other data access optimizations. This is a whole area in itself, but not very different from “regular” application development. The only exception perhaps is that, in theory at least, the app and the database can be hosted in different datacenters (say the app in Amazon and the data in SDS). I’m not sure that would be a good idea anyway, probably not for this scenario. If the app was hosted in Windows Azure &lt;em&gt;and&lt;/em&gt; used SDS, then they would be &lt;em&gt;close&lt;/em&gt; in terms of network distance (low latency &amp;amp; high bandwidth).&amp;#160; &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9737543" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/members/eugeniop.aspx</uri></author><category term="SaaS" scheme="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx" /><category term="S+S_Build" scheme="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Build/default.aspx" /><category term="SQL Server Data Services" scheme="http://blogs.msdn.com/eugeniop/archive/tags/SQL+Server+Data+Services/default.aspx" /><category term="Azure Services Platform" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Azure+Services+Platform/default.aspx" /><category term="Azure" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Azure/default.aspx" /><category term="SDS" scheme="http://blogs.msdn.com/eugeniop/archive/tags/SDS/default.aspx" /></entry><entry><title>Windows Azure 101 – Primitives and Application Patterns – Playing Mendeleyev</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/eugeniop/archive/2009/03/18/windows-azure-101-primitives-and-application-patterns-playing-mendeleyev.aspx" /><id>http://blogs.msdn.com/eugeniop/archive/2009/03/18/windows-azure-101-primitives-and-application-patterns-playing-mendeleyev.aspx</id><published>2009-03-19T02:42:44Z</published><updated>2009-03-19T02:42:44Z</updated><content type="html">&lt;p&gt;Windows Azure’s primitives are very simple, but as in many other things, the power comes from the combination of these simpler primitives to create more complex things. &lt;/p&gt;  &lt;p&gt;Look around and see how many things can be assembled from a little more than &lt;a href="http://en.wikipedia.org/wiki/Periodic_table"&gt;100 “simple” elements&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;In Windows Azure,&amp;#160; there are essentially 2 types of building blocks: code hosts blocks and persistent bocks&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/WindowsAzure101PrimitivesandApplicationP_EAAC/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/WindowsAzure101PrimitivesandApplicationP_EAAC/image_thumb_1.png" width="650" height="373" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The code hosts run (your) code, the persistence blocks store data.&lt;/p&gt;  &lt;p&gt;There are 2 types of Code Hosts:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Interactive&lt;/strong&gt;: ASP.NET &amp;amp; WCF &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Non-interactive&lt;/strong&gt;: Worker&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The &lt;strong&gt;&lt;em&gt;interactive&lt;/em&gt;&lt;/strong&gt; building blocks, whether it is a human initiated interaction (ASP.NET) or a programmatic interaction (WCF), is what is referred in Windows Azure terminology as a &lt;strong&gt;“Web Role”&lt;/strong&gt;.&amp;#160; The web role is specialized in “request – response” types of interactions. A user or a program submits a requests, the request is received, analyzed and processed, then a response is sent back. The goal is to process a lot of these concurrent requests and to keep the time between a request and a response as small as possible.&lt;/p&gt;  &lt;p&gt;The non-interactive building block is known in Windows Azure as “&lt;strong&gt;Worker Role&lt;/strong&gt;”, and it is the classic background processor.&amp;#160; &lt;/p&gt;  &lt;p&gt;There are 3 persistence building blocks. All of them store information, but have specialized functions:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Table&lt;/strong&gt;: stores records with properties&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Blobs&lt;/strong&gt;: stores “things” with associated metadata&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Queue&lt;/strong&gt;: stores strings with FIFO semantics for retrieval&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;That’s it.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;So let’s explore what you could do with this.&lt;/p&gt;  &lt;p&gt;A relatively simple web site, like a simple blog engine would be this:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/WindowsAzure101PrimitivesandApplicationP_EAAC/image_8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/WindowsAzure101PrimitivesandApplicationP_EAAC/image_thumb_3.png" width="596" height="427" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The front end web role is the app itself: pages, views, controllers, (whatever you use for the logic of the app). All operations (reads/writes) against the store where posts, comments and images would be stored are &lt;u&gt;synchronous&lt;/u&gt;.&lt;/p&gt;  &lt;p&gt;Adding one block will give you an RSS feed (e.g. using Syndication APIs in WCF):&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/WindowsAzure101PrimitivesandApplicationP_EAAC/image_10.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/WindowsAzure101PrimitivesandApplicationP_EAAC/image_thumb_4.png" width="611" height="456" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;And now you can independently manage (e.g. scale) your web viewers from those using an aggregator. &lt;/p&gt;  &lt;p&gt;Now let’s imagine you’d like to create a heat map similar to the one you see in my blog, showing where are your readers are located. One possible way of solving this calling a components in the RSS or Web nodes providing as input the IP address of the requestor. The component would then lookup somewhere the country or region associated with the IP address and add one to the counter of that specific country/region. This computation will take penalize the request/response for something that the reader is not necessarily interested in. Besides the lookup IP/country might depend on an external call to another service, with even further penalties. &lt;/p&gt;  &lt;p&gt;A better solution would be to offload these to another (background) process that con compute the information with minimal cost to the original request:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/WindowsAzure101PrimitivesandApplicationP_EAAC/image_12.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/WindowsAzure101PrimitivesandApplicationP_EAAC/image_thumb_5.png" width="612" height="478" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Now the front end nodes will only pay the cost of writing to a queue. The lookup/conversion/heat map generation is done in the background by the worker. You can imagine dynamically creating new instances of the worker if the queue gets too long. Anything that can be postponed for a while, can be pushed to an asynchronous worker for processing (e.g. reporting, analysis, etc)&lt;/p&gt;  &lt;p&gt;These are just 6 elements in Microsoft’s larger &lt;em&gt;table of elements&lt;/em&gt; for cloud development (.NET Services, SQL Data Services, etc).&lt;/p&gt;  &lt;p&gt;These patterns are of course well known (and old :-)), but are proven. Windows Azure gives us a nice way of implementing them plus a way of managing them once they are deployed.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ef17d6a7-b199-4430-8fac-612e760e47e1" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Azure" rel="tag"&gt;Azure&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9488478" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/members/eugeniop.aspx</uri></author><category term="Architecture" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Architecture/default.aspx" /><category term="SaaS" scheme="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx" /><category term="S+S_Build" scheme="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Build/default.aspx" /><category term="S+S" scheme="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S/default.aspx" /><category term="Azure Services Platform" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Azure+Services+Platform/default.aspx" /><category term="Azure" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Azure/default.aspx" /><category term="Windows Azure" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Windows+Azure/default.aspx" /></entry><entry><title>Azure IssueTracker Enterprise - Simple Demos</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/eugeniop/archive/2009/03/16/azure-issuetracker-enterprise-simple-demos.aspx" /><id>http://blogs.msdn.com/eugeniop/archive/2009/03/16/azure-issuetracker-enterprise-simple-demos.aspx</id><published>2009-03-16T23:09:35Z</published><updated>2009-03-16T23:09:35Z</updated><content type="html">&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Provisioning IssueTracker Enterprise:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Highlights:&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;There’s no direct interaction with Access Control Service. IssueTracker uses ACS API to create the scopes, rules and the issuer (Contoso). &lt;/li&gt;    &lt;li&gt;The provisioning form captures all the required information to setup the trust relationship between Access Controls Service and the tenant (certificate, etc) &lt;/li&gt; &lt;/ul&gt; &lt;iframe style="width: 825px; height: 617px" src="http://silverlight.services.live.com/invoke/5721/Provisioning%20IT%20Enterprise/iframe.html" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Tenant (Contoso_Enterprise) uses IssueTracker Enterprise from a Smart Client (Active Profile):&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Highlights:&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Tenant STS is configured:      &lt;ul&gt;       &lt;li&gt;Tenant name that must be the same as the name used in the provisioning form. &lt;/li&gt;        &lt;li&gt;Signing certificate thumbprint: this is used internally to retrieve the certificate form the store. Thumbprint can be obtained from the certificate properties. &lt;/li&gt;        &lt;li&gt;&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt; &lt;iframe style="width: 825px; height: 617px" src="http://silverlight.services.live.com/invoke/5721/IT%20Using%20Service/iframe.html" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Tenant Manages IssueTracker Enterprise from PowerShell scripts:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Highlights:&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;PowerShell CmdLets are registered &lt;/li&gt;    &lt;li&gt;Management User disables the application (passing a parameter to define reason) &lt;/li&gt;    &lt;li&gt;Business User attempts to use the system, gets an error message (with the above reason) &lt;/li&gt;    &lt;li&gt;Management user enables application back &lt;/li&gt; &lt;/ul&gt; &lt;iframe style="width: 825px; height: 617px" src="http://silverlight.services.live.com/invoke/5721/IT%20Management/iframe.html" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Tenant changes STS configuration issuing different Claims:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Highlights:&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Tenant changes one of the output claims to “Program Manager”. In the real implementation this could be a user moving from group in Active Directory to another &lt;/li&gt;    &lt;li&gt;System rejects access as the claim is not recognized as input to any rule in ACS &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;iframe style="width: 825px; height: 617px" src="http://silverlight.services.live.com/invoke/5721/Changing%20STS%20claims/iframe.html" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9481891" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/members/eugeniop.aspx</uri></author><category term="SaaS" scheme="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx" /><category term="S+S_Build" scheme="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Build/default.aspx" /><category term="Federated Identity" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Federated+Identity/default.aspx" /><category term="Claims" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Claims/default.aspx" /><category term="S+S" scheme="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S/default.aspx" /><category term="Azure Services Platform" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Azure+Services+Platform/default.aspx" /><category term="Access Control Service" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Access+Control+Service/default.aspx" /><category term=".NET Services" scheme="http://blogs.msdn.com/eugeniop/archive/tags/.NET+Services/default.aspx" /><category term="IssueTracker" scheme="http://blogs.msdn.com/eugeniop/archive/tags/IssueTracker/default.aspx" /></entry><entry><title>Architecting Cloud Application for the Enterprise – Part V – Management</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/eugeniop/archive/2009/03/12/architecting-cloud-application-for-the-enterprise-part-v-management.aspx" /><id>http://blogs.msdn.com/eugeniop/archive/2009/03/12/architecting-cloud-application-for-the-enterprise-part-v-management.aspx</id><published>2009-03-13T01:41:26Z</published><updated>2009-03-13T01:41:26Z</updated><content type="html">&lt;p&gt;Having solved the identity issue, the &lt;strong&gt;&lt;em&gt;SuperCloudySoftware&lt;/em&gt;&lt;/strong&gt; team focuses then on the management requirements raised in the meeting with &lt;strong&gt;&lt;em&gt;VeryBigCorp&lt;/em&gt;&lt;/strong&gt; CIO.&lt;/p&gt;  &lt;p&gt;To recap, they want to:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Be able to to monitor &lt;strong&gt;&lt;em&gt;IssueTracker&lt;/em&gt;&lt;/strong&gt; from their existing infrastructure, that happens to be System Center Operations Manager (SCOM) and eventually author new rules to correlate &lt;strong&gt;&lt;em&gt;IssueTracker&lt;/em&gt;&lt;/strong&gt; specific events with other events that are generated inside their boundaries. &lt;/li&gt;    &lt;li&gt;Be able to logically disable and enable &lt;strong&gt;&lt;em&gt;IssueTracker&lt;/em&gt;&lt;/strong&gt; for users from SCOM and &lt;/li&gt;    &lt;li&gt;Be able to change claim mappings for authorization purposes from within standard tools (e.g. they don’t want to use a new web portal but would be happy with an &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Management_Console"&gt;MMC Snap-In&lt;/a&gt;) &lt;/li&gt;    &lt;li&gt;As with their other (business) users, they want seamless integration for their IT staff: no login, no pop-up, etc. If an authenticated user of their network is authorized to do monitoring, he /she should be able to do it without any additional checks. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;John and his team realize that the Web dashboard for monitoring is not enough for these requirements. It is still a good thing for their smaller Customers that don’t care too much about it anyway except when there are problems, but it will not work for &lt;strong&gt;&lt;em&gt;VeryBigCorp&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;The team realizes that they need to do a couple of things:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Instrument the application to gather information and to provide some level of control (e.g. enable/disable) &lt;/li&gt;    &lt;li&gt;Create an external API for management &lt;/li&gt;    &lt;li&gt;Create common clients for that API (e.g. PowerShell CmdLets, SCOM Management pack, etc) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Of course securing the API is relatively easy now that they have a claims based architecture as described in the previous post and can federate with consumers. They can leverage the same rules for granting access to this API: for example, &lt;strong&gt;&lt;em&gt;VeryBigCorp&lt;/em&gt;&lt;/strong&gt; would just need to define what claims will be mapped to the “Enable Application” claim that &lt;strong&gt;&lt;em&gt;IssueTracker&lt;/em&gt;&lt;/strong&gt; will expect.&lt;/p&gt;  &lt;p&gt;The high level solution is illustrated below:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="mgmt-it" border="0" alt="mgmt-it" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationfortheEnterp_7F6E/mgmt-it_1.png" width="646" height="519" /&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;To simplify things even further, &lt;strong&gt;&lt;em&gt;SuperCloudySoftware&lt;/em&gt;&lt;/strong&gt; pre-configures the client library and the clients. So, just after provisioning, a client library will be automatically generated for the Customer with all the necessary information: more specifically, the information to setup WS-TRUST between &lt;strong&gt;&lt;em&gt;IssueTracker&lt;/em&gt;&lt;/strong&gt;, Access Control Service and the company (STS address, certificate, etc):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationfortheEnterp_7F6E/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationfortheEnterp_7F6E/image_thumb.png" width="664" height="516" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;VeryBigCorp&lt;/em&gt;&lt;/strong&gt; IT staff can then download the (pre-configured) tools from IssueTracker web site and they will “just work” as long as the logged in user provides the right credentials:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationfortheEnterp_7F6E/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationfortheEnterp_7F6E/image_thumb_1.png" width="676" height="370" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationfortheEnterp_7F6E/image_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationfortheEnterp_7F6E/image_thumb_2.png" width="680" height="441" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Notice there’s no need to specify who the tenant is, where the IssueTracker Management endpoint is, etc. All of that is built into the client library that the CmdLet uses.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;SuperCloudySoftware&lt;/strong&gt; &lt;/em&gt;strategy is to supply 3 experiences: MMC, PowerShell CmdLets and a SCOM Management Pack, but if there’s a customer with special needs (e.g. they are using &lt;a href="http://www-01.ibm.com/software/tivoli/"&gt;Tivoli&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/OpenView"&gt;HP OpenView&lt;/a&gt;), they also provide an API (secured with WS-TRUST).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Next article we will dive deeper into some implementation details of both the security and management aspects. As mentioned before, all of these is available in the download &lt;a href="http://azureissuetracker.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24479"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9472297" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/members/eugeniop.aspx</uri></author><category term="SaaS" scheme="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx" /><category term="S+S_Run" scheme="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Run/default.aspx" /><category term="Federated Identity" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Federated+Identity/default.aspx" /><category term="Claims" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Claims/default.aspx" /><category term="S+S" scheme="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S/default.aspx" /><category term="Azure Services Platform" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Azure+Services+Platform/default.aspx" /><category term="Access Control Service" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Access+Control+Service/default.aspx" /><category term=".NET Services" scheme="http://blogs.msdn.com/eugeniop/archive/tags/.NET+Services/default.aspx" /><category term="IssueTracker" scheme="http://blogs.msdn.com/eugeniop/archive/tags/IssueTracker/default.aspx" /><category term="SaaS Management" scheme="http://blogs.msdn.com/eugeniop/archive/tags/SaaS+Management/default.aspx" /></entry><entry><title>Architecting Cloud Applications for the Enterprise – Part IV - SuperCloudySoftware sketches IssueTracker Enterprise Edition</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/eugeniop/archive/2009/03/09/architecting-cloud-applications-for-the-enterprise-part-iv-supercloudysoftware-sketches-issuetracker-enterprise-edition.aspx" /><id>http://blogs.msdn.com/eugeniop/archive/2009/03/09/architecting-cloud-applications-for-the-enterprise-part-iv-supercloudysoftware-sketches-issuetracker-enterprise-edition.aspx</id><published>2009-03-10T06:15:00Z</published><updated>2009-03-10T06:15:00Z</updated><content type="html">&lt;P&gt;In the &lt;A href="http://blogs.msdn.com/eugeniop/archive/2008/12/10/architecting-cloud-applications-for-the-enterprise-part-iii-supercloudysoftware-meets-verybigcorp-cio.aspx" mce_href="http://blogs.msdn.com/eugeniop/archive/2008/12/10/architecting-cloud-applications-for-the-enterprise-part-iii-supercloudysoftware-meets-verybigcorp-cio.aspx"&gt;previous article&lt;/A&gt;, we explored the challenges of building services for an enterprise, illustrating those through a dialogue between &lt;STRONG&gt;&lt;EM&gt;VeryBigCorp &lt;/EM&gt;&lt;/STRONG&gt;CIO and a team from &lt;EM&gt;&lt;STRONG&gt;SuperCloudySoftware&lt;/STRONG&gt;&lt;/EM&gt;. &lt;/P&gt;
&lt;P&gt;VBC requirements can be summarized as:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Identity integration (including Single Sign On and management of access policies) &lt;/LI&gt;
&lt;LI&gt;Management integration (ability to monitor and act on &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; from within VBC’s management environment) &lt;/LI&gt;
&lt;LI&gt;Application integration (ability to call &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; programmatically from other VBC’s applications) &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Let’s start with the beginning and explore the Authentication and Authorization aspects of IssueTracker.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;In its current release, &lt;STRONG&gt;&lt;EM&gt;IssueTracker’s&lt;/EM&gt;&lt;/STRONG&gt; approach for user AuthN and AuthZ is straightforward username + passwords, and a user profile associated with it. This works ok for very small organizations (or even bigger organizations with a few people using it) but breaks quickly for companies like &lt;STRONG&gt;&lt;EM&gt;VeryBigCorp&lt;/EM&gt;&lt;/STRONG&gt; for many reasons: &lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;People forget passwords and &lt;STRONG&gt;&lt;EM&gt;VeryBigCorp’s&lt;/EM&gt;&lt;/STRONG&gt; help desks would add a new task of resetting credentials. &lt;/LI&gt;
&lt;LI&gt;People need to be retrained into new procedures. (&lt;EM&gt;“For IssueTracker password reset, please press 23”&lt;/EM&gt;) &lt;/LI&gt;
&lt;LI&gt;People get fired from &lt;STRONG&gt;&lt;EM&gt;VeryBigCorp’s&lt;/EM&gt;&lt;/STRONG&gt; and can the log on to the system from their homes and “creatively edit” the company’s information. &lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;EM&gt;VeryBigCorp’s&lt;/EM&gt;&lt;/STRONG&gt; wants a seamless experience for their users (no pop-up, no login, nothing). It should just work. &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Besides, &lt;STRONG&gt;&lt;EM&gt;VeryBigCorp&lt;/EM&gt;&lt;/STRONG&gt; already has a user repository (maybe more than one?) and they already have problems provisioning new users on it (them) when they hire new employees, etc. Adding a new repository for just 1 app is not going to happen.&lt;/P&gt;
&lt;P&gt;The team @ &lt;STRONG&gt;&lt;EM&gt;SuperCloudySoftware&lt;/EM&gt;&lt;/STRONG&gt; considers one option:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Synchronizing VBC existing user repository with &lt;STRONG&gt;&lt;EM&gt;IssueTracker’s&lt;/EM&gt;&lt;/STRONG&gt;. This certainly can be done but is too ad-hoc, complex, cumbersome, error prone, non-standard. it wouldn’t work with other Customers and &lt;STRONG&gt;&lt;EM&gt;SuperCloudySoftware&lt;/EM&gt;&lt;/STRONG&gt; would much rather build one solution for all, and not treat each case as an exception.&amp;nbsp; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;A better solution is to use claims and federated identity. This allows the service to rely on somebody else that it trusts to authenticate users (&lt;STRONG&gt;&lt;EM&gt;VeryBigCorp&lt;/EM&gt;&lt;/STRONG&gt;) and deal with an abstracted set of facts (claims) about the requestor that are used for authorization. &lt;/P&gt;
&lt;P&gt;Fortunately, the team went to Microsoft PDC last year and learnt about some technologies that would be very appropriate for these scenario: &lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=1E3C3EFC-E980-4895-9095-86E51C1CD9D8&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=1E3C3EFC-E980-4895-9095-86E51C1CD9D8&amp;amp;displaylang=en"&gt;Geneva Framework&lt;/A&gt; and &lt;A href="http://www.microsoft.com/azure/accesscontrol.mspx" mce_href="http://www.microsoft.com/azure/accesscontrol.mspx"&gt;.NET Services Access Control Service&lt;/A&gt; and do all the heavy lifting of setting up federation and dealing with claims:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_E81F/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_E81F/image_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_E81F/image_thumb.png" width=582 height=397 mce_src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_E81F/image_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;In this architecture the web site (&lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt;) defines a set of claims that are required to access its resources, for example perform certain operation such as "Create a Project”, “Delete an Issue”, etc. Whoever brings those claims will be allowed to access the resource (e.g. complete the operation). If you don’t provide the claims, then you would get “access denied”. Claims can be obtained from a&amp;nbsp; trusted issuer (&lt;STRONG&gt;&lt;EM&gt;VeryBigCorp’s&lt;/EM&gt;&lt;/STRONG&gt; identity provider such as Active Directory).&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;Simple analogy:&lt;/STRONG&gt; This is like going to a bar and providing the bartender with a valid ID that will attest to your age. The resource is the beer, the claim is your age, the issuer is the government department that gave you the ID, the rule is “beer is fine if you are &amp;gt; 21 years old” (in the US)&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Now, each company will attest to different facts about its users (like their name, which organization they work for, who is their manager, where they are located, etc.). These facts are irrelevant for &lt;EM&gt;&lt;STRONG&gt;IssueTracker&lt;/STRONG&gt;&lt;/EM&gt;, so some sort of mapping the original claims to those understood by &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; needs to happen.&lt;/P&gt;
&lt;P&gt;The translator allows &lt;STRONG&gt;&lt;EM&gt;VeryBigCorp&lt;/EM&gt;&lt;/STRONG&gt; to define rules of access. For example, they might say:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;“Any employee who is a Program Manager will be able to Create New Projects in IssueTracker” &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;This implies taking the “being a member of the Program Manager group” claim and transform it into a “Create New Project” claim. Other organizations might have completely different rules and &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; wouldn’t care as long as what it receives is something it understands.&lt;/P&gt;
&lt;P&gt;That’s what Access Control Service is used for: convert claims from different issuers into others.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;Following the bar analogy:&lt;/STRONG&gt; the resource is the beer, the claim is your age, but instead of the bartender having to verify all sorts of different issuers of claims (passports, driving licenses, birth certificates, identity cards, etc), you simply put a guy in the door that verifies that and then gives you a colored bracelet. The rule for the bartender becomes: “anyone with a colored bracelet can have beer”. How you obtain it is someone else’s responsibility (hint: bribe the guy in the door :-) ).&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;This solution is actually very scalable and has a nice bonus: Access Control Service is already federated with a very popular identity provider like &lt;A href="http://dev.live.com/liveid/" mce_href="http://dev.live.com/liveid/"&gt;LiveID&lt;/A&gt;. So, by implementing this, &lt;STRONG&gt;&lt;EM&gt;SuperCloudySoftware&lt;/EM&gt;&lt;/STRONG&gt; has a LiveID enabled website for its smaller Customers for “free”.&lt;/P&gt;
&lt;P&gt;The other nice thing is that this works with both Web Sites and Web Services (the so called “passive” and “active” profiles). So If &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; exposes an API instead of a human readable web page, the same principles (and almost the same implementation) applies.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Note:&lt;/U&gt;&lt;/STRONG&gt; &lt;EM&gt;&lt;STRONG&gt;IssueTracker&lt;/STRONG&gt; &lt;/EM&gt;has an API because of requirement #2 of &lt;STRONG&gt;&lt;EM&gt;veryBigCorp&lt;/EM&gt;&lt;/STRONG&gt; –&amp;gt; being able to integrate with other systems.&lt;/P&gt;
&lt;P&gt;This is exactly what &lt;STRONG&gt;&lt;EM&gt;SuperCloudySoftware&lt;/EM&gt;&lt;/STRONG&gt; implemented and if you are curious about the details, then download the code and check for yourself!&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://azureissuetracker.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=22138" mce_href="http://azureissuetracker.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=22138"&gt;IssueTracker Standard Edition&lt;/A&gt; (with federation with LiveID) &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://azureissuetracker.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24479" mce_href="http://azureissuetracker.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24479"&gt;IssueTracker Enterprise Edition&lt;/A&gt; (with federation with a custom identity provider) &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;I’ll expand on the implementation details in the next articles.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;P.S.:&lt;/U&gt;&lt;/STRONG&gt; if you want to learn more about claims, federation and identity “theory” in general&amp;nbsp; (including the alcoholic analogy :-)) then you should bookmark and read from &lt;EM&gt;il Maestro&lt;/EM&gt; &lt;A href="http://blogs.msdn.com/vbertocci/" mce_href="http://blogs.msdn.com/vbertocci/"&gt;Vittorio Bertocci&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Updates: fixed a few typos.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9468609" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/members/eugeniop.aspx</uri></author><category term="Architecture" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Architecture/default.aspx" /><category term="SaaS" scheme="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx" /><category term="S+S_Build" scheme="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Build/default.aspx" /><category term="Federated Identity" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Federated+Identity/default.aspx" /><category term="Claims" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Claims/default.aspx" /><category term="S+S" scheme="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S/default.aspx" /><category term="Azure Services Platform" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Azure+Services+Platform/default.aspx" /><category term="Access Control Service" scheme="http://blogs.msdn.com/eugeniop/archive/tags/Access+Control+Service/default.aspx" /><category term=".NET Services" scheme="http://blogs.msdn.com/eugeniop/archive/tags/.NET+Services/default.aspx" /><category term="IssueTracker" scheme="http://blogs.msdn.com/eugeniop/archive/tags/IssueTracker/default.aspx" /></entry><entry><title>The need for “standards for application logic” in PaaS. Really?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/eugeniop/archive/2009/02/24/the-need-for-standards-for-application-logic-in-paas-really.aspx" /><id>http://blogs.msdn.com/eugeniop/archive/2009/02/24/the-need-for-standards-for-application-logic-in-paas-really.aspx</id><published>2009-02-25T03:37:41Z</published><updated>2009-02-25T03:37:41Z</updated><content type="html">&lt;p&gt;In his &lt;a href="http://blogs.zdnet.com/SAAS/?p=668"&gt;latest post&lt;/a&gt; on Coghead’s demise, &lt;a href="http://blogs.zdnet.com/SAAS"&gt;Phil&lt;/a&gt; argues that:&lt;/p&gt;  &lt;p&gt;“&lt;em&gt;What this highlights is the lack of any standard for transferring not just data but application logic between such platforms.”&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;My argument is that those standards already exist and are widely adopted:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;“Standards for capturing application logic already exist: Java &amp;amp; .NET (and COBOL). Coghead &amp;quot;mistake&amp;quot; was to try to develop their own development platform from scratch, instead of leveraging what already existed and provide value on top of that.”&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Phil replied that:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt; &lt;dt&gt;&lt;em&gt;“Doesn't solve the problem &lt;/em&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;But you still can't *transfer* logic from one development platform to another, say from COBOL to Java, or from Java to .NET, without completely rewriting it. What I'm advocating would be helpful to people developing on established platforms too. My point is that it's essential in a PaaS context.”&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;My response was getting too long, so I decided to post here instead.&lt;/p&gt; &lt;/dt&gt;&lt;dt&gt;   &lt;p&gt;Sure, having an abstract model for your app logic and then deciding implementation details would be great. I buy the &lt;em&gt;attractiveness&lt;/em&gt; of such an approach and I understand why people would like this. (I’m sure it will sound familiar to my friends @ &lt;a href="http://www.genexus.com/portal/hgxpp001.aspx?2"&gt;ArTech&lt;/a&gt;), but there’re problems too (e.g. “minimum common denominator” syndrome, lack of finer grained control, not being able to take advantage of the latest features in a given implementation, etc).&lt;/p&gt;    &lt;p&gt;However, I certainly &lt;u&gt;don’t &lt;/u&gt;think it is *&lt;b&gt;essential*&lt;/b&gt; for PaaS. Nice, desirable, yes. Essential, I don’t think so.&lt;/p&gt;    &lt;p&gt;Phil says that &lt;em&gt;“With PaaS, the lack of such mechanisms could become a huge barrier to adoption as customers become fearful of which platform might be next to switch off the lights.”&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;True to some extent, but there are ways of mitigating this *&lt;b&gt;today&lt;/b&gt;* without waiting for the &lt;em&gt;uber-cross-platform-cross-cloud-ocean-boiling &lt;/em&gt;model.&lt;/p&gt;    &lt;p&gt;Coghead could have chosen to offer app hosting for .NET and/or Java based apps (or PHP or COBOL for that matter), and attract 10,000’s of ISVs that have already bet on those platforms. Instead, they created a &lt;strong&gt;*new*&lt;/strong&gt; platform from scratch. They not only required everybody to learn their new abstractions, their new language, their new tools, etc. Those by themselves are strong adoption barriers, not impossible to overcome, but quite tough.&lt;/p&gt; &lt;/dt&gt;&lt;dt&gt;   &lt;p&gt;But they also asked everybody to bet their operational business on them (the “aaS in “PaaS”), because nobody had access to their runtime except them. The lethality to the business viability is in the combination of these two factors. Platforms are catalysts, and as a consequence, they usually don’t do anything useful by themselves. They need to be bootstrapped.&amp;#160;&amp;#160; &lt;/p&gt; &lt;/dt&gt;&lt;dt&gt;   &lt;p&gt;So, if Coghead had chosen say .NET (I’m biased of course :-)) as their underlying programming model, barriers of entry would have been much lower for many reasons. Among them:&lt;/p&gt; &lt;/dt&gt;&lt;dt&gt;   &lt;ul&gt;     &lt;li&gt;ISV would have had less cost in creating a “Coghead” solution (they would have reused all their existing skills, tools, knowledge, etc).&lt;/li&gt;      &lt;li&gt;The cost of re-targeting their app would have been lower in the case the hoster goes out of business. Some work would have been required anyway, but not as high as with the current model. &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;In this hypothetical scenario, instead of parsing the XML files, they would have a bunch of .NET (C# or VB.NET) assemblies.&lt;/p&gt;    &lt;p&gt;Some PaaS offerings, such as &lt;a href="http://apprenda.com/"&gt;Apprenda&lt;/a&gt;, have taken this path. In my opinion a much healthier and pragmatic path. &lt;/p&gt; &lt;/dt&gt;&lt;dt&gt;   &lt;p&gt;The other obvious way of addressing these risks is with a “reverse escrow” from PaaS providers to their ISVs: giving out the runtime to the ISVs if they go out of business. Worse case, ISVs would buy time to port the application into another runtime. (like .NET).&lt;/p&gt; &lt;/dt&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9443383" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/members/eugeniop.aspx</uri></author><category term="SaaS" scheme="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx" /><category term="S+S_Run" scheme="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Run/default.aspx" /><category term="S+S_Build" scheme="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Build/default.aspx" /><category term="PaaS" scheme="http://blogs.msdn.com/eugeniop/archive/tags/PaaS/default.aspx" /></entry></feed>