<?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">Preparing to be wrong</subtitle><id>http://blogs.msdn.com/b/eugeniop/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/b/eugeniop/atom.aspx" /><generator uri="http://telligent.com" version="5.6.583.19431">Telligent Community 5.6.583.19431 (Build: 5.6.583.19431)</generator><updated>2010-07-04T22:56:41Z</updated><entry><title>p&amp;p roadmap for the next few months</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2011/11/01/p-amp-p-roadmap-for-the-next-few-months.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2011/11/01/p-amp-p-roadmap-for-the-next-few-months.aspx</id><published>2011-11-01T18:33:00Z</published><updated>2011-11-01T18:33:00Z</updated><content type="html">&lt;p&gt;&lt;strong&gt;Update: &lt;/strong&gt;the same roadmap is now &lt;a href="http://msdn.microsoft.com/en-us/practices/bb232643"&gt;published on MSDN&lt;/a&gt;. I adjusted the slide below to make timelines clearer. No other changes.&lt;/p&gt;  &lt;p&gt;We wanted to share with you all the projects we are either working on or we have identified as potential areas of investment in the current Fiscal Year (that started past July and ends next June 2012). The red dashed line is roughly the present. At this time, any project that has not been started (e.g. all the Windows 8 related projects and CQRS) is just a placeholder with just some rough ideas on their scope. We don’t know yet what that content will look like, how it will be packaged (a book? code? samples? all of the above?, etc.). But as usual, we’d very much welcome your input! All our projects end up on MSDN eventually, but have a corresponding community site on CodePlex where we post drafts and early versions.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://msdn.microsoft.com/en-us/practices/bb190332.PnP-FY12-Roadmap-2011-11-2(l=en-us).png" width="640" height="480" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Some extra information:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;1. &lt;/b&gt;&lt;b&gt;Developing Immersive Windows 8 Windows Applications &lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;Focus:&lt;/b&gt; Provides guidance on building end-to-end immersive Win8 applications using the HTML5/ JavaScript,and XAML and C++/C# application stacks. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Candidate App Scenario:&lt;/b&gt; B2C/Connected-consumer. Windows 8 Metro-Style applications. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Candidate Sub-Scenarios:&lt;/b&gt; Application Design &amp;amp; Structure; UI – Controls, Form Factor Considerations, Interactivity, Touch &amp;amp; Gestures, Styling, Transitions, Animation, Media, Data Visualization, Rendering, Effects; Data Binding; UI Patterns (such as MVVM); Navigation; Sensor and local device access; Security – inside/outside the sandbox; Interacting with remote services; Accessing data; Local data storage and caching; Testing, debugging and performance tuning; Deployment, updates, and versioning; App Marketplace, leveraging legacy components. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Note:&lt;/b&gt; This project’s start and end will likely be impacted by Windows 8 ship dates. &lt;/li&gt; &lt;/ul&gt;    &lt;p&gt;&lt;b&gt;2. &lt;/b&gt;&lt;b&gt;Enterprise Library 6 Platform Re-alignment and Integration Pack for Windows8&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;Focus:&lt;/b&gt; EntLib provides guidance and re-usable code blocks for addressing cross-cutting-concerns such as caching, data access, cross-tier validation, etc. Over the years, many scenarios supported by EntLib are now better supported by the .NET platform. This project is focused on ensuring EntLib’s close alignment to the current platform (.NET 4.5) with a goal of reducing EntLib’s footprint by leveraging platform capabilities and improvements. EntLib will remain focused on filling gaps in order to support real-world end-to-end enterprise application development. In order to ensure this, the project will focus on desktop client applications as a core scenario and will deliver an Integration Pack for Windows 8. This will provide specific guidance on building enterprise LOB desktop applications for Windows 8. We may also update the EntLib Silverlight integration pack during this project to support Silverlight 5.0. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Candidate App Scenario:&lt;/b&gt; LOB/Enterprise Windows 8 desktop applications. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Candidate Sub-Scenarios:&lt;/b&gt; Configuration management; Logging, diagnostics and telemetry; Exception Handling; Data access and caching; Cross-tier data validation; Security &amp;amp; Cryptography; &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Note:&lt;/b&gt; This project’s start and end will likely be impacted by Windows 8 ship dates. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;3. &lt;/b&gt;&lt;b&gt;Developing Modular MVVM Applications using WPF and Silverlight (Prism 4.1)&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;Focus:&lt;/b&gt; An update to our existing content that provides guidance on building end-to-end applications using the managed code WPF and Silverlight 5.0 application stacks. We will likely update Prism to 4.1 to cover the RTM release of Silverlight 5.0 and the beta release of WPF 4.5. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Candidate App Scenario:&lt;/b&gt; Modular LOB/Enterprise Windows desktop applications. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Candidate Sub-Scenarios&lt;/b&gt;: As outlined in the existing Prism documentation – UI design patterns (MVVM); UI composition; Modularity; Navigation; Dependency Injection, Loosely coupled inter-component communication; Deployment and updates, etc. An interesting component of this project will explore its relationship with Win8 and harvesting patterns demonstrated in Prism that apply to Win8 apps. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Note:&lt;/b&gt; This project’s start and end will likely be impacted by Windows 8 ship dates. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;4. &lt;/b&gt;&lt;b&gt;Developing Windows Phone 7 Applications using Silverlight – 2&lt;sup&gt;nd&lt;/sup&gt; Edition Update – Phase I &amp;amp; Phase II&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;Focus:&lt;/b&gt; Phase I is an update to our existing guidance on the development of Silverlight-based Windows Phone 7 applications. This update is to showcase the new capabilities in the WP7 Mango release and to address feedback on the first edition. The Prism MVVM library for the Phone will also be update for any platform updates. Phase II is focused on making WP7 more testable. We intend to produce some artifacts to help write simpler unit tests (e.g. adapters &amp;amp; mocks) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Project community site&lt;/strong&gt;: &lt;a href="http://wp7guide.codeplex.com"&gt;http://wp7guide.codeplex.com&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Candidate App Scenario:&lt;/b&gt; Cloud-connected consumer oriented mobile phone applications.&lt;b&gt;&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Candidate Sub-Scenarios: &lt;/b&gt;Application Design &amp;amp; Structure; UI Design – Form Factor Considerations, Interactivity, Touch &amp;amp; Gestures, Styling, Transitions, Animation, Media; Tomb-stoning and Navigation; Push notifications; Implementing MVVM; Sensor and local device access; Security; Interacting with cloud-based services; Accessing data; Local data storage, caching and synchronization; Testing; Debugging and performance tuning; Deployment, Updates, Versioning; Marketplace. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;5. Test Guidance for Continuous Integration with VSTS&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Focus&lt;/strong&gt;:&amp;#160; Provide guidance to Test Engineers on common testing scenarios using Visual Studio Team System and Team Foundation Server. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Candidate scenarios&lt;/strong&gt;:&amp;#160; Setting up continuous test integration infrastructure. Building test harnesses. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;6. &lt;/b&gt;&lt;b&gt;Developing Mobile Web Applications&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;Focus:&lt;/b&gt; Provides guidance on the development of interactive web applications that specifically target HTML5 capable mobile phone devices such as WP7 Mango with IE9. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Candidate App Scenario:&lt;/b&gt; Cloud-connected consumer oriented mobile phone web applications. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Candidate Sub-Scenarios:&lt;/b&gt; Application Design &amp;amp; Structure, using ASP.NET MVC/Razor; Client-side JavaScript and jQuery development; Leveraging HTML5/CSS3/SVG capabilities; Browser and device capability detection; Integration and re-use within ‘full’ web applications; UI Design – Form Factor Considerations, Interactivity, Touch &amp;amp; Gestures, Styling, Transitions, Animation, Media; Navigation; Sensor and local device access; Security; Interacting with remote services; Accessing data; Local data storage and caching; Debugging and performance tuning; Versioning. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;7. &lt;/b&gt;&lt;b&gt;Enterprise Library Integration Pack for Windows Azure&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;Focus:&lt;/b&gt; Provides guidance on auto-scaling and building resilient applications on Windows Azure. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Project community site&lt;/strong&gt;: &lt;a href="http://entlib.codeplex.com"&gt;http://entlib.codeplex.com&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Public backlog&lt;/strong&gt;: &lt;a href="http://entlib.uservoice.com"&gt;http://entlib.uservoice.com&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Candidate App Scenario&lt;/b&gt;: LOB/Enterprise/Consumer facing cloud applications.&lt;b&gt;&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Candidate Sub-Scenarios:&lt;/b&gt; Scaling Windows Azure roles based on predefined criteria (e.g. schedule, resource metrics and other KPIs). Increase tolerance to connection failures to different resources (e.g. databases, storage, external dependencies, etc.). Add automatic retries in case of failures. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;8. &lt;/b&gt;&lt;b&gt;CQRS Guide&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;Focus:&lt;/b&gt; Provides guidance on building application using the &lt;a href="http://martinfowler.com/bliki/CQRS.html"&gt;Command Query Response Segregation pattern&lt;/a&gt;. Many customers have expressed interest in this approach to building apps. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Candidate App Scenario&lt;/b&gt;: LOB/Enterprise/Consumer facing cloud applications.&lt;b&gt;&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Candidate Sub-Scenarios:&lt;/b&gt; Applications with high scalability and/or high performance requirements. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;9. &lt;/b&gt;&lt;b&gt;Migrating/Developing Applications to/for the Cloud – 2nd Edition Update&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;Focus:&lt;/b&gt; An update to our existing guidance on the migration and development of applications for Windows Azure – updated is to showcase the new capabilities of the Windows Azure platform and to address feedback on the first edition. This project has been already completed and content is in production now for MSDN release. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Project community site&lt;/strong&gt;: &lt;a href="http://wag.codeplex.com"&gt;http://wag.codeplex.com&lt;/a&gt; (will be on MSDN very soon) &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Candidate App Scenario:&lt;/b&gt; Continued focus on LOB/Enterprise/Consumer focused cloud applications.&lt;b&gt;&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Candidate Sub-Scenarios: &lt;/b&gt;Using&lt;b&gt; &lt;/b&gt;Web and Worker Roles;&lt;b&gt; &lt;/b&gt;Using&lt;b&gt; &lt;/b&gt;Queues &amp;amp; SQL Azure, Table, Drive/Page Blob Storage; Claims-based authentication and authorization; Migration of existing application assets to the cloud; Designing a new application for the cloud; Using upgrade and fault domains; Single and Multi-Tenant application design; Deployment, Update and Versioning; Testing, Debugging and Performance Tuning; Tools for cloud development. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;10. &lt;/b&gt;&lt;b&gt;Hybrid Cloud Application Guidance&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;Focus&lt;/b&gt;: Provides guidance on developing hybrid (applications that have on-premises and cloud components). This project demonstrates use of platform features such as Windows Azure Connect, Windows Azure VM Roles and Windows Azure Service Bus. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Project community site&lt;/strong&gt;: &lt;a href="http://wag.codeplex.com"&gt;http://wag.codeplex.com&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Candidate App Scenario:&lt;/b&gt; Integration of on-premises and cloud based Enterprise/LOB applications.&lt;b&gt;&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Candidate Sub-Scenarios:&lt;/b&gt; Implementation patterns for data, workflow and identity integration; taking advantage of cloud specific capabilities such as geo-location, dynamic scalability, etc. &lt;/li&gt; &lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10232174" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="patterns &amp;amp; practices" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/patterns+_2600_amp_3B00_+practices/" /><category term="roadmap" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/roadmap/" /></entry><entry><title>Claims Identity Guide–Hands On Labs</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2011/06/13/claims-identity-guide-hands-on-labs.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2011/06/13/claims-identity-guide-hands-on-labs.aspx</id><published>2011-06-13T16:53:36Z</published><updated>2011-06-13T16:53:36Z</updated><content type="html">&lt;p&gt;Training content based on our guides has been as popular as the content itself. You can now &lt;a href="http://claimsid.codeplex.com/releases/view/68061"&gt;download the “Release Candidate” for labs&lt;/a&gt; corresponding to the &lt;a href="http://claimsid.codeplex.com/releases/view/67606"&gt;new guide&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The labs are more than just a mirror of the guide. We took the opportunity of adding a few things that complement and extend what is explained in the book. A notable addition is using ADFS v2. &lt;/p&gt;  &lt;p&gt;The guide talks a lot about “using ADFS for a production environment”, but all samples shipped use a “simulated STS” (this is of course than for convenience and to minimize the dependencies on your dev environment). Well, now you will have a chance of using experimenting and learning about ADFS v2.&lt;/p&gt;  &lt;p&gt;But there’s more of course. &lt;/p&gt;  &lt;p&gt;Here’s the&amp;#160; compete “Table of Contents”. Feedback always very welcome.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-38-15-metablogapi/7624.image_5F00_4606B9C9.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-38-15-metablogapi/3404.image_5F00_thumb_5F00_5D71482D.png" width="622" height="480" /&gt;&lt;/a&gt;&lt;/p&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;Lab 1&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Exercise 1&lt;/u&gt;: &lt;b&gt;Making Applications Claims-aware&lt;/b&gt;. In this exercise you will modify two Adatum web applications (a-Order and a-Expense) that currently use forms-based authentication to make them claims-aware, and to provide the user with a single sign-on (SSO) experience.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Exercise 2&lt;/u&gt;: &lt;b&gt;Enabling Single Sign-Out&lt;/b&gt;. In this exercise you will add code to the applications so that users logging out of one are automatically logged out of the other. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Exercise 3&lt;/u&gt;: &lt;b&gt;Using WIF Session Mode&lt;/b&gt;. In this exercise you will modify the applications to change the behavior of the WIF modules so that token information is stored in the session instead of the authentication cookie.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Lab 2&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Exercise 1:&lt;/u&gt; &lt;b&gt;Federating Adatum and Litware&lt;/b&gt;. In this exercise, you will modify the Adatum a-Order web application to trust the Adatum federation provider, and configure the Adatum federation provider to trust both the Adatum and Litware identity providers.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Exercise 2:&lt;/u&gt; &lt;b&gt;Home Realm Discovery&lt;/b&gt;. In this exercise, you will modify the a-Order web application to send a &lt;b&gt;whr&lt;/b&gt; parameter to the federation provider. You will then modify the Adatum federation provider to use the value of the &lt;b&gt;whr&lt;/b&gt; parameter to determine the identity provider the user should authenticate with. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Exercise 3:&lt;/u&gt; &lt;b&gt;Federation with ADFS&lt;/b&gt;. In this optional exercise, you will replace the custom Adatum federation provider with ADFS.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Lab 3&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Exercise 1:&lt;/u&gt; &lt;b&gt;Adding ACS as a Trusted Issuer&lt;/b&gt;. In this exercise you will start with a version of the a-Order application similar to that you used in previous labs, and modify it to use Windows Azure AppFabric Access Control Service (ACS) as the trusted issuer and identity provider in addition to the Adatum federation provider and simulated issuer.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Exercise 2&lt;/u&gt;: &lt;b&gt;Adding the Facebook Identity Provider and Home Realm Discovery&lt;/b&gt;. In this exercise you will add Facebook as an identity provider to your ACS namespace. This illustrates how, by taking advantage of ACS, you can easily change the options a user has for authentication when using your applications; without requiring any modification of the application or of your own local token issuer or federation provider. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Exercise 3:&lt;/u&gt; &lt;b&gt;Adding a Custom OpenID Identity Provider&lt;/b&gt;. In this exercise you will use the ACS Management API to programmatically add a relying party application that uses the OpenID identity provider.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Exercise 4&lt;/u&gt;: &lt;b&gt;Replacing the Adatum Federation Provider with ADFS&lt;/b&gt;. In this optional additional exercise you will replace the existing Adatum federation provider with an ADFS instance, and configure this to use ACS as a token issuer and identity provider.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Lab 4&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Exercise 1&lt;/u&gt;: &lt;b&gt;Using Claims with SOAP Web Services&lt;/b&gt;. In this exercise, you will modify the SOAP-based Adatum a-Order web service to use claims. You will also modify the desktop client application to work with the new version of the service.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Exercise 2&lt;/u&gt;: &lt;b&gt;Using Claims with REST Web Services&lt;/b&gt;. In this exercise, you will modify the REST-based Adatum a-Order web service to use claims. You will also modify the desktop client application to work with the new version of the service. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Exercise 3:&lt;/u&gt; &lt;b&gt;Federation with ADFS&lt;/b&gt;. In this optional exercise, you will replace the custom Adatum federation provider with ADFS.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10173987" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Security" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Security/" /><category term="Federated Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federated+Identity/" /><category term="Claims" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims/" /><category term="Access Control Service" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Access+Control+Service/" /><category term="SSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/SSO/" /><category term="Federation Provider" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federation+Provider/" /><category term="Identity Provider" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Identity+Provider/" /><category term="WebSSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/WebSSO/" /><category term="Claims Guide" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims+Guide/" /><category term="Geneva" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Geneva/" /><category term="ADFS" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/ADFS/" /><category term="Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Identity/" /><category term="ACS" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/ACS/" /><category term="claims transformation" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/claims+transformation/" /></entry><entry><title>Intuit Data Services + Windows Azure + Identity</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2011/04/07/intuit-data-services-windows-azure-identity.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2011/04/07/intuit-data-services-windows-azure-identity.aspx</id><published>2011-04-08T05:15:22Z</published><updated>2011-04-08T05:15:22Z</updated><content type="html">&lt;p&gt;This week, we completed a small PoC for &lt;a href="http://www.brabantcourt.com/"&gt;brabant court&lt;/a&gt;, a customer that is building a Windows Azure application that integrates with Intuit’s Data Services (IDS). &lt;/p&gt;  &lt;p&gt;A couple words on &lt;em&gt;mabbled &lt;/em&gt;from brabant court.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Mabbled is a Windows Azure app (ASP.NET MVC 3, EF Code First, SQL Azure, AppFabric ACS|Caching, jQuery) that provides complementary services to users of Intuit QuickBooks desktop and QuickBooks Online application. Mabbled achieves this integration with the &lt;/em&gt;&lt;a href="https://ipp.developer.intuit.com/ipp/federated/Get_Building/Azure"&gt;&lt;em&gt;Windows Azure SDK for Intuit Partner Platform&lt;/em&gt;&lt;/a&gt;&lt;em&gt; (IPP). An overriding design goal of mabbled is to leverage as much of Microsoft’s platform and services as possible in order to avoid infrastructure development and focus energy on developing compelling business logic. A stumbling block for mabbled’s developers has been identity management and interop between Intuit and the Windows Azure application.&lt;/em&gt;&amp;#160;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In this PoC we demonstrate how to integrate WIF with an Intuit/Windows Azure ASP.NET app. Intuit uses SAML 2.0 tokens and SAMLP. SAML 2.0 tokens are supported out of the box in WIF, but not the protocol. &lt;/p&gt;  &lt;p&gt;I used one of Intuit’s sample apps (&lt;i&gt;OrderManagement&lt;/i&gt;) as the base which currently doesn’t use WIF at all. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The goal:&lt;/strong&gt; to supply to the .NET Windows Azure app, identity information originated in Intuit’s Workplace, using the WIF programming model (e.g. &lt;b&gt;&lt;i&gt;ClaimsPrincipal&lt;/i&gt;&lt;/b&gt;) and to use and leverage as much standard infrastructure as possible (e.g. ASP.NET authorization, &lt;i&gt;&lt;strong&gt;IPrincipal.IsInRole&lt;/strong&gt;&lt;/i&gt;, etc.). &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Why? &lt;/strong&gt;The biggest advantage of this approach is the elimination of any dependency to custom code to deal with identity related concerns (e.g. querying for roles, user information, etc.). &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;How it works today?&lt;/h4&gt;  &lt;p&gt;&lt;b&gt;&amp;#160;&lt;/b&gt;If you’ve seen Intuit’s sample app, you know that they provide a handler for the app that parses a SAML 2.0 token posted back from their portal (&lt;a href="http://workplace.intuit.come"&gt;http://workplace.intuit.com&lt;/a&gt;). This SAML token contains 3 claims: &lt;strong&gt;&lt;em&gt;LoginTicket&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;TargetUrl &lt;/em&gt;&lt;/strong&gt;and &lt;strong&gt;&lt;em&gt;RealmId&lt;/em&gt;&lt;/strong&gt;. Of these, &lt;strong&gt;&lt;em&gt;LoginTicket&lt;/em&gt;&lt;/strong&gt; is also encrypted. &lt;/p&gt;  &lt;p&gt;The sample app includes a couple of helper classes that use the Intuit API to retrieve user information such as roles, profile info such as e-mail, last login date, etc. This API uses the &lt;b&gt;&lt;i&gt;LoginTicket&lt;/i&gt;&lt;/b&gt; as the handle to get this information (sort of an API key).&lt;/p&gt;  &lt;p&gt;Some of this information is then persisted in cookies, or in session, etc. The problem with this approach is identity data is not based on .NET standard interfaces. So the app is :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/8206.image_5F00_6A9FD053.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/2437.image_5F00_thumb_5F00_7842668E.png" width="640" height="132" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;where &lt;em&gt;&lt;strong&gt;RoleHelper.UserisInRole&lt;/strong&gt;&lt;/em&gt; is:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/2330.image_5F00_3D7ABDB8.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/3326.image_5F00_thumb_5F00_3CA257CE.png" width="640" height="117" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;WIF provides a nice integration into standard .NET interfaces, so code like this in a web page, just works: &lt;em&gt;&lt;strong&gt;this.User.IsInRole(role);&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;The app currently includes a ASP.NET Http handler (called &amp;quot;&lt;strong&gt;&lt;em&gt;SamlHandler&lt;/em&gt;&lt;/strong&gt;”) whose responsibility is to receive the SAML 2.0 token, parse it, validate it and decrypt the claim. Sounds familiar? if it does, it’s because WIF does the same &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5164.wlEmoticon_2D00_smile_5F00_303434A5.png" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;What changed?&lt;/h4&gt;  &lt;p&gt;I had trouble parsing the token with WIF’s &lt;strong&gt;&lt;em&gt;FederationAuthenticationModule&lt;/em&gt;&lt;/strong&gt; (probably because of the encrypted claim which I think it is not supported, but I need to double check). &lt;/p&gt;  &lt;p&gt;Inside the original app handler, I’m taking the parsed SAML token (using the existing Intuit’s code) and extracting the claims supplied in it.&lt;/p&gt;  &lt;p&gt;Then, I query Intuit Workplace for the user’s general data (e.g. e-mail, name, last name, etc.) and for the roles he is a member of (this requires 2 API calls using the &lt;strong&gt;&lt;em&gt;LoginTicket&lt;/em&gt;&lt;/strong&gt;). All this information also goes into the Claims collection in the &lt;b&gt;&lt;i&gt;ClaimsPrincipal&lt;/i&gt;&lt;/b&gt;. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/3835.image_5F00_6F91E835.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7167.image_5F00_thumb_5F00_3F8796B4.png" width="640" height="324" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;After that I create a ClaimsPrincipal and I add all this information to the claim set:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5504.image_5F00_426CD59A.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/0317.image_5F00_thumb_5F00_6E3D2989.png" width="640" height="440" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The last step is to create a session for this user, and for that I’m (re)using WIF’s &lt;b&gt;&lt;i&gt;SessionAuthenticationModule&lt;/i&gt;&lt;/b&gt;. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/3056.image_5F00_02FEFC3D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/4530.image_5F00_thumb_5F00_41F07CD8.png" width="640" height="114" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This uses whatever mechanism you configured in WIF. Because this was a quick test, I left all defaults. But since this is a Windows Azure app, I suggest you should follow &lt;a href="http://msdn.microsoft.com/en-us/library/ff803371.aspx#sec4"&gt;the specific recommendations&lt;/a&gt; for this.&lt;/p&gt;  &lt;p&gt;The handler’s original structure is the same (and I think it would need some refactoring, especially with regards to error handling, but that was out of scope for this PoC &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5164.wlEmoticon_2D00_smile_5F00_303434A5.png" /&gt;)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Some highlights of this code:&lt;/h4&gt;  &lt;ol&gt;   &lt;li&gt;Some API calls require a &lt;b&gt;&lt;i&gt;dbid&lt;/i&gt;&lt;/b&gt; parameter that is passed as a query string from Intuit to the app in a later call. I’m parsing the &lt;b&gt;&lt;i&gt;dbid&lt;/i&gt;&lt;/b&gt; from the &lt;b&gt;&lt;i&gt;TargetUrl&lt;/i&gt;&lt;/b&gt; claim to avoid a 2 pass claims generation process and solve everything here. This is not ideal, but not too bad. It would be simpler to get the &lt;strong&gt;&lt;em&gt;dbid&lt;/em&gt;&lt;/strong&gt; in the SAML token.&lt;/li&gt;    &lt;li&gt;The sample app uses local mapping mechanism to translate “Workplace roles” into “Application Roles” (it uses a small XML document stored in config to do the mapping). I moved all this here so the &lt;b&gt;&lt;i&gt;ClaimsPrincipal&lt;/i&gt;&lt;/b&gt; contains everything the application needs right away. I didn’t attempt to optimize any of this code and I just moved the code pieces from the original location to here. This is the “RoleMappingHelper”.&lt;/li&gt;    &lt;li&gt;I removed everything from the session. The “&lt;b&gt;&lt;i&gt;LoginTicket&lt;/i&gt;&lt;/b&gt;” for instance, was one of the pieces of information stored in session, but I found strange that it is sent as an encrypted claim in the SAML token, but then it is stored in a cookie. I removed all this.&lt;/li&gt;    &lt;li&gt;The WIF &lt;b&gt;&lt;i&gt;SessionAuthenticationModule&lt;/i&gt;&lt;/b&gt; (SAM) is then used to serialize/encrypt/chunk &lt;b&gt;&lt;i&gt;ClaimsPrincipal&lt;/i&gt;&lt;/b&gt;. This is all standard WIF behavior as described before.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;The web application:&lt;/h4&gt;  &lt;p&gt;In the web app, I first changed the config to add WIF module and config:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/0638.image_5F00_27B013B4.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1665.image_5F00_thumb_5F00_77A5C232.png" width="640" height="171" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Notice that the usual&lt;b&gt;&lt;i&gt; FederationAutheticationModule&lt;/i&gt;&lt;/b&gt; is not there. That’s because its responsibilities are now replaced by the handler. The SAM however is there and therefore &lt;u&gt;it will automatically reconstruct&lt;/u&gt; the &lt;b&gt;&lt;i&gt;ClaimsPrincipal&lt;/i&gt;&lt;/b&gt; if it finds the &lt;b&gt;&lt;i&gt;FedAuth&lt;/i&gt;&lt;/b&gt; cookies created inside the handler. The result is that the application now will receive the complete &lt;b&gt;&lt;i&gt;ClaimsPrincipal&lt;/i&gt;&lt;/b&gt; on each request.&lt;/p&gt;  &lt;p&gt;This is the “&lt;i&gt;CustomerList.aspx&lt;/i&gt;” page (post authentication):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/2335.image_5F00_29E94A18.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/2744.image_5F00_thumb_5F00_05280CD4.png" width="640" height="479" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The second big change was to refactor all &lt;b&gt;&lt;i&gt;RoleHelper&lt;/i&gt;&lt;/b&gt; methods to use the standard interfaces:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/4722.image_5F00_125E701A.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/4338.image_5F00_thumb_5F00_2D2A9626.png" width="640" height="143" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;An interesting case is the &lt;b&gt;&lt;i&gt;IsGuest &lt;/i&gt;&lt;/b&gt; property that originally checked that the user was a member of any role (the roles a user was a member of were stored in session too, which I’m not a big fan of). This is now resolved with this single query to the Claims collection:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/6813.image_5F00_0B5EBD95.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5811.image_5F00_thumb_5F00_453DDAB4.png" width="573" height="171" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The structure of the app was left more or less intact, but I did delete a lot of code that was not needed anymore.&lt;/p&gt;  &lt;p&gt;Again, a big advantage of this approach is that it allows you to plug any existing standard infrastructure into the app (like&lt;b&gt;&lt;i&gt; [Authorize] &lt;/i&gt;&lt;/b&gt;attribute in an MVC application) and it “just works”.&lt;/p&gt;  &lt;p&gt;In this example, the &lt;b&gt;&lt;i&gt;“CustomerList.aspx”&lt;/i&gt;&lt;/b&gt; page for example has this code at the beginning of &lt;strong&gt;&lt;em&gt;PageLoad&lt;/em&gt;&lt;/strong&gt; event:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1526.image_5F00_2E9B8C6D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/3276.image_5F00_thumb_5F00_2D56F38E.png" width="640" height="160" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As mentioned above, the &lt;b&gt;&lt;i&gt;RoleHelper&lt;/i&gt;&lt;/b&gt; methods are now using the &lt;b&gt;&lt;i&gt;ClaimsPrincipal&lt;/i&gt;&lt;/b&gt; to resolve the “&lt;b&gt;&lt;i&gt;IsInRole&lt;/i&gt;&lt;/b&gt;” question (through &lt;strong&gt;&lt;em&gt;HttpContext.User.IsInRole&lt;/em&gt;&lt;/strong&gt;). But you could achieve something similar with pure ASP.NET infrastructure. Just as a quick test, I added this to the web.config:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/3683.image_5F00_2BA627BA.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/0045.image_5F00_thumb_5F00_7F892AC8.png" width="379" height="159" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;And now when trying to browse “&lt;i&gt;CustomerList.aspx&lt;/i&gt;” you get an “Access Denied” because the user is not supplying a claim of type role with value “&lt;i&gt;SuperAdministrator&lt;/i&gt;”:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5758.clip_5F00_image006_5F00_57767BA9.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/6825.clip_5F00_image006_5F00_thumb_5F00_27D85D1D.jpg" width="640" height="306" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Final notes&lt;/h4&gt;  &lt;p&gt;A more elegant approach would probably be to use deeper WIF extensibility to implement the appropriate “protocol”, etc., but that seems to be justified only if you are really implementing a “complete” protocol/handler (SAMLP in this case). That’s much harder work.&lt;/p&gt;  &lt;p&gt;This is a more pragmatic approach that works for&lt;i&gt; this&lt;/i&gt; case. I think it fulfills the goal of isolating as much “plumbing” as possible from the application code. When WIF evolves to support SAMLP natively for example, you would simply replace infrastructure, leaving your app mostly unchanged.&lt;/p&gt;  &lt;p&gt;Finally, one last observation: we are calling the Intuit API a couple times to retrieve user info. This could be completely avoided if the original SAML token sent by Intuit contained the information right away! There might be good reasons why they are not doing it today. Maybe it’s in their roadmap. Once again, with this design, changes in your app would be minimized if that happens. &lt;/p&gt;  &lt;p&gt;This was my first experience with Intuit’s platform and I was surprised how easy it was to get going and for their excellent support. &lt;/p&gt;  &lt;p&gt;I want to thank Daz Wilkin (brabant court Founder) for spending a whole day with us. Jarred Keneally from Intuit for all his assistance and Federico Boerr &amp;amp; Scott Densmore from my team for helping me polish the implementation.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10151239" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Architecture" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Architecture/" /><category term="Federated Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federated+Identity/" /><category term="Claims" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims/" /><category term="SSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/SSO/" /><category term="Windows Azure" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Azure/" /><category term="Federation Provider" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federation+Provider/" /><category term="Claims Guide" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims+Guide/" /><category term="patterns &amp; practices" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/patterns+_2600_+practices/" /><category term="session" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/session/" /><category term="WIF" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/WIF/" /><category term="claims transformation" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/claims+transformation/" /><category term="Intuit" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Intuit/" /><category term="Workplace" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Workplace/" /></entry><entry><title>Authentication in WP7 client with REST Services–Part II</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2011/04/02/authentication-in-wp7-client-with-rest-services-part-ii.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2011/04/02/authentication-in-wp7-client-with-rest-services-part-ii.aspx</id><published>2011-04-02T21:15:25Z</published><updated>2011-04-02T21:15:25Z</updated><content type="html">&lt;p&gt;In the previous post I covered the “semi-passive” way for authentication between a Windows Phone 7 client and a REST service. This post completes the information with the “active” way.&lt;/p&gt;  &lt;p&gt;There’s nothing unexpected here really:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5102.image_5F00_1232C7C4.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/2072.image_5F00_thumb_5F00_27CD0061.png" width="640" height="458" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;We call the Identity Provider using a &lt;em&gt;&lt;strong&gt;RequestSecurityToken&lt;/strong&gt;&lt;/em&gt; message (RST)&lt;/li&gt;    &lt;li&gt;We send the SAML token to ACS and get a “Simple Web Token” (SWT) &lt;/li&gt;    &lt;li&gt;We call the service with the SWT as in the previous example using the Web browser&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The only tricky thing is that there’s no library in the phone runtime for sending the RST message to the STS. In a desktop application you’d simply use WIF or plain WCF (with the right binding). But neither is available on WP7. So step 1 and 2 require some custom code. &lt;/p&gt;  &lt;p&gt;For step 1 we are creating the RST manually:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/6114.image_5F00_25B00198.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/3173.image_5F00_thumb_5F00_49E4C04D.png" width="640" height="429" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;All those interactions are fairly easy to compose with the Rx framework, so the call gets really compact and easy to read:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/2084.image_5F00_12DABC47.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7183.image_5F00_thumb_5F00_55D68AB4.png" width="640" height="338" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;&lt;em&gt;AddAuthorizationHeader&lt;/em&gt;&lt;/strong&gt; extension method now:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1004.image_5F00_1AA2AEE9.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7776.image_5F00_thumb_5F00_6E85B1F7.png" width="640" height="276" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;All this is “plumbing code” that is written once and used many hopefully.&lt;/p&gt;  &lt;p&gt;One potential disadvantage of this approach compared to the previous one, is less flexibility in dealing with many identity providers. Remember that ACS can have many IdPs it could use and have the user potentially pick one from a list (a.k.a. Home Realm Discovery). None of that is built in this example (but you could of course). In a browser all of that is handled server side and just works.&lt;/p&gt;  &lt;p&gt;The other disadvantage is that this only works with WS-Trust STSs. If we wanted to say, authenticate with other providers you will have to implement the protocol and then update the client code. When using the browser all of that is handled server side. You can add/remove/take advantage of any upgrades to ACS with no changes to be made on the phone app.&lt;/p&gt;  &lt;p&gt;On the other hand, if you don’t need all that flexibility, it is a lighter weight and more direct solution: less round-trips, simpler code, etc. That could be case for a more enterprise oriented app, where the STS could be your corporate ADFS for example. That is unlikely to change frequently. &lt;/p&gt;  &lt;p&gt;We are still adjusting some details on the full sample, but it is very likely it will be included in the next drop on &lt;a href="http://claimsid.codpelex.com"&gt;CodePlex site&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10149206" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Federated Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federated+Identity/" /><category term="Azure Services Platform" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Azure+Services+Platform/" /><category term="Access Control Service" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Access+Control+Service/" /><category term="Identity Provider" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Identity+Provider/" /><category term="WebSSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/WebSSO/" /><category term="Claims Guide" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims+Guide/" /><category term="patterns &amp; practices" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/patterns+_2600_+practices/" /><category term="ADFS" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/ADFS/" /><category term="Windows Phone 7" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Phone+7/" /><category term="ACS" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/ACS/" /><category term="SAML" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/SAML/" /></entry><entry><title>Authentication in WP7 client with REST Services–Part I</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2011/03/24/authentication-in-wp7-client-with-rest-services-part-i.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2011/03/24/authentication-in-wp7-client-with-rest-services-part-i.aspx</id><published>2011-03-25T03:58:03Z</published><updated>2011-03-25T03:58:03Z</updated><content type="html">&lt;p&gt;In the last drop, we included a sample that demonstrates how to secure a REST web service with ACS, and a client calling that service running in a different security realm:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/8037.image_5F00_4C62E78E.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/0027.image_5F00_thumb_5F00_280DDD3F.png" width="640" height="404" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In this case, ACS is the bridge between the WS-Trust/SAML world (Litware in the diagram) and the REST/SWT side (Adatum’s a-Order app)&lt;/p&gt;  &lt;p&gt;This is just a technical variation of the original sample we had in the book, that was purely based on SOAP web services (WS-Trust/SAML only):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/0676.image_5F00_0CF50E31.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/2555.image_5F00_thumb_5F00_042505E5.png" width="640" height="294" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;But we have another example in preparation which is a Windows Phone 7 Client. Interacting with REST based APIs is pretty popular with mobile devices. In fact is what we decided to use when building the sample for our &lt;a href="http://msdn.microsoft.com/en-us/library/gg490765.aspx"&gt;Windows Phone 7 Developer Guide&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;There’s no WIF for the phone yet, so implementing this in the WP7 takes a little bit of extra work. And, as usual, there’re many ways to solve it.&lt;/p&gt;  &lt;h3&gt;The “semi-active” way:&lt;/h3&gt;  &lt;p&gt;This is a very popular approach. In fact, it’s the way you’re likely to see this done with the phone in many samples. It essentially involves using an embedded browser (browser = IE) and delegate to it all token negotiation until it gets the token you want. This negotiation is nothing else than the classic “passive” token negotiation, based on HTTP redirects that we have discussed &lt;em&gt;ad infinitum, ad nauseam&lt;/em&gt;. &lt;/p&gt;  &lt;p&gt;The trick is in the &lt;em&gt;“until you get the token you want”&lt;/em&gt;. Because the browser is embedded in the host application (a Silverlight app in the phone), you can handle and react to all kind of events raised by it. A particular useful event to handle is &lt;strong&gt;&lt;em&gt;Navigating&lt;/em&gt;&lt;/strong&gt;. This signals that the browser is trying to initiate an HTTP request to a server. We know that the last interaction in the token negotiation (passive) is actually posting the token back the the relying party.&amp;#160; That’s the token we want!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/3125.image_5F00_30618CC9.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7848.image_5F00_thumb_5F00_71AC8F62.png" width="640" height="423" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So if we have a way of identifying the last POST attempt by the browser, then we have the token we need. There are many ways of doing this, but most look like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7357.image_5F00_5693C054.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/4212.image_5F00_thumb_5F00_0AC7E99B.png" width="644" height="224" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In this case we are using the “ReplyTo” address, that has been configured in ACS with a specific value “break_here” and then extract the token with the browser control &lt;strong&gt;&lt;em&gt;SaveToString&lt;/em&gt;&lt;/strong&gt; method. The Regex functions you see there, simply extract the token from the entire web page.&lt;/p&gt;  &lt;p&gt;Once you’ve got the token, then you use it in the web service call and &lt;em&gt;voila&lt;/em&gt;!&lt;/p&gt;  &lt;p&gt;With this approach your phone code is completely agnostic of how you actually get the final token. This works with any identity provider, and any protocol supported by the browser. &lt;/p&gt;  &lt;p&gt;Here’re some screenshots of our sample:&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="100"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1256.image_5F00_01F7E14F.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/3225.image_5F00_thumb_5F00_3ECC6321.png" width="189" height="350" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="100"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5270.image_5F00_4FD09104.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7532.image_5F00_thumb_5F00_6C8A0619.png" width="188" height="350" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="99"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5775.image_5F00_5968D96D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5282.image_5F00_thumb_5F00_560741C5.png" width="189" height="351" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="101"&gt;&amp;nbsp;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;The first one is the home screen (SL). The second one shows the embedded browser with a login screen (adjusted for the size of the phone screen) and the last one the result of calling the service.&lt;/p&gt;  &lt;p&gt;JavaScript in the browser control in the phone has to be explicitly enabled:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1663.image_5F00_2DF492A6.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/8507.image_5F00_thumb_5F00_064E167C.png" width="640" height="190" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; If you don’t do this, the automatic redirections will not happen and you will see this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1050.image_5F00_40C91650.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/6763.image_5F00_thumb_5F00_01A7E5F5.png" width="257" height="480" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You will have to click on the (small) button for the process to continue. This is exactly the same behavior that happens with a browser on a desktop (only that in most cases scripting is enabled).&lt;/p&gt;  &lt;p&gt;In next post I’ll go into more detail of the other option: the “active” client. By the way, this sample will be posted to our &lt;a href="http://claimsid.codeplex.com"&gt;CodePlex site&lt;/a&gt; soon. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10145688" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Web Client" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Web+Client/" /><category term="Federated Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federated+Identity/" /><category term="Access Control Service" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Access+Control+Service/" /><category term="SSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/SSO/" /><category term="WebSSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/WebSSO/" /><category term="Claims Guide" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims+Guide/" /><category term="patterns &amp; practices" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/patterns+_2600_+practices/" /><category term="Windows Phone 7" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Phone+7/" /><category term="Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Identity/" /><category term="ACS" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/ACS/" /></entry><entry><title>Drop #2 of Claims Identity Guide on CodePlex</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2011/03/22/drop-2-of-claims-identity-guide-on-codeplex.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2011/03/22/drop-2-of-claims-identity-guide-on-codeplex.aspx</id><published>2011-03-22T20:59:45Z</published><updated>2011-03-22T20:59:45Z</updated><content type="html">&lt;p&gt;Second drop of samples and draft chapters is &lt;a href="http://claimsid.codeplex.com/releases/view/62929"&gt;now available&lt;/a&gt; on CodePlex. Highlights:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;All 3 samples for ACS v2: (&amp;quot;&lt;em&gt;&lt;strong&gt;ACS as a Federation Provider&lt;/strong&gt;&lt;/em&gt;&amp;quot;, &amp;quot;&lt;strong&gt;&lt;em&gt;ACS as a FP with Multiple Business Partners&lt;/em&gt;&lt;/strong&gt;&amp;quot; and &amp;quot;&lt;strong&gt;&lt;em&gt;ACS and REST endpoints&lt;/em&gt;&lt;/strong&gt;&amp;quot;). These samples extend all the original &amp;quot;Federation samples&amp;quot; in the guide with new capabilities (e.g. protocol transition, REST services, etc.)&lt;/li&gt;    &lt;li&gt;Two new ACS specific chapters and a new appendix on message sequences&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Most samples will work without an ACS account, since we pre-provisioned one for you. The exception is the “ACS and Multiple Partners”, because this requires credentials to modify ACS configuration. You will need to subscribe to your own instance of ACS to fully exercise the code (especially the “sign-up” process).&lt;/p&gt;  &lt;p&gt;The 2 additions to the appendix are:&lt;/p&gt;  &lt;p&gt;Message exchanges between Client/RP/ACS/Issuer:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/4431.image_5F00_3EC46D5A.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5516.image_5F00_thumb_5F00_13DBE37B.png" width="545" height="772" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;And the Single-Sign-Out&amp;#160; process (step 10 below):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7144.image_5F00_45675110.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/6165.image_5F00_thumb_5F00_448EEB26.png" width="552" height="772" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You will also find the Fiddler sessions with explained message contents.&lt;/p&gt;  &lt;p&gt;Feedback always welcome!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10144534" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="SaaS" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/SaaS/" /><category term="Federated Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federated+Identity/" /><category term="SSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/SSO/" /><category term="WebSSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/WebSSO/" /><category term="Claims Guide" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims+Guide/" /><category term="patterns &amp; practices" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/patterns+_2600_+practices/" /><category term="ADFS" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/ADFS/" /><category term="ACS" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/ACS/" /><category term="claims transformation" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/claims+transformation/" /></entry><entry><title>SaaSGrid and Identity</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2011/03/21/saasgrid-and-identity.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2011/03/21/saasgrid-and-identity.aspx</id><published>2011-03-21T21:57:04Z</published><updated>2011-03-21T21:57:04Z</updated><content type="html">&lt;p&gt;Apprenda’s &lt;a href="http://apprenda.com/saasgrid/"&gt;SaaSGrid&lt;/a&gt; is now “claims enabled”!&amp;#160; This is fantastic news. Any SG customer can now enjoy the benefits of claims based identity: simpler user management, easy federation with business partners, support for multiple identity providers, greater interoperability, etc. &lt;/p&gt;  &lt;p&gt;SG support for claims based identity maps nicely with what’s described in the &lt;strong&gt;&lt;em&gt;“Claims Identity Guide – Federation with Multiple Partners&lt;/em&gt;&lt;/strong&gt;” &lt;a href="http://msdn.microsoft.com/en-us/library/ff359105.aspx"&gt;chapter&lt;/a&gt;. And now with the &lt;a href="http://claimsid.codeplex.com/releases/view/62929"&gt;new chapter&lt;/a&gt; published on CodePlex: “&lt;strong&gt;&lt;em&gt;Federation with Multiple Partners and Windows Azure AppFabric Access Control Service&lt;/em&gt;&lt;/strong&gt;”.&lt;/p&gt;  &lt;p&gt;Join &lt;a href="http://apprenda.com/company/management-team/"&gt;Matt Ammerman&lt;/a&gt; and me on March 30th for an identity-full &lt;a href="https://www3.gotomeeting.com/register/976980454"&gt;webinar&lt;/a&gt;. The agenda for the session is:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Introduction to Claims based identity: principles and architecture.&lt;/li&gt;    &lt;li&gt;Key problems solved by claims based identity, including an update on current standards, frameworks and tools on the Microsoft platform.&lt;/li&gt;    &lt;li&gt;Drop-in Federated Identity and Claims Enablement for .NET applications via SaaSGrid (Live Demo)&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Register for the live session here: &lt;a title="https://www3.gotomeeting.com/register/976980454" href="https://www3.gotomeeting.com/register/976980454"&gt;https://www3.gotomeeting.com/register/976980454&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10144042" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="SaaS" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/SaaS/" /><category term="Federated Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federated+Identity/" /><category term="Access Control Service" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Access+Control+Service/" /><category term="Federation Provider" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federation+Provider/" /><category term="Identity Provider" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Identity+Provider/" /><category term="WebSSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/WebSSO/" /><category term="Claims Guide" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims+Guide/" /><category term="patterns &amp; practices" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/patterns+_2600_+practices/" /></entry><entry><title>Web Single Sign Out–Part II</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2011/02/24/web-single-sign-out-part-ii.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2011/02/24/web-single-sign-out-part-ii.aspx</id><published>2011-02-24T21:01:17Z</published><updated>2011-02-24T21:01:17Z</updated><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Following up on &lt;a href="http://blogs.msdn.com/b/eugeniop/archive/2011/02/16/single-sign-out-websso.aspx"&gt;previous post&lt;/a&gt;, there were 2 questions:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Where do these green checks images come from? There are nowhere in a-Order or in a-Expense… you would spend hours looking for the PNG, or JPG or GIF and you will never find it, because it is very well concealed. Can you guess where it comes from?&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I was referring to the green checks displayed here:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/2061.image_5F00_5DE0DA34.png"&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1411.image_5F00_thumb_5F00_4FA26144.png" width="640" height="478" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;&lt;em&gt;src&lt;/em&gt;&lt;/strong&gt; for these is a rather cryptic&amp;#160; &lt;strong&gt;&lt;em&gt;src=http://localhost/a-Order/?wa=signoutcleanup1.0&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;And the answer is: it’s coming from within WIF (the FAM more specifically). If you explore the FAM with Reflector you will see a byte array embedded in the code. That byte array is the GIF for the green check. Exercise to the reader: is this the only behaviour? Can the FAM do something else? under which circumstances?&lt;/p&gt;  &lt;p&gt;The second question was:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;Bonus question&lt;/strong&gt;: how does the IdP know all the applications the user accessed to?&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;No WIF magic here. The issuer will have to keep a list of all the RP. In our sample (that we expect to release really soon) we use exactly the technique described in Vittorio’s book. We have a small helper class “&lt;em&gt;&lt;strong&gt;SingleSignonManager&lt;/strong&gt;&lt;/em&gt;” that keeps track of RPs in cookies:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7635.image_5F00_13528127.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/3438.image_5F00_thumb_5F00_4907C681.png" width="640" height="197" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Then, when the signout request is received, we simply iterate over the list and return the right markup:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1385.image_5F00_434CACDB.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7635.image_5F00_thumb_5F00_0CFB84CC.png" width="640" height="129" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;&lt;em&gt;SingleSignoutManager&lt;/em&gt;&lt;/strong&gt; class is mentioned in Vittorio’s book but not available there, so we included it in the sample. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10133760" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Federated Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federated+Identity/" /><category term="Claims" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims/" /><category term="SSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/SSO/" /><category term="Claims Guide" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims+Guide/" /><category term="patterns &amp; practices" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/patterns+_2600_+practices/" /><category term="WIF" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/WIF/" /><category term="Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Identity/" /></entry><entry><title>Single Sign Out–WebSSO</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2011/02/16/single-sign-out-websso.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2011/02/16/single-sign-out-websso.aspx</id><published>2011-02-16T18:46:02Z</published><updated>2011-02-16T18:46:02Z</updated><content type="html">&lt;p&gt;While reviewing all the existing samples we’ve noticed that our implementation of &lt;strong&gt;Single Sign Out&lt;/strong&gt; was kind of….weak.&amp;#160; It wasn’t really fully implemented and wasn’t very clear what was happening either (or what it should happen)&lt;/p&gt;  &lt;p&gt;We’ve fixed all that now in scenario 1: &lt;strong&gt;WebSSO&lt;/strong&gt;. Things get more complicated when more than 1 STS is in the picture, and even more so when the identity provider uses other protocols (for example, all our scenarios using ACS and Google or ACS and LiveID). But for WebSSO, things are more or less straight forward.&lt;/p&gt;  &lt;h3&gt;WebSSO scenario recap:&lt;/h3&gt;  &lt;p&gt;If you remember for previous posts or the book, in our first chapter we had Adatum with 2 applications: &lt;strong&gt;a-Order&lt;/strong&gt; and &lt;strong&gt;a-Expense&lt;/strong&gt;. We wanted that Adatum employees login to one or the other seamlessly:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7183.image_5F00_6437D68F.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/6786.image_5F00_thumb_5F00_38575CD3.png" width="640" height="434" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;John opens the browser on his desktop (that already has a been authenticated with AD)&lt;/li&gt;    &lt;li&gt;Opens a-Order home page&lt;/li&gt;    &lt;li&gt;Gets redirected to the IdP. He’s authenticated (e.g. Kerberos ticket)&lt;/li&gt;    &lt;li&gt;A token is given to him. The token is posted back to a-Order. He’s in.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Sometime later, he browses a-Expense.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;No session with a-Expense yet, he’s redirected to IdP&lt;/li&gt;    &lt;li&gt;He’s already authenticated, gets a new token for a-Expense.&lt;/li&gt;    &lt;li&gt;Voila&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;So far, so good. Nothing really new. What happens now if John wants to &lt;strong&gt;&lt;em&gt;signoff. &lt;/em&gt;&lt;/strong&gt;We don’t want our system to be a roach motel: once in, never out… what happens is actually pretty straight forward, but there are some subtle considerations. When John signs-off, he should sign off from all relying parties and the IdP.&lt;/p&gt;  &lt;p&gt;This diagram illustrates the process:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/4456.clip_5F00_image002_5F00_7095D3EB.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/6116.clip_5F00_image002_5F00_thumb_5F00_572DD0B1.jpg" width="605" height="480" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;John clicks on “Logout” (on any of the relying parties: a-Order in our example). This results on a &lt;strong&gt;wa=signout1.0&lt;/strong&gt; to be sent to the IdP. The Idp cleans up its own session with the user and then (here comes the tricky part)returns a page to the user with a list of image tags (HTML image tags). An image tag for each RP the IdP has issued a security token for John. The &lt;strong&gt;src&lt;/strong&gt; url for these images will be actually something like:&lt;/p&gt;  &lt;p&gt;src=http://localhost/a-Expense/?wa=signoutcleanup1.0 &lt;/p&gt;  &lt;p&gt;src=http://localhost/a-Order/?wa=signoutcleanup1.0 &lt;/p&gt;  &lt;p&gt;With these tags, the browser will attempt to get the image from these URL (which happens to be located in each RP: a-Order and a_expense), and in fact you will see something like this:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/2061.image_5F00_5DE0DA34.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1411.image_5F00_thumb_5F00_4FA26144.png" width="640" height="478" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The HTML:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7380.image_5F00_6427B0C2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7183.image_5F00_thumb_5F00_0F0014D5.png" width="640" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Where do these green checks images come from? There are nowhere in a-Order or in a-Expense… you would spend hours looking for the PNG, or JPG or GIF and you will never find it, because it is very well concealed. Can you guess where it comes from?&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;Hint:&lt;/strong&gt; page 115 of Vittorio’s &lt;a href="http://www.amazon.com/Programming-Windows-Identity-Foundation-Dev/dp/0735627185/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1297876830&amp;amp;sr=1-1"&gt;excellent book&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;Bonus question&lt;/strong&gt;: how does the IdP know all the applications the user accessed to?&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;    &lt;p&gt;By the way, all this is now working on the new updated samples which we will post to &lt;a href="http://claimsid.codeplex.com"&gt;our CodePlex site&lt;/a&gt;&amp;#160; very soon.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10130537" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Federated Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federated+Identity/" /><category term="Claims" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims/" /><category term="SSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/SSO/" /><category term="Identity Provider" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Identity+Provider/" /><category term="WebSSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/WebSSO/" /><category term="Claims Guide" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims+Guide/" /><category term="patterns &amp; practices" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/patterns+_2600_+practices/" /><category term="a-Expense" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/a_2D00_Expense/" /></entry><entry><title>ACS as a Federation Provider – Claims transformation</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2011/02/14/acs-as-a-federation-provider-claims-transformation.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2011/02/14/acs-as-a-federation-provider-claims-transformation.aspx</id><published>2011-02-14T23:31:56Z</published><updated>2011-02-14T23:31:56Z</updated><content type="html">&lt;p&gt;To work properly, a-Order needs a number of claims to be supplied:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;User name&lt;/li&gt;    &lt;li&gt;Organization&lt;/li&gt;    &lt;li&gt;Role&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The &amp;quot;Organization” claim is used to filter orders belonging to a specific customer of Adatum. For example, Litware users (like Rick) will eventually end up with a token containing a claim with “Organization=Litware”. All this is done in step 3 here in the diagram below:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/3716.image_5F00_12B7A005.png"&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1651.image_5F00_thumb_5F00_67AF8C32.png" width="640" height="395" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Adatum’s FP takes whatever token it gets from the outside world and “normalizes” it to whatever the application needs. ADFS for example, ships with a &lt;a href="http://technet.microsoft.com/en-us/library/dd807118(WS.10).aspx"&gt;powerful language&lt;/a&gt; to define these transformations. In our sample, we ship a simple “simulation” of a real STS, so our rules are all coded in C# and are obviously not “production”:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5428.image_5F00_5C18D816.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7181.image_5F00_thumb_5F00_0A9EBB2C.png" width="640" height="285" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;With ACS in the picture there are 2 places where transformation could happen though:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;In ACS&lt;/li&gt;    &lt;li&gt;In Adatum’s FP&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt; In this scenario Adatum owns both (its own on-premises issuers and an instance in ACS), so it has full control of either components. Which one to use depends on many factors and there’s no “single right” way of doing it. Let’s consider one reason to keep mappings on Adatum’s side. for this we’ll pick one of the transformations required: the simple rule of associating “&lt;strong&gt;&lt;u&gt;Mary@Gmail.com&lt;/u&gt;&lt;/strong&gt;”&amp;#160; with &lt;u&gt;&lt;strong&gt;Organization=“Mary Inc”&lt;/strong&gt;&lt;/u&gt;. &lt;/p&gt;  &lt;p&gt;This rule would be fixed in ACS, there is no dynamic discovery or lookup code that ACS can execute at this time. It is likely that Adatum keeps a master record of all the companies it works with and the contact information associated with them. If that is the case, it’s probably better to have ADFS call a component or the master record database using the built-in SQL integration&amp;#160; capabilities (if using ADFS). If Mary changes her e-mail, everything would just work. If the rule was in ACS, it would require Adatum to update the rule every time there’s an update.&lt;/p&gt;  &lt;p&gt;Of course, ACS does provide an API for updating the configuration. So you could achieve something similar by just automating the update. Different companies will be more or less comfortable with one approach or the other.&lt;/p&gt;  &lt;p&gt;The highest order bit in this situation is that the app remains completely isolated from these changes, as &lt;a href="http://blog.codingoutloud.com/"&gt;CodingOutLoud&lt;/a&gt; mentioned in &lt;a href="http://blogs.msdn.com/b/eugeniop/archive/2011/02/09/acs-as-a-federation-provider-a-little-bit-deeper-into-the-sample-home-realm-discovery.aspx"&gt;his comment&lt;/a&gt; in a previous post.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10129261" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Federated Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federated+Identity/" /><category term="Claims" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims/" /><category term="Access Control Service" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Access+Control+Service/" /><category term="SSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/SSO/" /><category term="Windows Azure" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Azure/" /><category term="Identity Provider" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Identity+Provider/" /><category term="WebSSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/WebSSO/" /><category term="Claims Guide" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims+Guide/" /><category term="patterns &amp; practices" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/patterns+_2600_+practices/" /><category term="ADFS" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/ADFS/" /><category term="Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Identity/" /><category term="ACS" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/ACS/" /><category term="claims transformation" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/claims+transformation/" /></entry><entry><title>ACS as a Federation Provider–Home Realm Discovery Part 2</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2011/02/10/acs-as-a-federation-provider-home-realm-discovery-part-2.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2011/02/10/acs-as-a-federation-provider-home-realm-discovery-part-2.aspx</id><published>2011-02-11T00:12:48Z</published><updated>2011-02-11T00:12:48Z</updated><content type="html">&lt;p&gt;In my previous post, I had a question for all you: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;What would happen if Adatum’s FP didn’t supply ACS with the &lt;strong&gt;whr&lt;/strong&gt; parameter? &lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;An the answer is: ….. ACS will simply ask the user!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/3377.image_5F00_22CF99E1.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/8015.image_5F00_thumb_5F00_57AC7951.png" width="644" height="482" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;ACS has no way (besides the &lt;strong&gt;&lt;em&gt;whr&lt;/em&gt;&lt;/strong&gt; parameter) of knowing where to go next (unless you configured your app with only 1 Identity provider I guess). &lt;/p&gt;  &lt;p&gt;You might say that this page is ugly, and &lt;em&gt;my&lt;/em&gt; look &amp;amp; feel is lost and you would be absolutely right. However, the good news is that this is just the default page. You can actually query ACS for all configured Identity Providers and build a page that will send the right whr.&lt;/p&gt;  &lt;p&gt;Now, any ideas on question #2? (&lt;strong&gt;reminder&lt;/strong&gt;: who is responsible for issuing the claims a-Order needs: role, organization, etc?)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10127765" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Federated Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federated+Identity/" /><category term="Access Control Service" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Access+Control+Service/" /><category term="SSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/SSO/" /><category term="Windows Azure" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Azure/" /><category term="Federation Provider" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federation+Provider/" /><category term="Identity Provider" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Identity+Provider/" /><category term="Claims Guide" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims+Guide/" /><category term="patterns &amp; practices" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/patterns+_2600_+practices/" /><category term="ACS" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/ACS/" /><category term="SAML" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/SAML/" /></entry><entry><title>ACS as a Federation Provider - A little bit deeper into the sample (Home Realm Discovery)</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2011/02/09/acs-as-a-federation-provider-a-little-bit-deeper-into-the-sample-home-realm-discovery.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2011/02/09/acs-as-a-federation-provider-a-little-bit-deeper-into-the-sample-home-realm-discovery.aspx</id><published>2011-02-09T20:40:34Z</published><updated>2011-02-09T20:40:34Z</updated><content type="html">&lt;p&gt;&lt;em&gt;&lt;strong&gt;Updates&lt;/strong&gt;: fixed typos. Clarified how Home Realm Discovery works in this example.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;In &lt;a href="http://blogs.msdn.com/b/eugeniop/archive/2011/02/08/access-control-service-as-a-federation-provider.aspx"&gt;the previous post&lt;/a&gt;, I introduced the basic scenario of using ACS as a federation provider for Adatum (in addition to the one they already have). In this post, I’ll show you more details on how this works, based on the sample we are building that will ship with the guide.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Step 1 - Rick from Litware browses a-Order hosted by Adatum&lt;/h3&gt;  &lt;p&gt;The first time Rick browses a-Order he is “unauthenticated” therefore a-Order simply redirects Rick to the issuer it trusts for getting security tokens. That is Adatum’s own issuer. The issuer doesn’t know where Rick is coming from (it could use some heuristics, but in this simple example, it doesn’t), so it just asks the user “&lt;em&gt;where are you coming from so I can redirect you to the a place I trust to get you authenticated?&lt;/em&gt;”. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5706.image_5F00_1EBF5021.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/3542.image_5F00_thumb_5F00_734B0959.png" width="640" height="471" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;This is the &amp;quot;Home Realm Screen” and it is meant to capture precisely the user (Rick’s) home realm (the place where he can get authenticated). Notice that we now have 3 options:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Adatum. This will redirect the user to Adatum’s Identity Provider. This is of course useless to Rick because he doesn’t &lt;/li&gt;    &lt;li&gt;A list of organizations Adatum does business with (Litware) &lt;/li&gt;    &lt;li&gt;An e-mail address fro which the a-Order can infer the security domain. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Step 2 – Rick selects “Litware” from the listbox&lt;/h3&gt;  &lt;p&gt;By doing this, Rick will continue his journey to get a token for a-Order. He’s redirected to Litware’s IP. Adatum’s FP knows about this because internally it will keep a list of the other issuers it trusts. “Litware” in the listbox maps to the actual URL of Litware issuer. This is the screen on the left below. After successful authentication, Rick is directed back to the FP with a freshly minted Litware token. The FP inspects the token, does some transformations (adds/removes claims) and issues a new (Adatum) token which is finally sent to a-Order.&lt;/p&gt;  &lt;p&gt;a-Order opens the token (thanks to WIF) and runs its logic (display pending orders). That’s the screen on the right:&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7840.image_5F00_6B5366F7.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1004.image_5F00_thumb_5F00_44191DC2.png" width="321" height="239" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="200"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/8741.image_5F00_5FBDA9B8.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5611.image_5F00_thumb_5F00_2391DE10.png" width="322" height="239" /&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;a-Order magnificent UI renders the name of the user and the name of the “original issuer” of the token on the top right corner of the screen.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;ACS enters the scene&lt;/h2&gt;  &lt;p&gt;Now, what happens if the user fills in the last option of&amp;#160; the Home Realm page? (the e-mail). In this case, our sample does exactly the same thing only with some extra logic. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Step 1- Mary browses a-Order and then completes the textbox with her Gmail mail address&lt;/p&gt;  &lt;p&gt;In our current implementation Adatum’s FP Home Realm page will assume that if you complete the e-mail textbox, you want to authenticate with Google or LiveID and will simply redirect you to ACS. ACS is the other “Federation Provider” in the chain in between Adatum’s issuer and Google or LiveID.&amp;#160; It actually does something else: &lt;em&gt;it specifies the &lt;strong&gt;whr &lt;/strong&gt;parameter&lt;/em&gt;. This is simply based on the e-mail domain. So, if I type &lt;a href="mailto:&amp;ldquo;something@gmail.com"&gt;“&lt;strong&gt;something@gmail.com&lt;/strong&gt;&lt;/a&gt;” it assumes the issuer I’m interested in using for authentication is Google’s:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Step 2 – Mary authenticates in Google&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7752.image_5F00_1149174E.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/2068.image_5F00_thumb_5F00_17FC20D1.png" width="644" height="477" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Because ACS is getting this hint from the Adatum’s FP, it forwards the request with no further stops to Google (the screen above).&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Question for the reader #1:&lt;/strong&gt; what would happen if Adatum’s FP didn’t specify the &lt;strong&gt;whr&lt;/strong&gt; parameter when it redirected Rick to ACS?&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Notice how Google is informing us of the requestor of the token (our account in ACS), and provides the usual login screen. After successful login, it actually requests the user for an additional approval to disclose some information about him/her. (the e-mail in this case)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1423.image_5F00_22B97826.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1411.image_5F00_thumb_5F00_48AF287C.png" width="644" height="477" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Step 3 – Going back to a-Order&lt;/h3&gt;  &lt;p&gt;What happens next is exactly what I described before. Unfortunately we don’t see all the magic that happens inside ACS. But essentially, it took care of bridging all the relationship with Google, it translated the token received from Google (not SAML) and then issued a (SAML) token that Adatum’s FP and a-Order could understand:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/6114.image_5F00_4438A7B5.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/8764.image_5F00_thumb_5F00_63E7817D.png" width="644" height="477" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;There are absolutely no changes in a-Order code to handle this. There’re no dependencies on Google’s API or anything special. All thanks to ACS and claims based identity. All we did was add ACS as a trusted issuer of Adatum’s FP, added a Home realm page to Adatum’s FP and then configured the token transformation rules.&lt;/p&gt;  &lt;p&gt;In fact, from a programming perspective you simply get a &lt;strong&gt;&lt;em&gt;ClaimsPrincipal&lt;/em&gt;&lt;/strong&gt; with the usual properties, regardless of where the token is coming from:&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/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5611.image_5F00_6EA4D8D2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/4478.image_5F00_thumb_5F00_2D2A2679.png" width="644" height="330" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;It just works!&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Question for the reader #2:&lt;/strong&gt; Google didn’t provide the “Role” claim you see above. And most certainly didn’t provide the “Organization” claim either. Who did then? Where are they coming from?&lt;/p&gt;&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10126977" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Federated Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federated+Identity/" /><category term="Federation Provider" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federation+Provider/" /><category term="Identity Provider" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Identity+Provider/" /><category term="Claims Guide" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims+Guide/" /><category term="patterns &amp; practices" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/patterns+_2600_+practices/" /><category term="Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Identity/" /><category term="ACS" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/ACS/" /><category term="Google" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Google/" /><category term="SAML" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/SAML/" /><category term="OpenID" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/OpenID/" /></entry><entry><title>Access Control Service as a Federation Provider</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2011/02/08/access-control-service-as-a-federation-provider.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2011/02/08/access-control-service-as-a-federation-provider.aspx</id><published>2011-02-08T20:11:49Z</published><updated>2011-02-08T20:11:49Z</updated><content type="html">&lt;p&gt;The first scenario we are working is using ACS as a federation provider. This is an extension of the &lt;a href="http://msdn.microsoft.com/en-us/library/ff359110.aspx"&gt;current chapter on Federation&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The basic scenario is the following:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Adatum has an Order processing app (a-Order) that is already claims enabled.&lt;/li&gt;    &lt;li&gt;Adatum wants their partners to be able to access a-Order with their own identity infrastructure&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;In pictures:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/3716.image_5F00_12B7A005.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1651.image_5F00_thumb_5F00_67AF8C32.png" width="640" height="395" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Adatum Issuer (ADFS in the example) now trusts Litware issuer with whatever method Litware has implemented. If Litware uses AD, then a good candidate for their Identity Provider is ADFS of course.&lt;/li&gt;    &lt;li&gt;Rick authenticates with their IP and gets a token for Adatum&lt;/li&gt;    &lt;li&gt;Rick (or his browser really) sends the token to Adatum’s issuer where it gets transformed into an “Adatum Token”. This is an opportunity for Adatum to translate&amp;#160; Litware concepts into Adautm ones: for example Rick might be in a “Sales” group in Litware, but a-Order has no notion of “Sales”. It might understand a role “Order Tracker” instead. The Adatum issuer will translate “Sales” into “Order Tracker”&lt;/li&gt;    &lt;li&gt;If everything goes well, Rick (his browser) gets an Adatum token and finally sends it to the a-Order&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Note: This flow is really the “unwinding” of the process that starts when Rick browses a-Order. Everything really starts there (look for WS-Federation “passive profile” for more info), but conceptually that’s what’s happening.&lt;/p&gt;  &lt;p&gt;Let’s imagine now that Adatum does business with other partners (smaller companies than Litware maybe) that &lt;strong&gt;&lt;u&gt;do not&lt;/u&gt;&lt;/strong&gt; have any identity infrastructure of their own. Let’s imagine “Mary Inc” is a a very small busniess owned by Mary, and she essentially works from home. Mary is probably not going to have AD under her desk.&lt;/p&gt;  &lt;p&gt;What are the options for Adatum if they wanted to open a-Order to customers like Mary?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Option 1 – Adatum creates an Identity Provider for customers with no Identity Provider of their own&lt;/h3&gt;  &lt;p&gt;This is essentially deploying an Identity Provider (with its corresponding user database) for partners. Mary would get an account with Adatum&amp;#160; and she would sign on with the Adatum provider credentials.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1050.image_5F00_1530ABF6.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7433.image_5F00_thumb_5F00_6DF662C0.png" width="640" height="433" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;They can implement it in various ways: use ADFS V2 with a separate AD, use ADFS v1.1 with ADAM, use a custom STS with ASP.NET Membership (e.g. the StarterSTS or similar), write their own (a fun project indeed).&lt;/p&gt;  &lt;p&gt;However, there are quite some disadvantages in this approach:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;It requires Adatum to develop/deploy additional infrastructure and maintain and support it. (Hints: what happens if Mary forgets her Adatum password? who is she calling? who pays for that support?)&lt;/li&gt;    &lt;li&gt;Mary’s account is unlikely to reside in Adatum’s corporate AD (it will probably be a separate domain). Consequence: more servers, more licenses, more money, more power consumption, more greenhouse gases, less ice in the arctic, less polar bears…you get the picture.&lt;/li&gt;    &lt;li&gt;Mary has acquired an additional username/password that will end up on sticky notes on her desktop monitor. Less security, worse user experience, less satisfaction with Adatum, more blame, less business, more complaints, increased need for selective serotonin reuptake inhibitors….not good.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Option 2 – Ask Mary to deploy ADFS&lt;/h3&gt;  &lt;p&gt;This would be just great, wouldn’t it?&amp;#160; Riiiiight…. I’m just kidding, please don’t attempt this.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Option 3 – Leverage any of Marys’ &lt;em&gt;existing&lt;/em&gt; identities&lt;/h3&gt;  &lt;p&gt;Mary is on Facebook (sometimes too much).&amp;#160; Mary has a Hotmail account. Mary uses Google Docs. Wouldn’t it be great to simply use one of these? Yes, it would be great. How do we make that happen? &lt;/p&gt;  &lt;p&gt;The answer is simple: make Adatum’s Federation Provider trust all those identity providers, just as they did with Litware:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/2158.image_5F00_3B928F41.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7532.image_5F00_thumb_5F00_222A8C07.png" width="640" height="401" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Conceptually this is all fine, but it would be too easy, &lt;/p&gt;  &lt;p&gt;The only issue is that often, all these providers implement different protocols and token formats: OpenID and OAuth and SWT, etc. So Adatum’s FP would have to understand all these protocols and formats and translate them into the ones a-Order understands (SAML &amp;amp; WS-Federation). If Adatum deployed ADFS as their FP this means that it can deal with WS-Federation, WS-Trust and SAMLP protocols and SAML tokens. Anything else requires extensions, development or additional infrastructure. &lt;/p&gt;  &lt;p&gt;The good news is that all this supported out of the box by ACS! And the solution would look more or less like this:&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/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/8816.image_5F00_41D965CF.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1256.image_5F00_thumb_5F00_416D32DA.png" width="640" height="421" /&gt;&lt;/a&gt;&lt;/p&gt;            &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Adatum &lt;strong&gt;reuses&lt;/strong&gt; all the internal infrastructure that they’ve invested in already. The &lt;strong&gt;setup of all this would probably take hours&lt;/strong&gt; (or minutes even) as opposed to weeks or months. Adatum can rely on an &lt;strong&gt;highly scalable&lt;/strong&gt;, &lt;strong&gt;secure&lt;/strong&gt;, &lt;strong&gt;proven&lt;/strong&gt;, global service as opposed to rolling out their own. &lt;/p&gt;  &lt;p&gt;Using a cloud service means less control though. Adatum will have to trust (beyond the identity meaning) Microsoft to run this for them. They will also have to rely on any of the 3rd party identity providers to authenticate the users. If Facebook is down for whatever reason, then Mary will not be able to access a-Order. But I guess that if Facebook is down, the world has bigger problems, right?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10126405" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Federation Provider" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federation+Provider/" /><category term="WebSSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/WebSSO/" /><category term="patterns &amp; practices" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/patterns+_2600_+practices/" /><category term="Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Identity/" /><category term="ACS" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/ACS/" /></entry><entry><title>Our next project – Claims based Identity and Access Control</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2011/02/04/our-next-project-claims-based-identity-and-access-control.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2011/02/04/our-next-project-claims-based-identity-and-access-control.aspx</id><published>2011-02-05T06:40:46Z</published><updated>2011-02-05T06:40:46Z</updated><content type="html">&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/0066.image_5F00_7523404F.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 2px 11px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/0550.image_5F00_thumb_5F00_77D8CF75.png" width="157" height="189" /&gt;&lt;/a&gt;Not surprisingly maybe, security in general, and authentication &amp;amp; authorization in particular, is a consistently highly rated concern for our customers. These concerns are especially elevated&amp;#160; with those considering the cloud, because they don’t have as much control on the cloud as they would typically have in their own datacenters. Sometimes, one could argue, for their own benefit, but that is a different discussion.&lt;/p&gt;  &lt;p&gt;The “&lt;a href="http://msdn.microsoft.com/en-us/library/ff423674.aspx"&gt;Claims Identity Guide&lt;/a&gt;” published in December 2009, was a foundational component in our “Cloud series” that followed it: &lt;i&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff728592.aspx"&gt;Moving Applications to the Cloud&lt;/a&gt;&lt;/i&gt;, &lt;i&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff966499.aspx"&gt;Developing Application for the Cloud&lt;/a&gt;&lt;/i&gt; and the recently released &lt;i&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/gg490765.aspx"&gt;Windows Phone 7 Developer Guide&lt;/a&gt;&lt;/i&gt;. The identity content in all of them, is essentially based on the core scenarios and design principles described in the claims guide.&lt;/p&gt;  &lt;p&gt;With the Claims guide we also pioneered a new style and design in our books, and it was very well received! We’ve got some great feedback from you on the content and the approach. Exciting things are happening in the identity space and we want to continue to help you create great solutions using these new components.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Our next project then is an extension to this guide that will address two new areas:&lt;/p&gt;  &lt;ol&gt;   &lt;p&gt;1- &lt;b&gt;Access Control Service&lt;/b&gt; (ACS) V2, in the Windows Azure Platform will be available in production soon. ACS opens the doors to advanced identity management scenarios including federation, interop with popular identity standards such as OpenId, OAuth, SWT and SAML, use of popular social identity providers such as Facebook, Windows Live ID and Google. All of this is available today in labs.&lt;/p&gt;    &lt;p&gt;2- &lt;b&gt;SharePoint 2010 &lt;/b&gt;is “claims enabled”, meaning that it natively supports advanced identity management based on WS-Federation. &lt;/p&gt; &lt;/ol&gt;  &lt;p&gt;Interestingly (or not maybe), the core scenarios remain the same but the implementation details change and new interesting things can now be done much more easily. More or less our scope now looks like this:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/0871.image_5F00_3DE98C89.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7725.image_5F00_thumb_5F00_3519843D.png" width="640" height="431" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The “blue” line is the existing content, “green” and “black” are the new chapters. Notice that they almost mirror what’s covered today. News and updates (including drafts, early samples, etc) will be published on &lt;a href="http://claimsid.codeplex.com"&gt;http://claimsid.codeplex.com&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;As usual, we welcome feedback very much!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10125177" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Federated Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federated+Identity/" /><category term="Claims" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims/" /><category term="SSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/SSO/" /><category term="Windows Azure" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Azure/" /><category term="Federation Provider" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federation+Provider/" /><category term="Identity Provider" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Identity+Provider/" /><category term="WebSSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/WebSSO/" /><category term="Claims Guide" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims+Guide/" /><category term="Geneva" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Geneva/" /><category term="patterns &amp; practices" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/patterns+_2600_+practices/" /><category term="ADFS" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/ADFS/" /><category term="Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Identity/" /><category term="ACS" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/ACS/" /><category term="SharePoint" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/SharePoint/" /></entry><entry><title>MVC–Unity–challenge answer</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2011/01/27/mvc-unity-challenge-answer.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2011/01/27/mvc-unity-challenge-answer.aspx</id><published>2011-01-28T07:10:59Z</published><updated>2011-01-28T07:10:59Z</updated><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The answer (or better yet, &lt;em&gt;my&lt;/em&gt; answer):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/8463.image_5F00_34C1B3CD.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/2768.image_5F00_thumb_5F00_4FCA5D0E.png" width="640" height="145" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The proof:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/4747.image_5F00_46FA54C2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1682.image_5F00_thumb_5F00_177BC029.png" width="640" height="415" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5417.image_5F00_050349A7.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/3348.image_5F00_thumb_5F00_4093329A.png" width="640" height="424" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This is leveraging the use of a name when registering a type and using the convention of using the same name for all types in the same context (“A” and “B” in my little sample). Thanks &lt;a href="http://www.tavaresstudios.com"&gt;Chris&lt;/a&gt; for the suggestion to use this feature.&lt;/p&gt;  &lt;p&gt;I’ve done this in code, but Unity works with config files too. I haven’t done i t though.&lt;/p&gt;  &lt;p&gt;Happy injection!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10121365" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="MVC" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/MVC/" /><category term="Unity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Unity/" /></entry><entry><title>Windows Azure Guides in Japanese</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2011/01/27/windows-azure-guides-in-japanese.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2011/01/27/windows-azure-guides-in-japanese.aspx</id><published>2011-01-27T19:52:34Z</published><updated>2011-01-27T19:52:34Z</updated><content type="html">&lt;p&gt;I can’t read a single character (except maybe one), but it looks beautiful:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/4527.image_5F00_42FBA0D7.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/0317.image_5F00_thumb_5F00_2D51426D.png" width="640" height="390" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/library/ff898435.aspx"&gt;http://msdn.microsoft.com/ja-jp/library/ff898435.aspx&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10121182" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Windows Azure" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Azure/" /><category term="patterns &amp; practices" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/patterns+_2600_+practices/" /><category term="Windows Azure Architecture Guide" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Azure+Architecture+Guide/" /><category term="WAG" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/WAG/" /></entry><entry><title>Unity and MVC–Resolving types challenge</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2011/01/26/unity-and-mvc-resolving-types-challenge.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2011/01/26/unity-and-mvc-resolving-types-challenge.aspx</id><published>2011-01-26T23:10:51Z</published><updated>2011-01-26T23:10:51Z</updated><content type="html">&lt;p&gt;Imagine you have a situation like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5736.image_5F00_70085AD2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7485.image_5F00_thumb_5F00_4C1F8378.png" width="640" height="291" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;2 MVC controllers (A and B) have a dependency on &lt;strong&gt;&lt;em&gt;Svc&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;A&lt;/em&gt;&lt;/strong&gt;. &lt;strong&gt;&lt;em&gt;SvcA&lt;/em&gt;&lt;/strong&gt; has a dependency on &lt;strong&gt;&lt;em&gt;SvcB&lt;/em&gt;&lt;/strong&gt; and a component implementing &lt;strong&gt;&lt;em&gt;IX&lt;/em&gt;&lt;/strong&gt;.&lt;strong&gt;&lt;em&gt;SvcB&lt;/em&gt;&lt;/strong&gt; has a dependency on something implementing &lt;strong&gt;&lt;em&gt;IY&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Every time the system resolves &lt;em&gt;&lt;strong&gt;CtrlA&lt;/strong&gt;&lt;/em&gt; we want to provide Y1 and every time it resolves &lt;strong&gt;&lt;em&gt;CtrlB&lt;/em&gt;&lt;/strong&gt;, we want to provide &lt;strong&gt;&lt;em&gt;Y2&lt;/em&gt;&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;Something like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/0636.image_5F00_00BFDFB4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7506.image_5F00_thumb_5F00_5985967E.png" width="640" height="298" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;and&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/3362.image_5F00_324B4D49.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/8551.image_5F00_thumb_5F00_38FE56CC.png" width="640" height="294" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;How would you configure Unity to solve this? &lt;/p&gt;  &lt;p&gt;No “if() else” allowed. System supplies its own MVC’s &lt;strong&gt;&lt;em&gt;ControllerFactory&lt;/em&gt;&lt;/strong&gt;. (via &lt;strong&gt;&lt;em&gt;ControllerBuilder.Current.SetControllerFactory&lt;/em&gt;&lt;/strong&gt;)&lt;strong&gt;&lt;em&gt;. &lt;/em&gt;&lt;/strong&gt;Ideally, we want the &lt;strong&gt;&lt;em&gt;ControllerFactory&lt;/em&gt;&lt;/strong&gt; to have no knowledge of any of these specific components.     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Some help: read &lt;a href="http://www.tavaresstudios.com"&gt;Chris’s blog&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/ff660846(v=PandP.20).aspx"&gt;Unity docs&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10120731" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="MVC" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/MVC/" /><category term="DI" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/DI/" /><category term="Unity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Unity/" /></entry><entry><title>A year’s balance–next project</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2011/01/26/a-year-s-balance-next-project.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2011/01/26/a-year-s-balance-next-project.aspx</id><published>2011-01-26T18:02:30Z</published><updated>2011-01-26T18:02:30Z</updated><content type="html">&lt;p&gt;A little bit late for a year balance since the year has already started, or so I’m told. Anyway, as we prepare for the next project, I reflected on my team’s work for the last 18 months. 18 months is more than a year, so you might wonder why am I doing a year balance on the work done on 18 months? Good question. &lt;/p&gt;  &lt;p&gt;Does content that nobody sees and uses really exist? Like &lt;a href="http://en.wikipedia.org/wiki/If_a_tree_falls_in_a_forest"&gt;the tree falling where nobody can listen&lt;/a&gt;. Does it make a sound? I figured that what you cared the most is the stuff that was available to you, not what we actually do here in the remote American northwest and keep to ourselves. &lt;/p&gt;  &lt;p&gt;Let’s say then, that the &lt;strong&gt;&lt;em&gt;output&lt;/em&gt;&lt;/strong&gt; of that last 18 months was available to &lt;strong&gt;&lt;em&gt;you&lt;/em&gt;&lt;/strong&gt; in the last 12 months. Makes sense?&lt;/p&gt;  &lt;p&gt;And here it is:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7762.image_5F00_3F657A51.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/8357.image_5F00_thumb_5F00_63E6E208.png" width="643" height="307" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff423674.aspx"&gt;A Guide to Claims based Identity&lt;/a&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This guide published a year ago, laid the foundations for all subsequent books. We heavily reused the core designs explained in this little book. We also explored a new format for our books, and a new style. This book inaugurated the “tubemap”: the diagram we used from then on to explain in a single picture the entire scope of the content. &lt;/p&gt;  &lt;p&gt;&lt;img title="Ff423674.a9471d21-d7f7-48b8-8a64-686fe99f5411(en-us,PandP.10).png" alt="Ff423674.a9471d21-d7f7-48b8-8a64-686fe99f5411(en-us,PandP.10).png" src="http://i.msdn.microsoft.com/dynimg/IC382614.png" width="223" height="267" /&gt;&lt;/p&gt;  &lt;p&gt;Credits to our brilliant partner, &lt;a href="http://blogs.southworks.net/mwoloski/"&gt;Matias Woloski&lt;/a&gt;. Little known secret: VS 2010 samples of the book are available on &lt;a href="http://claimsid.codeplex.com/"&gt;codeplex&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff728592.aspx"&gt;Moving Applications to the Cloud&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Our first book specifically focused on Windows Azure. We explored the considerations of migrating (and optimizing) applications for the cloud. As a colorful anecdote, this book includes an Excel spreadsheet with dollar amounts! A technical book with economics! Some were very opposed to it, and $ is a big deal in PaaS (and SaaS, and IaaS, and XaaS)! Money is a big motivator and every month, you get direct feedback on how you are using the platform. Other nuggets worth mentioning: MSBuild tasks to automate deployment,&amp;#160; setting up multiple environments (think “Dev”, “Test”, etc.). It’s quite a popular book: made it to the top 25 in O’Reilly this week.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff966499.aspx"&gt;Developing Applications for the Cloud&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Our second book on Windows Azure Platform. This time with no legacy constraints. Ah! the joy of building something from scratch using the greatest and latest!&amp;#160; Notice the “1” and “2” on the covers of this and the other book? Well, it turns out people had quite some difficulty differentiating one from the other. So we re-designed the cover with the numbers now. Yes, we learned quite a bit on book design too. In addition to the end to end case study,&lt;/p&gt;  &lt;p&gt;In addition to the end-to-end scenario (the surveys application we use as the “case study”), a popular chapter has been: troubleshooting Windows Azure apps. My personal favorite content is the little framework we wrote for asynchronous processing with queues and workers. Seems like a common pattern and I’ve already used it in many places.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/gg490765.aspx"&gt;Windows Phone 7 Developer Guide&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The ying-yang of the Microsoft platform in one single book: small, portable devices on one end and the massive, infinitely scalable datacenter in the backend: Windows Phone 7 and Windows Azure. The most controversial aspects of the book? Use of the MVVM pattern is the by far top of the list. Second in the rankings? Use of &lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Rx (Reactive Extensions)&lt;/a&gt; for asynchronous communications. Rx is like Linq in its beginnings: mind twisting at first, confusing perhaps, too much “black magic”, but impossible to live without it afterwards. Glad to see the framework available broadly now: .NET, JavaScript, Silverlight, etc. &lt;/p&gt;  &lt;p&gt;With regards to MVVM, well…Silverlight might not be fully optimized for this pattern, but we still believe it is worth considering and paying the extra cost if things like testability are important for you. testability is important to us, so we decided to implement it and show you how. We ported &lt;a href="http://compositewpf.codeplex.com/"&gt;Prism&lt;/a&gt; to the phone and replaced &lt;a href="http://unity.codeplex.com/"&gt;Unity&lt;/a&gt; with &lt;a href="http://funq.codeplex.com/"&gt;Funq&lt;/a&gt; for increased efficiency. But of course you don’t have to use any of that. We do expect you to slice and dice the guide as you see fit. Go ahead rip it off. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;So, what’s next? What’s next comes in detail in the next post. But here’s in short: what we’d like to do is to extend the identity guide to include some really compelling and demanded scenarios (federation with social identity providers, SharePoint, Access Control Service, etc.) What do you think? Are you passionate about tokens and STSs and claims and WS-Federation, etc.? Have strong opinions on all of these? I’d love to know.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10120609" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Claims" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims/" /><category term="Windows Azure" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Azure/" /><category term="Identity Provider" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Identity+Provider/" /><category term="Windows Azure Architecture Guide" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Azure+Architecture+Guide/" /><category term="Windows Phone 7" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Phone+7/" /><category term="WAG" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/WAG/" /><category term="Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Identity/" /></entry><entry><title>Tailspin Surveys Mobile - An early screenshot</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2010/08/05/tailspin-surveys-mobile-an-early-screenshot.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2010/08/05/tailspin-surveys-mobile-an-early-screenshot.aspx</id><published>2010-08-05T18:19:36Z</published><updated>2010-08-05T18:19:36Z</updated><content type="html">&lt;p&gt;Our dev team is fearlessly building the first versions Tailspin Surveys Mobile. Here’s an early example of their work:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/6406.image_5F00_328E175E.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px; display: inline; border-top: 0px; border-right: 0px" class="wlDisabledImage" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7870.image_5F00_thumb_5F00_31497E7F.png" width="554" height="480" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now we are talking, huh?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10046694" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Tailspin" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Tailspin/" /><category term="Windows Phone 7" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Phone+7/" /></entry><entry><title>Tailspin Surveys–Windows Phone 7 edition–A guide to the Guide</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2010/08/03/tailspin-surveys-windows-phone-7-edition-a-guide-to-the-guide.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2010/08/03/tailspin-surveys-windows-phone-7-edition-a-guide-to-the-guide.aspx</id><published>2010-08-04T01:17:47Z</published><updated>2010-08-04T01:17:47Z</updated><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/8802.clip_5F00_image001_5F00_41C45F61.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/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/2047.clip_5F00_image001_5F00_thumb_5F00_347DD64E.jpg" width="596" height="480" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As adopted in all our recent guides, here’s a quick map for the entire &lt;strong&gt;&lt;em&gt;“Windows Phone 7 Developer Guide”&lt;/em&gt;&lt;/strong&gt; . No promises of course on the final scope. We might end up merging some chapters, deleting some other, etc. But this is our current intent.&lt;/p&gt;  &lt;p&gt;Feedback very welcome!   &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10045679" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Windows Azure" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Azure/" /><category term="Tailspin" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Tailspin/" /><category term="Windows Phone 7" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Phone+7/" /></entry><entry><title>Tailspin Surveys–Windows Phone 7– UI Mockups</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2010/08/03/tailspin-surveys-windows-phone-7-ui-mockups.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2010/08/03/tailspin-surveys-windows-phone-7-ui-mockups.aspx</id><published>2010-08-04T00:01:22Z</published><updated>2010-08-04T00:01:22Z</updated><content type="html">&lt;p&gt;Here’re some initial sketches of how Tailspin would look like and the navigation patterns we want to implement:&lt;/p&gt;  &lt;h4&gt;Navigation:&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1663.image_5F00_6762CBD8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px; display: inline; border-top: 0px; border-right: 0px" class="wlDisabledImage" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5367.image_5F00_thumb_5F00_06393FB7.png" width="640" height="457" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Home&lt;/strong&gt; will list all available surveys to this particular user.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Take Survey&lt;/strong&gt;, allows to start one particular survey from the home page. Many can be taken at the same time.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Survey Details&lt;/strong&gt; shows metadata about a survey: estimated length, number of questions, expiration.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Settings&lt;/strong&gt;, allows user to change some preferences (e.g. notifications) and configuration (e.g. credentials)&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Pressing “&lt;strong&gt;&lt;em&gt;back&lt;/em&gt;&lt;/strong&gt;” simply goes to home. Pressing “&lt;em&gt;&lt;strong&gt;back&lt;/strong&gt;&lt;/em&gt;” from &lt;strong&gt;&lt;em&gt;Home&lt;/em&gt;&lt;/strong&gt; exits the app.&lt;/p&gt;  &lt;h4&gt;The Home screen:&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/0676.image_5F00_01568BFB.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px; display: inline; border-top: 0px; border-right: 0px" class="wlDisabledImage" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/4606.image_5F00_thumb_5F00_2BC2BD18.png" width="640" height="429" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;The “Take Survey” screen:&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5873.image_5F00_5224A063.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" class="wlDisabledImage" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/4621.image_5F00_thumb_5F00_5F8AB369.png" width="601" height="542" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Users can take multiple surveys at the same time, but only one instance of each.&lt;/p&gt;  &lt;p&gt;The “Response area” depends on the question type. We are currently planning to support: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Free text&lt;/li&gt;    &lt;li&gt;Ranges (from 1 to 5)&lt;/li&gt;    &lt;li&gt;Multiple choice &lt;/li&gt;    &lt;li&gt;Voice clips&amp;#160; &lt;/li&gt;    &lt;li&gt;Pictures (taken with the camera)&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Navigation between questions is done with a lateral gesture. Pressing “&lt;strong&gt;&lt;em&gt;back&lt;/em&gt;&lt;/strong&gt;” saves whatever answers the user entered and then goes back &lt;strong&gt;&lt;em&gt;Home&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;h4&gt;The “Survey Details” screen:&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/8422.image_5F00_430DC189.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px; display: inline; border-top: 0px; border-right: 0px" class="wlDisabledImage" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/5488.image_5F00_thumb_5F00_7E612747.png" width="324" height="480" /&gt;&lt;/a&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;“Long tapping” on a specific survey shows a small context screen where the survey can be tagged as a “favorite” (for filtering) and basic info is displayed (e.g. estimated length, number of questions)&lt;/p&gt;    &lt;h4&gt;The “Settings” screen:&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/2148.image_5F00_3DBEDAD8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px; display: inline; border-top: 0px; border-right: 0px" class="wlDisabledImage" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/6378.image_5F00_thumb_5F00_61780272.png" width="312" height="480" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Not much on this one yet. We envision this screen to allow the user to enable or disable push notifications. This happens when the tailspin backend detects new surveys that match user criteria. It will also allow user to capture credential options and some other configuration. (Not sure about all this yet though)&lt;/p&gt;  &lt;p&gt;We’ll start sharing implementations of these very soon. Let us know what you think!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10045653" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Tailspin" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Tailspin/" /><category term="Windows Phone 7" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Phone+7/" /></entry><entry><title>Tailspin Surveys–Windows Phone 7 edition</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2010/08/02/tailspin-surveys-windows-phone-7-edition.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2010/08/02/tailspin-surveys-windows-phone-7-edition.aspx</id><published>2010-08-03T06:55:54Z</published><updated>2010-08-03T06:55:54Z</updated><content type="html">&lt;p&gt;Here’s a high level overview of the major components we are planning for &lt;a href="http://blogs.msdn.com/b/eugeniop/archive/2010/07/15/what-s-next-tailspin-goes-mobile.aspx"&gt;Talspin Surveys&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/0167.image_5F00_1FAF57F1.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px; display: inline; border-top: 0px; border-right: 0px" class="wlDisabledImage" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/1541.image_5F00_thumb_5F00_4B1378EB.png" width="640" height="477" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A few notes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The backend is essentially an extension to Tailspin surveys as described an implemented in the &lt;a href="http://wag.codeplex.com/"&gt;Windows Azure Architecture Guide (Part 2&lt;/a&gt;).&lt;/li&gt;    &lt;li&gt;There’s now a new services head (an OData/JSON API) that is used by the devices.&lt;/li&gt;    &lt;li&gt;Tailspin also has a “mobile website” to enable phone users to subscribe and download the app from the marketplace.&lt;/li&gt;    &lt;li&gt;There are new survey question types that are specific for the phone:&lt;/li&gt;    &lt;/ul&gt;&lt;ul&gt;     &lt;li&gt;Photos.&lt;/li&gt;      &lt;li&gt;Voice.&lt;/li&gt;      &lt;li&gt;GPS location.&lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;&lt;li&gt;Users of the app can subscribe to surveys that match a specific criteria (e.g. “surveys that take less than 10 min” or “surveys from “Adatum”).&lt;/li&gt;    &lt;li&gt;Tailspin backend will use push notifications to advertise new surveys that match the user selection criteria.&lt;/li&gt;    &lt;li&gt;The application architecture is pretty straightforward:&lt;/li&gt;    &lt;/ul&gt;&lt;ul&gt;     &lt;li&gt;It will operate always regardless of network status. &lt;/li&gt;      &lt;li&gt;The app always goes against local storage (isolated storage files).&lt;/li&gt;      &lt;li&gt;A separate task will send results back to the backend service and download new surveys available to the user.&lt;/li&gt;      &lt;li&gt;This task is likely to be a background thread in the same app.&lt;/li&gt;      &lt;li&gt;UI will follow all WP7 guidelines as documented &lt;a href="http://windowsteamblog.com/windows_phone/b/wpdev/archive/2010/07/27/windows-phone-7-design-resources-ui-guide-and-design-templates.aspx"&gt;here&lt;/a&gt;.&lt;/li&gt;   &lt;/ul&gt;   &lt;p&gt;We are very close to have a first early release on Codeplex.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10045263" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Windows Azure" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Azure/" /><category term="Windows Phone 7" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Phone+7/" /></entry><entry><title>Claims Identity Guide samples updated</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2010/08/02/claims-identity-guide-samples-updated.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2010/08/02/claims-identity-guide-samples-updated.aspx</id><published>2010-08-03T06:26:43Z</published><updated>2010-08-03T06:26:43Z</updated><content type="html">&lt;p&gt;I’ve just uploaded to CodePlex updated samples for the &lt;a href="http://msdn.microsoft.com/en-us/library/ff423674.aspx"&gt;Claims based Identity Guide&lt;/a&gt;. This have all been adapted to work on Visual Studio 2010, .NET 4.0 and MVC 2.0. See &lt;a href="http://claimsid.codeplex.com/releases/view/50000"&gt;here for downloading&lt;/a&gt; the bits.&lt;/p&gt;  &lt;p&gt;From the release notes:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Required configuration changes for IIS, DevFabric and Windows Azure&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Both solutions &lt;strong&gt;&lt;em&gt;1-SingleSignOn&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;5-WindowsAzure&lt;/em&gt;&lt;/strong&gt; involve the &lt;em&gt;&lt;strong&gt;a-expense.ClaimsAware&lt;/strong&gt;&lt;/em&gt; project.    &lt;br /&gt;This solution is configured by default to run hosted in IIS, but the solution &lt;strong&gt;&lt;em&gt;5-WindowsAzure&lt;/em&gt;&lt;/strong&gt; will run in a different environment (DevFabric and Windows Azure).    &lt;br /&gt;Please find the notes about the required required in the microsoft.identityModel section of the web.config of the a-expense.ClaimsAware project.    &lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Cookies encrypted using RSA&lt;/b&gt;    &lt;br /&gt;As mentioned in the guide, the federation cookies are now encrypted using an RSA algorithm as we recommend in the guide. This change enables the involved sites to support web farm scenarios. This involves the following changed lines from the previous release:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;In global.asax.cs&lt;/b&gt;&lt;/p&gt;  &lt;pre&gt;protected void Application_Start()
{
	FederatedAuthentication.ServiceConfigurationCreated += this.OnServiceConfigurationCreated;            

	...
}

private void OnServiceConfigurationCreated(object sender, ServiceConfigurationCreatedEventArgs e)
{
	List&amp;lt;CookieTransform&amp;gt; sessionTransforms =
	new List&amp;lt;CookieTransform&amp;gt;(
	new CookieTransform[] 
		{
		new DeflateCookieTransform(), 
		new RsaEncryptionCookieTransform(e.ServiceConfiguration.ServiceCertificate),
		new RsaSignatureCookieTransform(e.ServiceConfiguration.ServiceCertificate) 
		});
	SessionSecurityTokenHandler sessionHandler = new SessionSecurityTokenHandler(sessionTransforms.AsReadOnly());

	e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(sessionHandler);
}
									&lt;/pre&gt;

&lt;p&gt;These are exactly the same settings we use in the &lt;a href="http://msdn.microsoft.com/en-us/library/ff728592.aspx"&gt;Windows Azure Architecture Guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;In web.config:&lt;/b&gt;&lt;/p&gt;

&lt;pre&gt;&amp;lt;configuration&amp;gt;
    ...
    &amp;lt;microsoft.identityModel&amp;gt;
        ...
        &amp;lt;service&amp;gt;
            ...
			&amp;lt;serviceCertificate&amp;gt;
                &amp;lt;certificateReference x509FindType=&amp;quot;FindBySubjectDistinguishedName&amp;quot; findValue=&amp;quot;CN=localhost&amp;quot;/&amp;gt;
			&amp;lt;/serviceCertificate&amp;gt;
        &amp;lt;/service&amp;gt;
    &amp;lt;/microsoft.identityModel&amp;gt;
&amp;lt;/configuration&amp;gt;
									&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;Request validation in ASP.NET 4&lt;/b&gt;

  &lt;br /&gt;ASP.NET by default validates all the POSTs done to the web application. This validation checks that the input is not dangerous. By default, an XML document that is not encoded is considered dangerous by ASP.NET. A token is normally submitted to the site as an XML document that is not encoded. To avoid getting an exception when the token is posted, you will add a class that will check if the input is indeed a security token. If it is it will return true and will let the request continue. If not, it will throw the regular &amp;quot;A potentially dangerous Request.Form value was detected...&amp;quot; exception.&lt;/p&gt;

&lt;p&gt;The class &lt;strong&gt;&lt;em&gt;WsFederationRequestValidator&lt;/em&gt;&lt;/strong&gt; has been added for this purpose and it is enabled through the following web.config line: &lt;/p&gt;

&lt;pre&gt;&amp;lt;system.web&amp;gt;
    &amp;lt;httpRuntime requestValidationType=&amp;quot;WsFederationRequestValidator&amp;quot; /&amp;gt;
&amp;lt;/system.web&amp;gt;&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10045259" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Federated Identity" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Federated+Identity/" /><category term="Claims" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims/" /><category term="SSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/SSO/" /><category term="Windows Azure" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Azure/" /><category term="WebSSO" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/WebSSO/" /><category term="Claims Guide" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Claims+Guide/" /><category term="Windows Azure Architecture Guide" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Azure+Architecture+Guide/" /><category term="WIF" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/WIF/" /></entry><entry><title>What’s next? Tailspin goes mobile…</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2010/07/15/what-s-next-tailspin-goes-mobile.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2010/07/15/what-s-next-tailspin-goes-mobile.aspx</id><published>2010-07-16T00:50:17Z</published><updated>2010-07-16T00:50:17Z</updated><content type="html">&lt;p&gt;Now that the &lt;a href="http://wag.codeplex.com/"&gt;Windows Azure Architecture Guide – Part 2&lt;/a&gt; is “done” (Done = content is complete and production is taking place. Production = index, covers, PDF conversion, etc), our team is ready for the next adventure. &lt;/p&gt;  &lt;p&gt;Our fictitious ISV, Tailspin, is very innovative and wants to stay on the latest and greatest. Now they want to extend their flagship application: Tailspin Surveys, to mobile users. The essential idea being to allow its customers (Adatum, Fabrikam, etc) to publish surveys to people with Windows Phone 7 devices, so they can capture information from the field.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/8156.image_5F00_65D0B44D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="wlDisabledImage" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/6177.image_5F00_thumb_5F00_3E2A3823.png" width="640" height="429" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This is a “mobile front-end” interacting with a “cloud backend” scenario.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Note: Tailspin backend is mostly covered in the Windows Azure Guide, but we will extend it to support new user stories that are specific to the mobile client. So expect a different version included in the new guide.&lt;/em&gt;&lt;/p&gt;  &lt;h3&gt;Detailed scenario (hidden agenda items in &lt;font color="#ff0000"&gt;red&lt;/font&gt;)&lt;/h3&gt;  &lt;p&gt;&lt;strong&gt;TailSpin&lt;/strong&gt;: the “SaaS” ISV (this is covered in WAAG Part 2)&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Develops a multitenant “survey as a service” for a wide range of companies (with “Big IT” and with “Small IT”) &lt;/li&gt;    &lt;li&gt;Hosts the application on Windows Azure (&lt;font color="#ff0000"&gt;service endpoint for WP7 app to interact: REST? SOAP? Chunky? Chatty?&lt;/font&gt;) &lt;/li&gt;    &lt;li&gt;Develops a WP7 application for ��surveyors” (people taking surveys) (&lt;font color="#ff0000"&gt;packaging the app&lt;/font&gt;) &lt;/li&gt;    &lt;li&gt;Publishes the WP7 application to the Application Marketplace (&lt;font color="#ff0000"&gt;Publishing the app, certification process, versions, trials and betas&lt;/font&gt;) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Fabrikam &amp;amp; Adatum&lt;/strong&gt; (companies subscribing to TailSpin’s service)&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;(Self) design and launch surveys using TailSpin’s app (&lt;font color="#ff0000"&gt;surveys now will have a target geography, used for “get surveys near me”&lt;/font&gt;) &lt;/li&gt;    &lt;li&gt;Waits for collected information &lt;/li&gt;    &lt;li&gt;Browses and analyzes results (&lt;font color="#ff0000"&gt;added data-points captured by the phone: geo-location, voice, pictures, barcodes&lt;/font&gt;) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;People with WP7:&lt;/strong&gt; “surveyors” &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Own a WP7 device (&lt;font color="#ff0000"&gt;browse the Tailspin mobile website, download the app from the Application Marketplace&lt;/font&gt;) &lt;/li&gt;    &lt;li&gt;They “work from home” &lt;/li&gt;    &lt;li&gt;They subscribe to surveys that are targeted to the place they are (&lt;font color="#ff0000"&gt;location based search, like “Surveys 40 miles from Redmond”&lt;/font&gt;) &lt;/li&gt;    &lt;li&gt;They are notified of new surveys available that match their subscription criteria (&lt;font color="#ff0000"&gt;push notifications&lt;/font&gt;) &lt;/li&gt;    &lt;li&gt;They complete the surveys (&lt;font color="#ff0000"&gt;UI design, app state, connectivity management, sending results back to the service-&amp;gt; service design, authenticating, being a “good citizen app”, resource management like battery levels&lt;/font&gt;) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In this scenario, the “surveyors” could answer for themselves, but our current preference would be that they’ll interview others or would provide multiple answers (think someone surveying homes or traffic patterns in different places or someone going from home to home in a neighborhood collecting information).&lt;/p&gt;  &lt;p&gt;You can imagine a mechanism were there’s compensation for surveyors from the companies that submit the survey: Adatum could pay for every “x submitted surveys” or there might even be a “coupon” system: “every 10 surveys you get a discount coupon for the supermarket”. &lt;/p&gt;  &lt;p&gt;As usual, the surveys application is just an excuse to discuss the design patterns behind the solution (all the &lt;font color="#ff0000"&gt;red&lt;/font&gt; things above). The entire app will be functionally incomplete, but technically sound.&lt;/p&gt;  &lt;p&gt;The current (draft) structure for the guide is the following:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/7242.image_5F00_0BC664A4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px; display: inline; border-top: 0px; border-right: 0px" class="wlDisabledImage" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-38-15-metablogapi/2376.image_5F00_thumb_5F00_5D6CDEF6.png" width="586" height="480" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Feedback of course, is greatly welcome! &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:55f7bb11-a166-45ce-b2c5-0237f55f7e2a" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Windows+Phone+7" rel="tag"&gt;Windows Phone 7&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Mobile" rel="tag"&gt;Mobile&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Windows+Azure" rel="tag"&gt;Windows Azure&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Windows+Azure+Architecture+Guide" rel="tag"&gt;Windows Azure Architecture Guide&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Tailspin" rel="tag"&gt;Tailspin&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10038909" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Windows Azure" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Azure/" /><category term="Windows Azure Architecture Guide" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Azure+Architecture+Guide/" /><category term="Tailspin" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Tailspin/" /><category term="Windows Phone 7" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Windows+Phone+7/" /><category term="Mobile" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Mobile/" /></entry><entry><title>Happy birthday USA!</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/eugeniop/archive/2010/07/04/happy-birthday-usa.aspx" /><id>http://blogs.msdn.com/b/eugeniop/archive/2010/07/04/happy-birthday-usa.aspx</id><published>2010-07-05T05:56:41Z</published><updated>2010-07-05T05:56:41Z</updated><content type="html">&lt;p&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/commons/a/a4/Flag_of_the_United_States.svg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="File:Flag of the United States.svg" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/800px-Flag_of_the_United_States.svg.png" width="255" height="134" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10034427" width="1" height="1"&gt;</content><author><name>eugeniop</name><uri>http://blogs.msdn.com/eugeniop/ProfileUrlRedirect.ashx</uri></author><category term="Other" scheme="http://blogs.msdn.com/b/eugeniop/archive/tags/Other/" /></entry></feed>
