<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Eugenio Pace - Cloud Computing Guidance</title><link>http://blogs.msdn.com/eugeniop/default.aspx</link><description>Clouds: one thing we really know about here in Redmond, WA, USA</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>First experiments with (new) SQL Data Services</title><link>http://blogs.msdn.com/eugeniop/archive/2009/06/12/first-experiments-with-new-sql-data-services.aspx</link><pubDate>Fri, 12 Jun 2009 19:03:29 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9737543</guid><dc:creator>eugeniop</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/eugeniop/comments/9737543.aspx</comments><wfw:commentRss>http://blogs.msdn.com/eugeniop/commentrss.aspx?PostID=9737543</wfw:commentRss><description>&lt;p&gt;Last week I got my new login to the new &lt;a href="http://www.microsoft.com/azure/data.mspx"&gt;SQL Data Services&lt;/a&gt;. As a reminder for all readers:&lt;/p&gt;  &lt;h5&gt;&lt;em&gt;SDS accelerates its plans to offer relational capabilities &lt;/em&gt;&lt;/h5&gt;  &lt;p&gt;&lt;em&gt;May 11, 2009 - Based on customer feedback, SDS has accelerated its plans and will be offering true relational capabilities through SQL Server’s existing network protocol, Tabular Data Stream (TDS) and existing query language Transact-SQL (T-SQL). This will provide customers direct access to the familiar relational model, T-SQL programming language and the existing development and management tools, while continuing to deliver on our key value props of fault tolerance, high availability, friction free provisioning and pay as you grow scaling. For more information, see the &lt;/em&gt;&lt;a href="http://www.microsoft.com/azure/data.mspx"&gt;&lt;em&gt;SDS product site&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and the &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd557595.aspx"&gt;&lt;em&gt;MSDN Library&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;What I’ve done? After some initial “hello world-ish” tests, I wanted to try something more interesting so I decided to port &lt;a href="http://www.codeplex.com/azureissuetracker"&gt;IssueTracker&lt;/a&gt; into SDS. &lt;/p&gt;  &lt;p&gt;As you know, &lt;strong&gt;&lt;em&gt;IssueTracker&lt;/em&gt;&lt;/strong&gt; was originally designed for SDS’ previous ACE model (Authority, Container, Entity), so my first task was to re-write the data access layer to use SQL Server. &lt;/p&gt;  &lt;p&gt;One of my goals in this experiment was to test SDS “&lt;a href="http://en.wikipedia.org/wiki/Impedance_matching"&gt;impedance match&lt;/a&gt;” with on-premises SQL Server. Also, I wanted to develop independently of the availability of SDS. Not that SDS is unreliable, but currently it is available only inside Microsoft’s corporate network. I didn’t want to VPN into corpnet for this when working from home.&lt;/p&gt;  &lt;p&gt;So I chose to develop exclusively against my local SQL Express instance first and then make a switch to the real SDS.&lt;/p&gt;  &lt;p&gt;Fortunately, the app was designed with a couple of layers that isolated the persistence details, so writing the new data tier was a fairly mechanical process. &lt;/p&gt;  &lt;p&gt;This diagram roughly captures the architecture:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.codeplex.com/azureissuetracker"&gt;&lt;/a&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/FirstexperimentswithSQLDataServices_7AB8/clip_image001_2.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/FirstexperimentswithSQLDataServices_7AB8/clip_image001_thumb.gif" width="3" height="3" /&gt;&lt;/a&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/FirstexperimentswithSQLDataServices_7AB8/clip_image002_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/FirstexperimentswithSQLDataServices_7AB8/clip_image002_thumb.jpg" width="629" height="478" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The repository classes implement a common interface the app uses, the Model is just a collection of rather simple C# objects with no knowledge of the database being used. The Mappers are responsible for the transformations between the application model and the entities that do have knowledge of the database.&lt;/p&gt;  &lt;p&gt;In the diagram, classes marked with &lt;font color="#ff0000" size="4"&gt;&lt;strong&gt;*&lt;/strong&gt;&lt;/font&gt; are new, the numbers indicate variability points in the implementation, meaning that I can switch between one implementation and the other. Because I used LINQ to SQL, the types in the box labeled as “SQL Model” were generated     &lt;br /&gt;automatically by the LINQ to SQL designer.&lt;/p&gt;  &lt;p&gt;When my unit tests compiled again, I switched the connection string to point from the “.\SQLEXPRESS” to the SDS instance in our network and…it worked! First attempt!&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/FirstexperimentswithSQLDataServices_7AB8/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/FirstexperimentswithSQLDataServices_7AB8/image_thumb.png" width="404" height="411" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Overall, it was a rather painless and pleasant experience. Of course the data model in the app is simple and I’m not using any advanced queries or any sophisticated features in SQL yet.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Things missing and Possible next steps:&lt;/h2&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;The original implementation had 2 requirements that leveraged features in SDS previous ACE model: &lt;/p&gt;  &lt;p&gt;1- &lt;b&gt;Multi-tenant isolation&lt;/b&gt;: achieved through containers. Each tenant got its own container.&lt;/p&gt;  &lt;p&gt;2- &lt;b&gt;Schema flexibility&lt;/b&gt;: tenants could customize the application, extending the schema of some core entities. Flexible entities made this very easy, because they are essentially property bags.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;For #1, I considered two options:&lt;/p&gt;  &lt;p&gt;1- Partitioning by tenant&lt;/p&gt;  &lt;p&gt;2- Do not partition at all and have all tenants on the same database (single-instance, multi-tenant)&lt;/p&gt;  &lt;p&gt;The first option is fairly straight forward. Each tenant gets its own database that is created at provisioning time. The “tenant id” is part of the calling context in the application, so I dynamically connect to each database as needed. Two advantages of this approach: there’s high isolation between tenants (no data from one can leak into another), and the application code is simpler, because from the data perspective, the application is “single-tenant”.&lt;/p&gt;  &lt;p&gt;I haven’t implemented the extensibility feature yet, but I’m planning on reusing some techniques we did some research on &lt;a href="http://msdn.microsoft.com/en-us/library/aa479086.aspx"&gt;in the past&lt;/a&gt;, probably through extension tables.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;There’re other interesting areas for research such as:&lt;/p&gt;  &lt;p&gt;1- &lt;b&gt;Strategies for partitioning&lt;/b&gt;: in discussions with &lt;a href="http://dunnry.com/blog/"&gt;Ryan&lt;/a&gt;, he suggested I should consider more sophisticated ways of partitioning the information: by tenant, by tenant + project, etc. and I agree this would be interesting .&lt;/p&gt;  &lt;p&gt;2- &lt;b&gt;Unit of Work&lt;/b&gt;: currently I’m simply reusing the original ACE implicit &lt;strong&gt;&lt;em&gt;UoW&lt;/em&gt;&lt;/strong&gt; that comes with each interaction. This is, each time you called Create, Delete or Update on SDS, the operation was completed in the context of a unit of work. You could not logically group multiple operation (say, 2 creates and 1 delete). This is suboptimal with the SQL implementation, because the new SDS supports transactions and I would like to leverage that.&lt;/p&gt;  &lt;p&gt;3- &lt;b&gt;Performance and scalability issues&lt;/b&gt;: I haven’t spent any time looking at the application’s “chattiness” with the database that might lead to degraded performance, or any other data access optimizations. This is a whole area in itself, but not very different from “regular” application development. The only exception perhaps is that, in theory at least, the app and the database can be hosted in different datacenters (say the app in Amazon and the data in SDS). I’m not sure that would be a good idea anyway, probably not for this scenario. If the app was hosted in Windows Azure &lt;em&gt;and&lt;/em&gt; used SDS, then they would be &lt;em&gt;close&lt;/em&gt; in terms of network distance (low latency &amp;amp; high bandwidth).&amp;#160; &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9737543" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx">SaaS</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Build/default.aspx">S+S_Build</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/SQL+Server+Data+Services/default.aspx">SQL Server Data Services</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Azure+Services+Platform/default.aspx">Azure Services Platform</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Azure/default.aspx">Azure</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/SDS/default.aspx">SDS</category></item><item><title>Windows Azure 101 – Primitives and Application Patterns – Playing Mendeleyev</title><link>http://blogs.msdn.com/eugeniop/archive/2009/03/18/windows-azure-101-primitives-and-application-patterns-playing-mendeleyev.aspx</link><pubDate>Wed, 18 Mar 2009 23:42:44 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9488478</guid><dc:creator>eugeniop</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/eugeniop/comments/9488478.aspx</comments><wfw:commentRss>http://blogs.msdn.com/eugeniop/commentrss.aspx?PostID=9488478</wfw:commentRss><description>&lt;p&gt;Windows Azure’s primitives are very simple, but as in many other things, the power comes from the combination of these simpler primitives to create more complex things. &lt;/p&gt;  &lt;p&gt;Look around and see how many things can be assembled from a little more than &lt;a href="http://en.wikipedia.org/wiki/Periodic_table"&gt;100 “simple” elements&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;In Windows Azure,&amp;#160; there are essentially 2 types of building blocks: code hosts blocks and persistent bocks&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/WindowsAzure101PrimitivesandApplicationP_EAAC/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/WindowsAzure101PrimitivesandApplicationP_EAAC/image_thumb_1.png" width="650" height="373" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The code hosts run (your) code, the persistence blocks store data.&lt;/p&gt;  &lt;p&gt;There are 2 types of Code Hosts:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Interactive&lt;/strong&gt;: ASP.NET &amp;amp; WCF &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Non-interactive&lt;/strong&gt;: Worker&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The &lt;strong&gt;&lt;em&gt;interactive&lt;/em&gt;&lt;/strong&gt; building blocks, whether it is a human initiated interaction (ASP.NET) or a programmatic interaction (WCF), is what is referred in Windows Azure terminology as a &lt;strong&gt;“Web Role”&lt;/strong&gt;.&amp;#160; The web role is specialized in “request – response” types of interactions. A user or a program submits a requests, the request is received, analyzed and processed, then a response is sent back. The goal is to process a lot of these concurrent requests and to keep the time between a request and a response as small as possible.&lt;/p&gt;  &lt;p&gt;The non-interactive building block is known in Windows Azure as “&lt;strong&gt;Worker Role&lt;/strong&gt;”, and it is the classic background processor.&amp;#160; &lt;/p&gt;  &lt;p&gt;There are 3 persistence building blocks. All of them store information, but have specialized functions:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Table&lt;/strong&gt;: stores records with properties&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Blobs&lt;/strong&gt;: stores “things” with associated metadata&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Queue&lt;/strong&gt;: stores strings with FIFO semantics for retrieval&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;That’s it.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;So let’s explore what you could do with this.&lt;/p&gt;  &lt;p&gt;A relatively simple web site, like a simple blog engine would be this:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/WindowsAzure101PrimitivesandApplicationP_EAAC/image_8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/WindowsAzure101PrimitivesandApplicationP_EAAC/image_thumb_3.png" width="596" height="427" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The front end web role is the app itself: pages, views, controllers, (whatever you use for the logic of the app). All operations (reads/writes) against the store where posts, comments and images would be stored are &lt;u&gt;synchronous&lt;/u&gt;.&lt;/p&gt;  &lt;p&gt;Adding one block will give you an RSS feed (e.g. using Syndication APIs in WCF):&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/WindowsAzure101PrimitivesandApplicationP_EAAC/image_10.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/WindowsAzure101PrimitivesandApplicationP_EAAC/image_thumb_4.png" width="611" height="456" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;And now you can independently manage (e.g. scale) your web viewers from those using an aggregator. &lt;/p&gt;  &lt;p&gt;Now let’s imagine you’d like to create a heat map similar to the one you see in my blog, showing where are your readers are located. One possible way of solving this calling a components in the RSS or Web nodes providing as input the IP address of the requestor. The component would then lookup somewhere the country or region associated with the IP address and add one to the counter of that specific country/region. This computation will take penalize the request/response for something that the reader is not necessarily interested in. Besides the lookup IP/country might depend on an external call to another service, with even further penalties. &lt;/p&gt;  &lt;p&gt;A better solution would be to offload these to another (background) process that con compute the information with minimal cost to the original request:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/WindowsAzure101PrimitivesandApplicationP_EAAC/image_12.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/WindowsAzure101PrimitivesandApplicationP_EAAC/image_thumb_5.png" width="612" height="478" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Now the front end nodes will only pay the cost of writing to a queue. The lookup/conversion/heat map generation is done in the background by the worker. You can imagine dynamically creating new instances of the worker if the queue gets too long. Anything that can be postponed for a while, can be pushed to an asynchronous worker for processing (e.g. reporting, analysis, etc)&lt;/p&gt;  &lt;p&gt;These are just 6 elements in Microsoft’s larger &lt;em&gt;table of elements&lt;/em&gt; for cloud development (.NET Services, SQL Data Services, etc).&lt;/p&gt;  &lt;p&gt;These patterns are of course well known (and old :-)), but are proven. Windows Azure gives us a nice way of implementing them plus a way of managing them once they are deployed.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ef17d6a7-b199-4430-8fac-612e760e47e1" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Azure" rel="tag"&gt;Azure&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9488478" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx">SaaS</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Build/default.aspx">S+S_Build</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Azure+Services+Platform/default.aspx">Azure Services Platform</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Azure/default.aspx">Azure</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Windows+Azure/default.aspx">Windows Azure</category></item><item><title>Azure IssueTracker Enterprise - Simple Demos</title><link>http://blogs.msdn.com/eugeniop/archive/2009/03/16/azure-issuetracker-enterprise-simple-demos.aspx</link><pubDate>Mon, 16 Mar 2009 20:09:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9481891</guid><dc:creator>eugeniop</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/eugeniop/comments/9481891.aspx</comments><wfw:commentRss>http://blogs.msdn.com/eugeniop/commentrss.aspx?PostID=9481891</wfw:commentRss><description>&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Provisioning IssueTracker Enterprise:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Highlights:&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;There’s no direct interaction with Access Control Service. IssueTracker uses ACS API to create the scopes, rules and the issuer (Contoso). &lt;/li&gt;    &lt;li&gt;The provisioning form captures all the required information to setup the trust relationship between Access Controls Service and the tenant (certificate, etc) &lt;/li&gt; &lt;/ul&gt; &lt;iframe style="width: 825px; height: 617px" src="http://silverlight.services.live.com/invoke/5721/Provisioning%20IT%20Enterprise/iframe.html" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Tenant (Contoso_Enterprise) uses IssueTracker Enterprise from a Smart Client (Active Profile):&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Highlights:&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Tenant STS is configured:      &lt;ul&gt;       &lt;li&gt;Tenant name that must be the same as the name used in the provisioning form. &lt;/li&gt;        &lt;li&gt;Signing certificate thumbprint: this is used internally to retrieve the certificate form the store. Thumbprint can be obtained from the certificate properties. &lt;/li&gt;        &lt;li&gt;&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt; &lt;iframe style="width: 825px; height: 617px" src="http://silverlight.services.live.com/invoke/5721/IT%20Using%20Service/iframe.html" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Tenant Manages IssueTracker Enterprise from PowerShell scripts:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Highlights:&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;PowerShell CmdLets are registered &lt;/li&gt;    &lt;li&gt;Management User disables the application (passing a parameter to define reason) &lt;/li&gt;    &lt;li&gt;Business User attempts to use the system, gets an error message (with the above reason) &lt;/li&gt;    &lt;li&gt;Management user enables application back &lt;/li&gt; &lt;/ul&gt; &lt;iframe style="width: 825px; height: 617px" src="http://silverlight.services.live.com/invoke/5721/IT%20Management/iframe.html" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Tenant changes STS configuration issuing different Claims:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Highlights:&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Tenant changes one of the output claims to “Program Manager”. In the real implementation this could be a user moving from group in Active Directory to another &lt;/li&gt;    &lt;li&gt;System rejects access as the claim is not recognized as input to any rule in ACS &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;iframe style="width: 825px; height: 617px" src="http://silverlight.services.live.com/invoke/5721/Changing%20STS%20claims/iframe.html" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9481891" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx">SaaS</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Build/default.aspx">S+S_Build</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Federated+Identity/default.aspx">Federated Identity</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Claims/default.aspx">Claims</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Azure+Services+Platform/default.aspx">Azure Services Platform</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Access+Control+Service/default.aspx">Access Control Service</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/.NET+Services/default.aspx">.NET Services</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/IssueTracker/default.aspx">IssueTracker</category></item><item><title>Architecting Cloud Application for the Enterprise – Part V – Management</title><link>http://blogs.msdn.com/eugeniop/archive/2009/03/12/architecting-cloud-application-for-the-enterprise-part-v-management.aspx</link><pubDate>Thu, 12 Mar 2009 22:41:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9472297</guid><dc:creator>eugeniop</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/eugeniop/comments/9472297.aspx</comments><wfw:commentRss>http://blogs.msdn.com/eugeniop/commentrss.aspx?PostID=9472297</wfw:commentRss><description>&lt;p&gt;Having solved the identity issue, the &lt;strong&gt;&lt;em&gt;SuperCloudySoftware&lt;/em&gt;&lt;/strong&gt; team focuses then on the management requirements raised in the meeting with &lt;strong&gt;&lt;em&gt;VeryBigCorp&lt;/em&gt;&lt;/strong&gt; CIO.&lt;/p&gt;  &lt;p&gt;To recap, they want to:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Be able to to monitor &lt;strong&gt;&lt;em&gt;IssueTracker&lt;/em&gt;&lt;/strong&gt; from their existing infrastructure, that happens to be System Center Operations Manager (SCOM) and eventually author new rules to correlate &lt;strong&gt;&lt;em&gt;IssueTracker&lt;/em&gt;&lt;/strong&gt; specific events with other events that are generated inside their boundaries. &lt;/li&gt;    &lt;li&gt;Be able to logically disable and enable &lt;strong&gt;&lt;em&gt;IssueTracker&lt;/em&gt;&lt;/strong&gt; for users from SCOM and &lt;/li&gt;    &lt;li&gt;Be able to change claim mappings for authorization purposes from within standard tools (e.g. they don’t want to use a new web portal but would be happy with an &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Management_Console"&gt;MMC Snap-In&lt;/a&gt;) &lt;/li&gt;    &lt;li&gt;As with their other (business) users, they want seamless integration for their IT staff: no login, no pop-up, etc. If an authenticated user of their network is authorized to do monitoring, he /she should be able to do it without any additional checks. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;John and his team realize that the Web dashboard for monitoring is not enough for these requirements. It is still a good thing for their smaller Customers that don’t care too much about it anyway except when there are problems, but it will not work for &lt;strong&gt;&lt;em&gt;VeryBigCorp&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;The team realizes that they need to do a couple of things:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Instrument the application to gather information and to provide some level of control (e.g. enable/disable) &lt;/li&gt;    &lt;li&gt;Create an external API for management &lt;/li&gt;    &lt;li&gt;Create common clients for that API (e.g. PowerShell CmdLets, SCOM Management pack, etc) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Of course securing the API is relatively easy now that they have a claims based architecture as described in the previous post and can federate with consumers. They can leverage the same rules for granting access to this API: for example, &lt;strong&gt;&lt;em&gt;VeryBigCorp&lt;/em&gt;&lt;/strong&gt; would just need to define what claims will be mapped to the “Enable Application” claim that &lt;strong&gt;&lt;em&gt;IssueTracker&lt;/em&gt;&lt;/strong&gt; will expect.&lt;/p&gt;  &lt;p&gt;The high level solution is illustrated below:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="mgmt-it" border="0" alt="mgmt-it" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationfortheEnterp_7F6E/mgmt-it_1.png" width="646" height="519" /&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;To simplify things even further, &lt;strong&gt;&lt;em&gt;SuperCloudySoftware&lt;/em&gt;&lt;/strong&gt; pre-configures the client library and the clients. So, just after provisioning, a client library will be automatically generated for the Customer with all the necessary information: more specifically, the information to setup WS-TRUST between &lt;strong&gt;&lt;em&gt;IssueTracker&lt;/em&gt;&lt;/strong&gt;, Access Control Service and the company (STS address, certificate, etc):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationfortheEnterp_7F6E/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationfortheEnterp_7F6E/image_thumb.png" width="664" height="516" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;VeryBigCorp&lt;/em&gt;&lt;/strong&gt; IT staff can then download the (pre-configured) tools from IssueTracker web site and they will “just work” as long as the logged in user provides the right credentials:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationfortheEnterp_7F6E/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationfortheEnterp_7F6E/image_thumb_1.png" width="676" height="370" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationfortheEnterp_7F6E/image_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationfortheEnterp_7F6E/image_thumb_2.png" width="680" height="441" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Notice there’s no need to specify who the tenant is, where the IssueTracker Management endpoint is, etc. All of that is built into the client library that the CmdLet uses.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;SuperCloudySoftware&lt;/strong&gt; &lt;/em&gt;strategy is to supply 3 experiences: MMC, PowerShell CmdLets and a SCOM Management Pack, but if there’s a customer with special needs (e.g. they are using &lt;a href="http://www-01.ibm.com/software/tivoli/"&gt;Tivoli&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/OpenView"&gt;HP OpenView&lt;/a&gt;), they also provide an API (secured with WS-TRUST).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Next article we will dive deeper into some implementation details of both the security and management aspects. As mentioned before, all of these is available in the download &lt;a href="http://azureissuetracker.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24479"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9472297" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx">SaaS</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Run/default.aspx">S+S_Run</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Federated+Identity/default.aspx">Federated Identity</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Claims/default.aspx">Claims</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Azure+Services+Platform/default.aspx">Azure Services Platform</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Access+Control+Service/default.aspx">Access Control Service</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/.NET+Services/default.aspx">.NET Services</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/IssueTracker/default.aspx">IssueTracker</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/SaaS+Management/default.aspx">SaaS Management</category></item><item><title>Architecting Cloud Applications for the Enterprise – Part IV - SuperCloudySoftware sketches IssueTracker Enterprise Edition</title><link>http://blogs.msdn.com/eugeniop/archive/2009/03/09/architecting-cloud-applications-for-the-enterprise-part-iv-supercloudysoftware-sketches-issuetracker-enterprise-edition.aspx</link><pubDate>Tue, 10 Mar 2009 03:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9468609</guid><dc:creator>eugeniop</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/eugeniop/comments/9468609.aspx</comments><wfw:commentRss>http://blogs.msdn.com/eugeniop/commentrss.aspx?PostID=9468609</wfw:commentRss><description>&lt;P&gt;In the &lt;A href="http://blogs.msdn.com/eugeniop/archive/2008/12/10/architecting-cloud-applications-for-the-enterprise-part-iii-supercloudysoftware-meets-verybigcorp-cio.aspx" mce_href="http://blogs.msdn.com/eugeniop/archive/2008/12/10/architecting-cloud-applications-for-the-enterprise-part-iii-supercloudysoftware-meets-verybigcorp-cio.aspx"&gt;previous article&lt;/A&gt;, we explored the challenges of building services for an enterprise, illustrating those through a dialogue between &lt;STRONG&gt;&lt;EM&gt;VeryBigCorp &lt;/EM&gt;&lt;/STRONG&gt;CIO and a team from &lt;EM&gt;&lt;STRONG&gt;SuperCloudySoftware&lt;/STRONG&gt;&lt;/EM&gt;. &lt;/P&gt;
&lt;P&gt;VBC requirements can be summarized as:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Identity integration (including Single Sign On and management of access policies) &lt;/LI&gt;
&lt;LI&gt;Management integration (ability to monitor and act on &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; from within VBC’s management environment) &lt;/LI&gt;
&lt;LI&gt;Application integration (ability to call &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; programmatically from other VBC’s applications) &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Let’s start with the beginning and explore the Authentication and Authorization aspects of IssueTracker.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;In its current release, &lt;STRONG&gt;&lt;EM&gt;IssueTracker’s&lt;/EM&gt;&lt;/STRONG&gt; approach for user AuthN and AuthZ is straightforward username + passwords, and a user profile associated with it. This works ok for very small organizations (or even bigger organizations with a few people using it) but breaks quickly for companies like &lt;STRONG&gt;&lt;EM&gt;VeryBigCorp&lt;/EM&gt;&lt;/STRONG&gt; for many reasons: &lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;People forget passwords and &lt;STRONG&gt;&lt;EM&gt;VeryBigCorp’s&lt;/EM&gt;&lt;/STRONG&gt; help desks would add a new task of resetting credentials. &lt;/LI&gt;
&lt;LI&gt;People need to be retrained into new procedures. (&lt;EM&gt;“For IssueTracker password reset, please press 23”&lt;/EM&gt;) &lt;/LI&gt;
&lt;LI&gt;People get fired from &lt;STRONG&gt;&lt;EM&gt;VeryBigCorp’s&lt;/EM&gt;&lt;/STRONG&gt; and can the log on to the system from their homes and “creatively edit” the company’s information. &lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;EM&gt;VeryBigCorp’s&lt;/EM&gt;&lt;/STRONG&gt; wants a seamless experience for their users (no pop-up, no login, nothing). It should just work. &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Besides, &lt;STRONG&gt;&lt;EM&gt;VeryBigCorp&lt;/EM&gt;&lt;/STRONG&gt; already has a user repository (maybe more than one?) and they already have problems provisioning new users on it (them) when they hire new employees, etc. Adding a new repository for just 1 app is not going to happen.&lt;/P&gt;
&lt;P&gt;The team @ &lt;STRONG&gt;&lt;EM&gt;SuperCloudySoftware&lt;/EM&gt;&lt;/STRONG&gt; considers one option:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Synchronizing VBC existing user repository with &lt;STRONG&gt;&lt;EM&gt;IssueTracker’s&lt;/EM&gt;&lt;/STRONG&gt;. This certainly can be done but is too ad-hoc, complex, cumbersome, error prone, non-standard. it wouldn’t work with other Customers and &lt;STRONG&gt;&lt;EM&gt;SuperCloudySoftware&lt;/EM&gt;&lt;/STRONG&gt; would much rather build one solution for all, and not treat each case as an exception.&amp;nbsp; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;A better solution is to use claims and federated identity. This allows the service to rely on somebody else that it trusts to authenticate users (&lt;STRONG&gt;&lt;EM&gt;VeryBigCorp&lt;/EM&gt;&lt;/STRONG&gt;) and deal with an abstracted set of facts (claims) about the requestor that are used for authorization. &lt;/P&gt;
&lt;P&gt;Fortunately, the team went to Microsoft PDC last year and learnt about some technologies that would be very appropriate for these scenario: &lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=1E3C3EFC-E980-4895-9095-86E51C1CD9D8&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=1E3C3EFC-E980-4895-9095-86E51C1CD9D8&amp;amp;displaylang=en"&gt;Geneva Framework&lt;/A&gt; and &lt;A href="http://www.microsoft.com/azure/accesscontrol.mspx" mce_href="http://www.microsoft.com/azure/accesscontrol.mspx"&gt;.NET Services Access Control Service&lt;/A&gt; and do all the heavy lifting of setting up federation and dealing with claims:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_E81F/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_E81F/image_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_E81F/image_thumb.png" width=582 height=397 mce_src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_E81F/image_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;In this architecture the web site (&lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt;) defines a set of claims that are required to access its resources, for example perform certain operation such as "Create a Project”, “Delete an Issue”, etc. Whoever brings those claims will be allowed to access the resource (e.g. complete the operation). If you don’t provide the claims, then you would get “access denied”. Claims can be obtained from a&amp;nbsp; trusted issuer (&lt;STRONG&gt;&lt;EM&gt;VeryBigCorp’s&lt;/EM&gt;&lt;/STRONG&gt; identity provider such as Active Directory).&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;Simple analogy:&lt;/STRONG&gt; This is like going to a bar and providing the bartender with a valid ID that will attest to your age. The resource is the beer, the claim is your age, the issuer is the government department that gave you the ID, the rule is “beer is fine if you are &amp;gt; 21 years old” (in the US)&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Now, each company will attest to different facts about its users (like their name, which organization they work for, who is their manager, where they are located, etc.). These facts are irrelevant for &lt;EM&gt;&lt;STRONG&gt;IssueTracker&lt;/STRONG&gt;&lt;/EM&gt;, so some sort of mapping the original claims to those understood by &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; needs to happen.&lt;/P&gt;
&lt;P&gt;The translator allows &lt;STRONG&gt;&lt;EM&gt;VeryBigCorp&lt;/EM&gt;&lt;/STRONG&gt; to define rules of access. For example, they might say:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;“Any employee who is a Program Manager will be able to Create New Projects in IssueTracker” &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;This implies taking the “being a member of the Program Manager group” claim and transform it into a “Create New Project” claim. Other organizations might have completely different rules and &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; wouldn’t care as long as what it receives is something it understands.&lt;/P&gt;
&lt;P&gt;That’s what Access Control Service is used for: convert claims from different issuers into others.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;Following the bar analogy:&lt;/STRONG&gt; the resource is the beer, the claim is your age, but instead of the bartender having to verify all sorts of different issuers of claims (passports, driving licenses, birth certificates, identity cards, etc), you simply put a guy in the door that verifies that and then gives you a colored bracelet. The rule for the bartender becomes: “anyone with a colored bracelet can have beer”. How you obtain it is someone else’s responsibility (hint: bribe the guy in the door :-) ).&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;This solution is actually very scalable and has a nice bonus: Access Control Service is already federated with a very popular identity provider like &lt;A href="http://dev.live.com/liveid/" mce_href="http://dev.live.com/liveid/"&gt;LiveID&lt;/A&gt;. So, by implementing this, &lt;STRONG&gt;&lt;EM&gt;SuperCloudySoftware&lt;/EM&gt;&lt;/STRONG&gt; has a LiveID enabled website for its smaller Customers for “free”.&lt;/P&gt;
&lt;P&gt;The other nice thing is that this works with both Web Sites and Web Services (the so called “passive” and “active” profiles). So If &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; exposes an API instead of a human readable web page, the same principles (and almost the same implementation) applies.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Note:&lt;/U&gt;&lt;/STRONG&gt; &lt;EM&gt;&lt;STRONG&gt;IssueTracker&lt;/STRONG&gt; &lt;/EM&gt;has an API because of requirement #2 of &lt;STRONG&gt;&lt;EM&gt;veryBigCorp&lt;/EM&gt;&lt;/STRONG&gt; –&amp;gt; being able to integrate with other systems.&lt;/P&gt;
&lt;P&gt;This is exactly what &lt;STRONG&gt;&lt;EM&gt;SuperCloudySoftware&lt;/EM&gt;&lt;/STRONG&gt; implemented and if you are curious about the details, then download the code and check for yourself!&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://azureissuetracker.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=22138" mce_href="http://azureissuetracker.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=22138"&gt;IssueTracker Standard Edition&lt;/A&gt; (with federation with LiveID) &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://azureissuetracker.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24479" mce_href="http://azureissuetracker.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24479"&gt;IssueTracker Enterprise Edition&lt;/A&gt; (with federation with a custom identity provider) &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;I’ll expand on the implementation details in the next articles.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;P.S.:&lt;/U&gt;&lt;/STRONG&gt; if you want to learn more about claims, federation and identity “theory” in general&amp;nbsp; (including the alcoholic analogy :-)) then you should bookmark and read from &lt;EM&gt;il Maestro&lt;/EM&gt; &lt;A href="http://blogs.msdn.com/vbertocci/" mce_href="http://blogs.msdn.com/vbertocci/"&gt;Vittorio Bertocci&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Updates: fixed a few typos.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9468609" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx">SaaS</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Build/default.aspx">S+S_Build</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Federated+Identity/default.aspx">Federated Identity</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Claims/default.aspx">Claims</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Azure+Services+Platform/default.aspx">Azure Services Platform</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Access+Control+Service/default.aspx">Access Control Service</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/.NET+Services/default.aspx">.NET Services</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/IssueTracker/default.aspx">IssueTracker</category></item><item><title>The need for “standards for application logic” in PaaS. Really?</title><link>http://blogs.msdn.com/eugeniop/archive/2009/02/24/the-need-for-standards-for-application-logic-in-paas-really.aspx</link><pubDate>Wed, 25 Feb 2009 00:37:41 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9443383</guid><dc:creator>eugeniop</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/eugeniop/comments/9443383.aspx</comments><wfw:commentRss>http://blogs.msdn.com/eugeniop/commentrss.aspx?PostID=9443383</wfw:commentRss><description>&lt;p&gt;In his &lt;a href="http://blogs.zdnet.com/SAAS/?p=668"&gt;latest post&lt;/a&gt; on Coghead’s demise, &lt;a href="http://blogs.zdnet.com/SAAS"&gt;Phil&lt;/a&gt; argues that:&lt;/p&gt;  &lt;p&gt;“&lt;em&gt;What this highlights is the lack of any standard for transferring not just data but application logic between such platforms.”&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;My argument is that those standards already exist and are widely adopted:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;“Standards for capturing application logic already exist: Java &amp;amp; .NET (and COBOL). Coghead &amp;quot;mistake&amp;quot; was to try to develop their own development platform from scratch, instead of leveraging what already existed and provide value on top of that.”&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Phil replied that:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt; &lt;dt&gt;&lt;em&gt;“Doesn't solve the problem &lt;/em&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;But you still can't *transfer* logic from one development platform to another, say from COBOL to Java, or from Java to .NET, without completely rewriting it. What I'm advocating would be helpful to people developing on established platforms too. My point is that it's essential in a PaaS context.”&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;My response was getting too long, so I decided to post here instead.&lt;/p&gt; &lt;/dt&gt;&lt;dt&gt;   &lt;p&gt;Sure, having an abstract model for your app logic and then deciding implementation details would be great. I buy the &lt;em&gt;attractiveness&lt;/em&gt; of such an approach and I understand why people would like this. (I’m sure it will sound familiar to my friends @ &lt;a href="http://www.genexus.com/portal/hgxpp001.aspx?2"&gt;ArTech&lt;/a&gt;), but there’re problems too (e.g. “minimum common denominator” syndrome, lack of finer grained control, not being able to take advantage of the latest features in a given implementation, etc).&lt;/p&gt;    &lt;p&gt;However, I certainly &lt;u&gt;don’t &lt;/u&gt;think it is *&lt;b&gt;essential*&lt;/b&gt; for PaaS. Nice, desirable, yes. Essential, I don’t think so.&lt;/p&gt;    &lt;p&gt;Phil says that &lt;em&gt;“With PaaS, the lack of such mechanisms could become a huge barrier to adoption as customers become fearful of which platform might be next to switch off the lights.”&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;True to some extent, but there are ways of mitigating this *&lt;b&gt;today&lt;/b&gt;* without waiting for the &lt;em&gt;uber-cross-platform-cross-cloud-ocean-boiling &lt;/em&gt;model.&lt;/p&gt;    &lt;p&gt;Coghead could have chosen to offer app hosting for .NET and/or Java based apps (or PHP or COBOL for that matter), and attract 10,000’s of ISVs that have already bet on those platforms. Instead, they created a &lt;strong&gt;*new*&lt;/strong&gt; platform from scratch. They not only required everybody to learn their new abstractions, their new language, their new tools, etc. Those by themselves are strong adoption barriers, not impossible to overcome, but quite tough.&lt;/p&gt; &lt;/dt&gt;&lt;dt&gt;   &lt;p&gt;But they also asked everybody to bet their operational business on them (the “aaS in “PaaS”), because nobody had access to their runtime except them. The lethality to the business viability is in the combination of these two factors. Platforms are catalysts, and as a consequence, they usually don’t do anything useful by themselves. They need to be bootstrapped.&amp;#160;&amp;#160; &lt;/p&gt; &lt;/dt&gt;&lt;dt&gt;   &lt;p&gt;So, if Coghead had chosen say .NET (I’m biased of course :-)) as their underlying programming model, barriers of entry would have been much lower for many reasons. Among them:&lt;/p&gt; &lt;/dt&gt;&lt;dt&gt;   &lt;ul&gt;     &lt;li&gt;ISV would have had less cost in creating a “Coghead” solution (they would have reused all their existing skills, tools, knowledge, etc).&lt;/li&gt;      &lt;li&gt;The cost of re-targeting their app would have been lower in the case the hoster goes out of business. Some work would have been required anyway, but not as high as with the current model. &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;In this hypothetical scenario, instead of parsing the XML files, they would have a bunch of .NET (C# or VB.NET) assemblies.&lt;/p&gt;    &lt;p&gt;Some PaaS offerings, such as &lt;a href="http://apprenda.com/"&gt;Apprenda&lt;/a&gt;, have taken this path. In my opinion a much healthier and pragmatic path. &lt;/p&gt; &lt;/dt&gt;&lt;dt&gt;   &lt;p&gt;The other obvious way of addressing these risks is with a “reverse escrow” from PaaS providers to their ISVs: giving out the runtime to the ISVs if they go out of business. Worse case, ISVs would buy time to port the application into another runtime. (like .NET).&lt;/p&gt; &lt;/dt&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9443383" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx">SaaS</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Run/default.aspx">S+S_Run</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Build/default.aspx">S+S_Build</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/PaaS/default.aspx">PaaS</category></item><item><title>Architecting Cloud Applications for the Enterprise - Part III - SuperCloudySoftware meets VeryBigCorp CIO</title><link>http://blogs.msdn.com/eugeniop/archive/2008/12/10/architecting-cloud-applications-for-the-enterprise-part-iii-supercloudysoftware-meets-verybigcorp-cio.aspx</link><pubDate>Wed, 10 Dec 2008 17:50:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9191795</guid><dc:creator>eugeniop</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/eugeniop/comments/9191795.aspx</comments><wfw:commentRss>http://blogs.msdn.com/eugeniop/commentrss.aspx?PostID=9191795</wfw:commentRss><description>&lt;P&gt;&lt;STRONG&gt;Actors&lt;/STRONG&gt;: the CIO at &lt;STRONG&gt;&lt;EM&gt;VeryBigCorp&lt;/EM&gt;&lt;/STRONG&gt;, John (&lt;STRONG&gt;&lt;EM&gt;SuperCloudySoftware's&lt;/EM&gt;&lt;/STRONG&gt; CEO) and a bunch of senior developers and architects. &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_7BA8/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_7BA8/image_2.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=image src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_7BA8/image_thumb.png" width=390 height=248 mce_src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_7BA8/image_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;CIO&lt;/STRONG&gt;: Gentlemen, welcome. Let me start by saying that our internal Customer is absolutely fascinated with your application. Believe me, they are hard to please and I've never seen them so excited. Congratulations!&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;John&lt;/STRONG&gt; (CEO): thank you! We are really committed to our customer satisfaction&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;CIO&lt;/STRONG&gt;: great to hear that. Now... the reason I wanted to meet with you is because we want to use the system for the entire division...&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;John (thinking):&lt;/STRONG&gt; yes! yes! yes! 10,000 seats...&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;CIO:&lt;/STRONG&gt; ...that would be 10,000 users approximately.&amp;nbsp; The thing is that the current authentication approach you guys have today, username and password, doesn't really work for us. I don't want yet another password to maintain, troubleshoot, etc. We have enough identities already as a result of our latest set of mergers and acquisitions...&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;John (Glancing at the other tech folks, nodding and still thinking about 10K seats):&lt;/STRONG&gt; Sounds completely reasonable to me...&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;CIO: &lt;/STRONG&gt;Besides the maintenance hassles of dealing with people forgetting passwords, provisioning new employees, etc. there is a serious liability in having you guys managing authentication this way. If any of these employees is fired, nothing prevents him to logon from his home and creatively edit the data in the system. That's too risky for us. So we want Single Sign On between our own identity infrastructure and yours...&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;John (carefully but confidently):&lt;/STRONG&gt; right, makes total sense...&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;CIO: &lt;/STRONG&gt;Great. The second thing I want to discuss with you is integration. Event though &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; would actually replace a few systems that we host ourselves, there are still other applications that need to pull and push information to &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt;. In particular, our ISO9000 support system absolutely needs to be fully integrated in real time with &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt;. We cannot have people duplicating entries on these two different systems. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;John (cautiously)&lt;/STRONG&gt;: mhm &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;CIO:&lt;/STRONG&gt; By the way, the ISO9000 system runs on our AS400 minicomputer...&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;John (thinking):&lt;/STRONG&gt; A...S...what?&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;John (suddenly excited):&lt;/STRONG&gt; well, there are export/import features in &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt;. Currently you could download or upload an Excel spreadsheet, and ....&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;CIO (interrupting John)&lt;/STRONG&gt;: sure, that might help, but what we need is that every time someone creates a new Issue in &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt;, the same information is replicated in the AS400 almost real-time...makes sense? Some delay is admissible, but it must be as online as possible. Couple of minutes at most...&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;John (worried):&lt;/STRONG&gt; mhm&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;CIO:&lt;/STRONG&gt; great we understand each other! You guys are really easy to work with! &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;John:&lt;/STRONG&gt; Sure. We are really committed to our customers satisfaction. I'd like to meet with my team and take a look at this requirements. I'm sure we can develop a proposal for you in the next week or so...&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;CIO (interrupting again):&lt;/STRONG&gt; ...wait, there's one more thing...&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;John:&lt;/STRONG&gt; oh! sorry... (thinking: what else could they possibly want...)&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;CIO:&lt;/STRONG&gt; &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; will become a critical system for us. If something goes wrong, and believe me, it will; we need to know. We need our help desk to be fully integrated with yours. Our users are trained to call help desks for problems with any homologue system they interact with. So when a trouble ticket is generated here, we need that to be escalated to you. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;The Architect (who had remained silent until then)&lt;/STRONG&gt;: hey, you could use &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; to track issues with &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt;! To &lt;A href="http://users.rcn.com/jcoplien/Patterns/C++Report/SpaceIII-1.html" mce_href="http://users.rcn.com/jcoplien/Patterns/C++Report/SpaceIII-1.html"&gt;iterate is human, to recurse is divine&lt;/A&gt;...&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;John (piercing the architect with his eyes): &lt;/STRONG&gt;thanks for the "suggestion", now could you please expand on your needs?&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;CIO: &lt;/STRONG&gt;yeah...anyway, we recently invested on a new set management tools (we just deployed Microsoft System Center Operations manager), so ideally, we would like all administrative tasks to be launched from there...ok? I want to be able to track response time, correlate potential problems with other conditions...&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;John (Recovering): &lt;/STRONG&gt;ok... We need to look at this. Frankly, we don't have those things in place today, but we are &lt;EM&gt;very&lt;/EM&gt; interested in making this work for you. &lt;/P&gt;
&lt;P&gt;I'm very comfortable with the technical capabilities of my team so I'm sure we will find a solution. &lt;/P&gt;
&lt;P&gt;I'll come back to you next week with a proposal. ok?&lt;/P&gt;
&lt;P&gt;John and his team leaves &lt;STRONG&gt;&lt;EM&gt;VeryBigCorp&lt;/EM&gt;&lt;/STRONG&gt; offices. John is really wondering if this thing of expanding into the enterprise segment is really worth it. Why not just continue to sell to the SMB segment as they've been doing so far? Anyway, John wants to explore the options and make a decision on more than initial gut feeling. &lt;/P&gt;
&lt;P&gt;At the same time, his instincts tell him that VBC requirements are not really unique. If they solve them for VBC, they would solve them for all companies with that profile and position SCS competitively.&lt;/P&gt;
&lt;P&gt;Next chapter: &lt;STRONG&gt;&lt;EM&gt;SuperCloudySoftware&lt;/EM&gt;&lt;/STRONG&gt; whiteboards options to address &lt;STRONG&gt;&lt;EM&gt;VeryBigCorp&lt;/EM&gt;&lt;/STRONG&gt; challenges.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9191795" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx">SaaS</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Build/default.aspx">S+S_Build</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Federated+Identity/default.aspx">Federated Identity</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/IssueTracker/default.aspx">IssueTracker</category></item><item><title>Architecting Cloud Applications for the Enterprise - Part II - VeryBigCorp buys IssueTracker</title><link>http://blogs.msdn.com/eugeniop/archive/2008/12/07/architecting-cloud-applications-for-the-enterprise-part-ii-verybigcorp-buys-issuetracker.aspx</link><pubDate>Mon, 08 Dec 2008 05:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9183539</guid><dc:creator>eugeniop</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/eugeniop/comments/9183539.aspx</comments><wfw:commentRss>http://blogs.msdn.com/eugeniop/commentrss.aspx?PostID=9183539</wfw:commentRss><description>&lt;P&gt;Now that we have introduced our characters, we will start this story describing the acquisition process of &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; in &lt;STRONG&gt;&lt;EM&gt;VeryBigCorp&lt;/EM&gt;&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; was first used in VBC by a very limited number of people. Someone in some business unit somehow learnt about it and thought it would be a good tool to automate their work.&lt;/P&gt;
&lt;P&gt;A senior manager in that business unit approved the expense, a subscription was bought and &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; became a new software asset in VBC. IT was not involved in this process and the acquisition happened in the "black market" of IT.&lt;/P&gt;
&lt;P&gt;And thus, &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; became an "illegal immigrant" in VBC IT department: not everybody knows it is there, some people think it is great, other would like to get rid of it, most regulators (in IT) would simply ignore it, as long as it doesn't cause any trouble.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;This limbo status could last for a long time. Ironically, &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; is&lt;EM&gt; so &lt;/EM&gt;useful that it gains notoriety. It becomes clear to the business unit managers that it this little service is actually the perfect solution for their needs. Moreover, users &lt;EM&gt;love&lt;/EM&gt; it. It's simple to use, it's intuitive and it does its job efficiently. Users productivity soars. &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; is the little service that could.&lt;/P&gt;
&lt;P&gt;All this goodness eventually reaches the business unit senior manager and he decides it is something that must be used by everybody. Just imagine all the productivity gains for the entire division! Increasing the efficiency of 10,000 employees under his leadership will have a tremendous impact in his bottom line.&lt;/P&gt;
&lt;P&gt;So the senior manager calls the CIO and &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; existence is made transparent. Not only the CIO learns about this "illegal immigrant", he now has to legalize it :-).&lt;/P&gt;
&lt;P&gt;The CIO calls &lt;EM&gt;&lt;STRONG&gt;SuperCloudySoftware&lt;/STRONG&gt;&lt;/EM&gt; sales department and requests a meeting with their technical folks to "sort out a few issues" of turning &lt;EM&gt;&lt;STRONG&gt;IssueTracker&lt;/STRONG&gt;&lt;/EM&gt; into a qualified citizen of VBC IT.&lt;/P&gt;
&lt;P&gt;On the other side of the line, &lt;STRONG&gt;&lt;EM&gt;SuperCloudySoftware&lt;/EM&gt;&lt;/STRONG&gt; just can't believe what has just happened. &lt;STRONG&gt;&lt;EM&gt;VeryBigCorp&lt;/EM&gt;&lt;/STRONG&gt; wants to buy 10,000 seats of &lt;STRONG&gt;&lt;EM&gt;Issuetracker&lt;/EM&gt;&lt;/STRONG&gt;.&amp;nbsp; 10,000 seats!&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_295A/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_295A/image_2.png"&gt;&lt;IMG border=0 alt=image src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_295A/image_thumb.png" width=160 height=240 mce_src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_295A/image_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;The best technical guys in &lt;STRONG&gt;&lt;EM&gt;SuperCloudySoftware&lt;/EM&gt;&lt;/STRONG&gt; are sent to the meeting then. Their mission: do whatever it takes to win this Customer! Failure is not an option. &lt;/P&gt;
&lt;P&gt;Next chapter of this story is the meeting between the CIO and &lt;STRONG&gt;&lt;EM&gt;SuperCloudySoftware&lt;/EM&gt;&lt;/STRONG&gt;. &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9183539" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx">SaaS</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Build/default.aspx">S+S_Build</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/IssueTracker/default.aspx">IssueTracker</category></item><item><title>Architecting Cloud Applications for the Enterprise - Part I - Introducing the Actors</title><link>http://blogs.msdn.com/eugeniop/archive/2008/12/05/architecting-cloud-applications-for-the-enterprise-part-i-introducing-the-actors.aspx</link><pubDate>Fri, 05 Dec 2008 19:14:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9180512</guid><dc:creator>eugeniop</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/eugeniop/comments/9180512.aspx</comments><wfw:commentRss>http://blogs.msdn.com/eugeniop/commentrss.aspx?PostID=9180512</wfw:commentRss><description>&lt;P&gt;I will start this series by introducing the main characters of our scenario.&lt;/P&gt;
&lt;P&gt;First, we have &lt;EM&gt;&lt;STRONG&gt;VeryBigCorp&lt;/STRONG&gt;&lt;/EM&gt;. VBC is a large corporation, with multiple branches and subsidiaries, thousands of employees, etc. VBC is the typical organization with a rather complex business environment: multiple business units, complex rules, regulations, etc.&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_2505/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_2505/image_2.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=image src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_2505/image_thumb.png" width=339 height=259 mce_src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ArchitectingCloudApplicationsfortheEnter_2505/image_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;VBC IT department is a reflection of this complexity: they have lots of legacy components, multiple networking stacks and a rich myriad of technologies coexist in its data centers. VBC develops custom applications for some of their business units, but they also buy packages from specialized vendors.&lt;/P&gt;
&lt;P&gt;VBC IT has multiple processes in place to deal with all these challenges: there are architecture and development guidelines that everyone is supposed to follow, there are software development lifecycle processes, standards, naming conventions, etc. All these are there for good reasons, but sometimes creates a perception of lack of agility and excessive bureaucracy. &lt;/P&gt;
&lt;P&gt;Most technology acquisitions in VBC are handled by the IT department following strict steps.&lt;/P&gt;
&lt;P&gt;The second character in our story is &lt;STRONG&gt;&lt;EM&gt;SuperCloudySoftware&lt;/EM&gt;&lt;/STRONG&gt;, a service provider (a "&lt;EM&gt;cloud ISV"&lt;/EM&gt; if you want)&lt;/P&gt;
&lt;P&gt;SCS has embraced the web since its foundation. SCS innovates very quickly, pushes updates on its service regularly based on customer feedback, focuses on user experience, etc. They are the ultimate "agilists". &lt;/P&gt;
&lt;P&gt;SCS focused initially on smaller businesses, even some consumers. Their flagship service is &lt;EM&gt;&lt;STRONG&gt;IssueTracker&lt;/STRONG&gt;&lt;/EM&gt; a task tracking service.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;IssueTracker&lt;/STRONG&gt;&lt;/EM&gt; is only available as a service. That means that you can't buy a license of it and deploy it in your own data center.&lt;/P&gt;
&lt;P&gt;From the beginning SCS made the strategic decision of making &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; available through "multiple heads":&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;There is a &lt;STRONG&gt;Web Client&lt;/STRONG&gt; that only requires a browser &lt;/LI&gt;
&lt;LI&gt;There's a &lt;STRONG&gt;Smart Client&lt;/STRONG&gt; that provides a richer UX and enhanced connectivity options (e.g. working offline) and &lt;/LI&gt;
&lt;LI&gt;There's also a &lt;STRONG&gt;Web Services API&lt;/STRONG&gt; for all functions, that allows anybody to create their own clients or want to integrate with other client environments such as Microsoft Office. &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;IssueTracker&lt;/STRONG&gt;&lt;/EM&gt; itself relies on &lt;EM&gt;cloud building blocks.&lt;/EM&gt; For example, the persistence of the application is based on &lt;A href="http://www.microsoft.com/azure/data.mspx" mce_href="http://www.microsoft.com/azure/data.mspx"&gt;SQL Data Services&lt;/A&gt;. This of course is completely opaque to their customers.&lt;/P&gt;
&lt;P&gt;Next chapter will cover &lt;STRONG&gt;&lt;EM&gt;IssueTracker&lt;/EM&gt;&lt;/STRONG&gt; acquisition process in &lt;STRONG&gt;&lt;EM&gt;VeryBigCorp&lt;/EM&gt;&lt;/STRONG&gt;. &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9180512" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Web+Client/default.aspx">Web Client</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx">SaaS</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Build/default.aspx">S+S_Build</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/SSDS/default.aspx">SSDS</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/IssueTracker/default.aspx">IssueTracker</category></item><item><title>Architecting Cloud Services for the Big Enterprise</title><link>http://blogs.msdn.com/eugeniop/archive/2008/12/04/architecting-cloud-services-for-the-big-enterprise.aspx</link><pubDate>Thu, 04 Dec 2008 12:08:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9174919</guid><dc:creator>eugeniop</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/eugeniop/comments/9174919.aspx</comments><wfw:commentRss>http://blogs.msdn.com/eugeniop/commentrss.aspx?PostID=9174919</wfw:commentRss><description>&lt;P&gt;For the last couple of months, we’ve been working on scenarios that involve consuming cloud services and applications from &lt;EM&gt;"Big Enterprise"&lt;/EM&gt;. The focus being the &lt;U&gt;technical&lt;/U&gt; obstacles for adopting cloud services.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Big Enterprise&lt;/EM&gt; is the moniker we use to describe an organization with rather heavy investments on on-premises software.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Not surprisingly then, the aspects we have explored are integration in these three areas: &lt;B&gt;&lt;I&gt;security&lt;/I&gt;&lt;/B&gt;, &lt;B&gt;&lt;I&gt;management&lt;/I&gt;&lt;/B&gt; and &lt;B&gt;&lt;I&gt;application&lt;/I&gt;&lt;/B&gt; integration.&lt;/P&gt;
&lt;P&gt;No important application in &lt;EM&gt;Big Enterprise&lt;/EM&gt; lives in isolation so integration of cloud service on these three levels is key.&lt;/P&gt;
&lt;P&gt;The good news is that there's new exciting tools, frameworks and services ISV can leverage today to address these requirements.&lt;/P&gt;
&lt;P&gt;My session at PDC was the first time we presented this work. In general there’s agreement that these are recurring, common and important challenges; which is good validation. &lt;/P&gt;
&lt;P&gt;Unfortunately not all demos @ PDC worked as I had expected (and endlessly practiced before), for various reasons. In retrospective, I’m glad we went through that pain, because there were lots of lessons learnt. Failure is a great teacher.&lt;/P&gt;
&lt;P&gt;Since PDC, we’ve been working on improving the reference implementations our demos were based on, by incorporating all this experience: obscure pitfalls, wrong assumptions, unexpected limitations, lack of complete symmetry between production and pre-production, pure randomness, etc.&lt;/P&gt;
&lt;P&gt;I'm certain many of you our there in the real world will face many of these same challenges, so I hope our pain will help you be more successful with the Azure Platform. &lt;/P&gt;
&lt;P&gt;Since PDC, we presented the same (updated) content on various events: Teched EMEA, TechDays in Milano a few days ago and RAF in Madrid. In general we've got great feedback and good validation of our assumptions.&lt;/P&gt;
&lt;P&gt;My plan is to drill down on each of these aspects in the next (several) couple of blog posts, so stay tuned!&lt;/P&gt;
&lt;P&gt;Last but not least, most of the sample code demonstrated will be available for you to download and explore in the upcoming weeks.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9174919" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx">SaaS</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Run/default.aspx">S+S_Run</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Build/default.aspx">S+S_Build</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Claims/default.aspx">Claims</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/IssueTracker/default.aspx">IssueTracker</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Federated+Ientity/default.aspx">Federated Ientity</category></item><item><title>Blog activity suspended until after PDC</title><link>http://blogs.msdn.com/eugeniop/archive/2008/10/03/blog-activity-suspended-until-after-pdc.aspx</link><pubDate>Fri, 03 Oct 2008 17:10:07 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8975724</guid><dc:creator>eugeniop</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/eugeniop/comments/8975724.aspx</comments><wfw:commentRss>http://blogs.msdn.com/eugeniop/commentrss.aspx?PostID=8975724</wfw:commentRss><description>&lt;p&gt;I've got like 5 posts in my queue. All of them are drafts, all need work, all need nice graphics to illustrate the concepts and all are related to &lt;a href="http://blogs.msdn.com/gianpaolo/archive/2008/09/24/cloud-services-architecture-symposium.aspx"&gt;my session at PDC&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;I'm 100% focused on actually having all my demos finished, deck's polished, etc. and I've frequently found myself back and forth editing and updating the articles. I will defer posting here anything until I'm done, which will probably be around the time PDC starts in 4 weeks.&lt;/p&gt;  &lt;p&gt;See you there (and here)!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8975724" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Other/default.aspx">Other</category></item><item><title>Tagged again</title><link>http://blogs.msdn.com/eugeniop/archive/2008/09/24/tagged-again.aspx</link><pubDate>Thu, 25 Sep 2008 05:34:03 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8964570</guid><dc:creator>eugeniop</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/eugeniop/comments/8964570.aspx</comments><wfw:commentRss>http://blogs.msdn.com/eugeniop/commentrss.aspx?PostID=8964570</wfw:commentRss><description>&lt;p&gt;About a year and a half ago, some proto-ethnologist started a tagging blogo-game:&amp;#160; you where asked to write 5 facts about you and then tag 5 other people you knew. Not sure if someone eventually did any analysis of the spread, lifetime and reach of the game. But regardless of the spreading speed, coverage, and eventual death, I found it to be a great way of learning something more personal about the people I usually read.&lt;/p&gt;  &lt;p&gt;The game has started again, being tagged by my friend &lt;a href="http://blogs.msdn.com/gianpaolo"&gt;Gianpaolo&lt;/a&gt;. (I'm flattered he considers me intellectually sharp). This time the request is to name at least 5 books that influenced you. &lt;/p&gt;  &lt;p&gt;Interestingly, the last fact &lt;a href="http://blogs.msdn.com/eugeniop/archive/2007/01/15/i-m-it-too-tagged-by-ed.aspx"&gt;I wrote&lt;/a&gt; about in the tag-blog post was about my library. Books have been a companion throughout all my life. They were the windows and doors to the whole world, to other people's ideas, to remote places. I traveled, I fought, I raised to glory, I cried with defeat and betrayal, I laughed, I loved, I cursed, I doubted and I learnt. My parents always told me: &lt;em&gt;&amp;quot;toys, clothes and candy are optional. We might say 'no', but we will never say no to a book&amp;quot;&lt;/em&gt;. &lt;/p&gt;  &lt;p&gt;In the 1960 film The Time Machine, (adapted from the classic H.G. Wells classic book) the friends of the time traveler notice he left again and took 3 books with him. Then one asks: &lt;em&gt;&amp;quot;Which three books would you have taken?&amp;quot;&lt;/em&gt;, presumably to rebuild the exploited Eloi civilization in the future. That is brutal stack ranking! How could I just pick up 3! But wait...the request is to name &lt;em&gt;at least&lt;/em&gt; 5 this time. Great!&lt;/p&gt;  &lt;p&gt;As I mentioned in my previous post, I was lucky to inherit two libraries: my grandfather's and my godfather's. Besides my parents never said 'no' to books, so early on I had a fairly large collection. Each inherited collection was very different though: my grandfather's was an eclectic collection mostly about poetry (not Vogon), history, politics and philosophy. He had all the classics: Voltaire, Rousseau, Montesquieu, Kant, Francisco de Quevedo, Cervantes, Borges, etc. I read many, but most when I grew older and could actually digest what I read. Some at school of course. (and some, I confess I never finished). He mostly bought (very) cheap editions, so I had to be very careful not to break them, yet I can still recall the smell of those pages. &lt;/p&gt;  &lt;p&gt;My godfather's books, on the other hand, where all about adventures: Emilio Salgari, Julio Verne, Daniel Defoe, Alexandre Dumas, etc. so before high school, I focused mainly on these. Many of them, I read many many times.&lt;/p&gt;  &lt;p&gt;Memorable titles from that age: all of Salgari's (the &amp;quot;&lt;a href="http://en.wikipedia.org/wiki/Sandokan"&gt;Sandokan&lt;/a&gt;&amp;quot; series and many others from this prolific writer), the &amp;quot;Voyages&amp;quot; from Verne, Quevedo's &amp;quot;Satiric Poems&amp;quot; which were awesome considering they were written in the XIV century and contained a lot of cursing in ancient spanish. This guy was like a &amp;quot;fake Steve Jobs&amp;quot; of the Spanish Golden Era.&lt;/p&gt;  &lt;p&gt;One book that impacted me a lot was &amp;quot;&lt;a href="http://en.wikipedia.org/wiki/Endurance:_Shackleton%27s_Incredible_Voyage"&gt;Shakleton's Incredible Voyage&lt;/a&gt;&amp;quot;, by Alfred Lansing. This was about a &lt;em&gt;real&lt;/em&gt; adventure. &lt;a href="http://en.wikipedia.org/wiki/Ernest_Shackleton"&gt;Ernest Shakleton's&lt;/a&gt; was my hero. I admired his leadership and will, even in the extreme situation he and his team were in. From him I learnt: &amp;quot;never give up&amp;quot;. I did a lot of research on Antarctic expeditions after that. (Many years later, while serving in the Army, I was assigned to a unit that supported the antarctic bases).&lt;/p&gt;  &lt;p&gt;High school was all about fantasy and science fiction: J.L. Borges, Ray Bradbury, Theodore Sturgeon, Aldous Huxley, Stapledon, George Orwell, Fredric Brown, William Gibson, Philip Dick, Isaac Asimov, Ursula Le Guin, Tolkien, Lovecraft, E. A. Poe, Brian Aldiss. I loved all these stories. &lt;/p&gt;  &lt;p&gt;Highlighted ones: Sturgeon's &amp;quot;&lt;a href="http://en.wikipedia.org/wiki/More_Than_Human"&gt;More than Human&lt;/a&gt;&amp;quot;, Asimov's robot stories, all of Borges' (never read Borges? try &amp;quot;&lt;a href="http://en.wikipedia.org/wiki/The_Library_of_Babel"&gt;The Library of Babel&lt;/a&gt;&amp;quot;), Aldiss' trilogy &amp;quot;Helliconia&amp;quot; (fascinating). I also did theater during high school, so I studied of course many plays, especially those I acted on :-). Very different, but very enjoyable too: &amp;quot;The Importance of being Ernest&amp;quot;, &amp;quot;My Fair lady&amp;quot;, among others. &lt;/p&gt;  &lt;p&gt;One book I remember that also triggered a lot of further study was Eco's &amp;quot;&lt;a href="http://en.wikipedia.org/wiki/The_Name_of_the_Rose"&gt;The Name of the Rose&lt;/a&gt;&amp;quot;. It was much later I linked Jorge de Burgos, the blind librarian of the story with Jorge Luis Borges the author. Himself a librarian and also blind. Excited about this first encounter, I tried other books from Eco, but they never quite made it as &amp;quot;The name...&amp;quot;. &lt;/p&gt;  &lt;p&gt;At that time I also became fascinated by great military campaigns &amp;amp; military technology: roman army and battles, WWII were my favorites. I knew everything about roman formations, shields and helmets, &lt;a href="http://en.wikipedia.org/wiki/Lorica_segmentata"&gt;lorica segmentata&lt;/a&gt; and Adrian's wall; T-34 vs Tiger vs Sherman tanks, differences between BF-109 and Spitfire fighters, etc. &lt;/p&gt;  &lt;p&gt;During late high school and University I read mainly technical stuff, but I also discovered Rudy Rucker who mixed history, mathematics &amp;amp; science fiction. &amp;quot;&lt;a href="http://www.amazon.com/Infinity-Mind-Rudy-Rucker/dp/0691001723"&gt;Infinity and the Mind&lt;/a&gt;&amp;quot;, &amp;quot;The Hacker and the Ants&amp;quot;, &amp;quot;Mindtools&amp;quot;, the &amp;quot;* ware&amp;quot; series all great titles. &lt;/p&gt;  &lt;p&gt;Later years until now, I've been reading some great books on many other topics. Besides all the classics of my profession (COM+, Cardspace, WCF Unleashed, etc) I've read (and read) a lot about social &amp;amp; economic sciences: Taleb's &amp;quot;Black Swan&amp;quot;, Jared's &amp;quot;Collapse&amp;quot; &amp;amp; &amp;quot;Guns, Steel &amp;amp; Germs&amp;quot;, Druon's &amp;quot;&lt;a href="http://en.wikipedia.org/wiki/The_Accursed_Kings"&gt;The accursed Kings&lt;/a&gt;&amp;quot;, Pollan's &amp;quot;Omnivore's Dilemma&amp;quot; (great book), Jim Collins' &amp;quot;Good to Great&amp;quot; and &amp;quot;Build to Last&amp;quot;. I also enjoy historical novels:&amp;#160; Folletts' &amp;quot;&lt;a href="http://en.wikipedia.org/wiki/The_Pillars_of_the_Earth"&gt;The Pillars of the Earth&lt;/a&gt;&amp;quot;, Seynor's &amp;quot;Roma&amp;quot; are great books and some of Arturo Perez Reverte books (El Pintor de Batallas, La Sombar del Aguila, La Carta Esferica).&lt;/p&gt;  &lt;p&gt;Now my turn to tag: &lt;a href="http://edjez.instedd.org/"&gt;Ed&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/gblock/"&gt;Glenn&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/blaine/"&gt;Blaine&lt;/a&gt;, &lt;a href="http://codexdigitalis.com/blog/"&gt;Ricardo&lt;/a&gt; and &lt;a href="http://blogs.southworks.net/mwoloski/"&gt;Matias&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8964570" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Other/default.aspx">Other</category></item><item><title>Northwind Hosting exists, it's better than what you saw and it's called SaaSGrid</title><link>http://blogs.msdn.com/eugeniop/archive/2008/09/11/northwind-hosting-exists-it-s-better-than-what-you-saw-and-it-s-called-saasgrid.aspx</link><pubDate>Fri, 12 Sep 2008 03:32:09 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8945832</guid><dc:creator>eugeniop</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/eugeniop/comments/8945832.aspx</comments><wfw:commentRss>http://blogs.msdn.com/eugeniop/commentrss.aspx?PostID=8945832</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://www.saasblogs.com/author/sinclair/"&gt;Sinclair Schuller&lt;/a&gt;, CEO of &lt;a href="http://www.apprenda.com"&gt;Apprenda&lt;/a&gt; was kind enough to demo &lt;a href="http://www.apprenda.com/saasgrid"&gt;SaaSGrid&lt;/a&gt; to me earlier this week, patient enough to answer all my questions and I have to say, that I'm really impressed. &lt;/p&gt;  &lt;p&gt;What is SaaSGrid? In their own words:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;If you're building an on-demand business application, using SaaSGrid as your foundation will help you build quickly and inexpensively, ensuring that your customers can access your application's value sooner rather than later. Furthermore, you&amp;#8217;ll then be able to deploy your SaaSGrid application to SaaSGrid itself, which provides a safe and robust virtual application container and hosting environment for your delivery needs. SaaSGrid's comprehensiveness ensures that your business and revenue approach will be able to flex and grow with changing market demands.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Sinclair walked me through the whole experience of building an app, on-boarding it, deploying it in different environments and then consuming it. &lt;/p&gt;  &lt;p&gt;SaaSGrid has some very nice properties for ISVs. Besides the whole value proposition of hosting the app, SaaSGrid offers higher value services such as application lifecycle management, billing and metering, tenant management, etc. All of this without requiring you to learn a new programming language, paradigm and/or platform: everything is based on standard .NET so if you are familiar, skilled and trained on the standard Microsoft platform, leveraging SaaSGrid should really be very easy. Furthermore, you retain the freedom to deploy your app in other ways: on-premises, on-demand, etc. &lt;/p&gt;  &lt;p&gt;This &amp;quot;non-intrusiveness&amp;quot; of SaaSGrid is a property of &lt;a href="http://en.wikipedia.org/wiki/Platform_as_a_service"&gt;PaaS&lt;/a&gt; offerings we have studied in the past. I personally believe that all offerings requiring an ISV to re-write an app, or re-learn a whole new development paradigm (custom language, non-mainstream storage, etc) will be at a disadvantage compared to PaaS offerings that will make the most of your existing investments and strengths, and therefore adoption will be hurt (probability +80% :-)).&lt;/p&gt;  &lt;p&gt;Last year we developed and wrote &amp;quot;&lt;a href="http://blogs.msdn.com/eugeniop/archive/2008/02/10/northwind-hosting-concept-demo.aspx"&gt;Northwind Hosting concept demo&lt;/a&gt;&amp;quot; with the intent of elevating concepts we believed were important in PaaS offerings. We also wrote a couple of white papers describing this topic (e.g. &lt;a href="http://msdn2.microsoft.com/en-us/library/bb891759.aspx"&gt;ISVs are from Mars, Hosters are from Venus&lt;/a&gt;; &lt;a href="http://msdn.microsoft.com/en-us/library/bb735303.aspx"&gt;Efficient Software Delivery Through Service Delivery Platforms&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Many concepts discussed there are now implemented for real in SaaSGrid, but I also saw lots of new innovative features which I found extremely useful. &lt;/p&gt;  &lt;p&gt;Last, having an idea is great, but cheap :-). Writing about an idea takes some non-trivial effort (it is non-trivial for me at least). Turning an idea into a real offering is very hard. So kudos to Sinclair and his team for their hard work.&amp;#160; &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8945832" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/SaaS/default.aspx">SaaS</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Run/default.aspx">S+S_Run</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Build/default.aspx">S+S_Build</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S/default.aspx">S+S</category></item><item><title>Concurrency in SSDS</title><link>http://blogs.msdn.com/eugeniop/archive/2008/08/01/concurrency-in-ssds.aspx</link><pubDate>Fri, 01 Aug 2008 23:12:31 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8802904</guid><dc:creator>eugeniop</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/eugeniop/comments/8802904.aspx</comments><wfw:commentRss>http://blogs.msdn.com/eugeniop/commentrss.aspx?PostID=8802904</wfw:commentRss><description>&lt;p&gt;A common concern with SSDS, and a common question I get in many presentations I've given is how to handle concurrency and entity versioning.&lt;/p&gt; &lt;p&gt;Suppose you have the following sequence of events:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ConcurrencyinSSDS_10215/image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="345" alt="image" src="http://blogs.msdn.com/blogfiles/eugeniop/WindowsLiveWriter/ConcurrencyinSSDS_10215/image_thumb_1.png" width="512" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;By default, SSDS will just accept the last &lt;strong&gt;&lt;em&gt;Update&lt;/em&gt;&lt;/strong&gt; and overwrite any changes made in between. If you want SSDS to be strict about versioning, then you need to express this intent in the scope of the call.&lt;/p&gt; &lt;p&gt;If you are using SOAP, you just need to create a new instance of the &lt;strong&gt;&lt;em&gt;VersionMatch&lt;/em&gt;&lt;/strong&gt; class and specify your requirement:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public void &lt;/span&gt;Update(T entity)
{
     &lt;span style="color: blue"&gt;try
     &lt;/span&gt;{
         &lt;span style="color: #2b91af"&gt;Scope &lt;/span&gt;scope = CreateScope();
         scope.VersionMatch = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;VersionMatch&lt;/span&gt;() 
         { 
            MatchType = &lt;span style="color: #2b91af"&gt;VersionMatchType&lt;/span&gt;.Match, 
            Version = entity.Version 
         };
         &lt;/pre&gt;&lt;pre class="code"&gt;         scope.EntityId = entity.Id.ToString();
         &lt;span style="color: #2b91af"&gt;Entity &lt;/span&gt;flexibleEntity = entityMapper.FromType(entity);
         proxy.Update(scope, flexibleEntity);
     }
     &lt;span style="color: blue"&gt;catch &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;FaultException&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Error&lt;/span&gt;&amp;gt; ex)
     {
        &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UpdateException&lt;/span&gt;(ex);
     }
}&lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;A side note: in writing a new test to verify this behavior, I dumped &lt;strong&gt;&lt;em&gt;ExceptionExpected&lt;/em&gt;&lt;/strong&gt; attribute in the test method altogether for this one, that gives me much more control on the exact place I expect the exception to occur:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.IsTrue(ThrowsException&amp;lt;&lt;span style="color: #2b91af"&gt;UpdateException&lt;/span&gt;&amp;gt;(() =&amp;gt; rb.Update(b2)));&lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;ThrowsException&amp;lt;E&amp;gt;&lt;/em&gt;&lt;/strong&gt; is:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;     private static bool &lt;/span&gt;ThrowsException&amp;lt;E&amp;gt;(&lt;span style="color: #2b91af"&gt;Action &lt;/span&gt;f) &lt;span style="color: blue"&gt;where &lt;/span&gt;E : &lt;span style="color: #2b91af"&gt;Exception
     &lt;/span&gt;{
            &lt;span style="color: blue"&gt;try
            &lt;/span&gt;{
                f();
            }
            &lt;span style="color: blue"&gt;catch &lt;/span&gt;(E)
            {
                &lt;span style="color: blue"&gt;return true&lt;/span&gt;;
            }
            &lt;span style="color: blue"&gt;catch
            &lt;/span&gt;{
            }

            &lt;span style="color: blue"&gt;return false&lt;/span&gt;;
     }&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8802904" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Sitka/default.aspx">Sitka</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Build/default.aspx">S+S_Build</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/SQL+Server+Data+Services/default.aspx">SQL Server Data Services</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/SSDS/default.aspx">SSDS</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/TDD/default.aspx">TDD</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Concurrency/default.aspx">Concurrency</category></item><item><title>Claim based security made easy</title><link>http://blogs.msdn.com/eugeniop/archive/2008/07/10/claim-based-security-made-easy.aspx</link><pubDate>Thu, 10 Jul 2008 17:22:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8717751</guid><dc:creator>eugeniop</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/eugeniop/comments/8717751.aspx</comments><wfw:commentRss>http://blogs.msdn.com/eugeniop/commentrss.aspx?PostID=8717751</wfw:commentRss><description>&lt;p&gt;When we implemented claim based authorization in LitwareHR, we had to write a lot of code and play with non-trivial configurations (LitwarehR includes 2 STS and all the supporting infrastructure for securing the web services and the callers to them).&lt;/p&gt;  &lt;p&gt;Not being a security expert myself, I found the &amp;#8220;theory&amp;#8221; behind this amazingly simple and powerful, but the &amp;#8220;practice&amp;#8221; quite complex. &lt;/p&gt;  &lt;p&gt;The good news is that all this just got much easier with the release of &amp;#8220;Zermatt&amp;#8221;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&amp;#8220;Zermatt&amp;#8221; is a .NET developer framework and SDK that helps developers build claims-aware applications to address today&amp;#8217;s application security requirements using a simplified model that is open and extensible, can improve security, and boosts productivity for developers.&amp;#160; Developers can build externalized authentication capabilities for &amp;#8220;relying party&amp;#8221; applications and build custom &amp;#8220;identity providers&amp;#8221;, often referred to as Security Token Services (STS).&amp;#160; With these components, developers can build applications that meet a variety of business needs more quickly.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Quoting my good friend &lt;a href="http://www.peterprovost.org"&gt;Peter Provost&lt;/a&gt;: &amp;#8220;I love deleting code!&amp;#8221;. &amp;#8220;Zermatt&amp;#8221; will allow us to get rid of a ton of &amp;quot;plumbing&amp;quot; code in LitwareHR.&lt;/p&gt;  &lt;p&gt;Update: if you look at LitwareHR code, you will see that the approach used is very similar to Zermatt's, so it is great to see that we were on the right direction. Obviously, Zermatt's scope is larger.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Resources:&lt;/h3&gt;  &lt;p&gt;Link to the beta:&amp;#160; &lt;a href="http://go.microsoft.com/fwlink/?LinkId=122266"&gt;http://go.microsoft.com/fwlink/?LinkId=122266&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Download &lt;a href="http://www.pluralsight.com/community/blogs/keith/"&gt;Keith Brown's&lt;/a&gt; &lt;u&gt;Whitepaper&lt;/u&gt;:&amp;#160; &lt;a href="http://go.microsoft.com/fwlink/?LinkId=122266"&gt;http://go.microsoft.com/fwlink/?LinkId=122266&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;More info on MSDN:&amp;#160; &lt;a href="http://msdn.microsoft.com/en-us/security/aa570351.aspx"&gt;http://msdn.microsoft.com/en-us/security/aa570351.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Maestro Bertocci's blog: &lt;a href="http://blogs.msdn.com/vbertocci"&gt;http://blogs.msdn.com/vbertocci&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Kim Cameron blog: &lt;a href="http://www.identityblog.com"&gt;http://www.identityblog.com&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Keith Brown blog &amp;amp; article: &lt;a title="http://www.pluralsight.com/community/blogs/keith/archive/2008/07/09/introducing-microsoft-code-name-zermatt.aspx" href="http://www.pluralsight.com/community/blogs/keith/archive/2008/07/09/introducing-microsoft-code-name-zermatt.aspx"&gt;http://www.pluralsight.com/community/blogs/keith/archive/2008/07/09/introducing-microsoft-code-name-zermatt.aspx&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Requirements:&lt;/h3&gt;  &lt;p&gt;&amp;#8220;Zermatt&amp;#8221; requires .Net 3.5 to be installed. It has been verified on Windows 2K3 SP2 with IIS 6.0 and Windows Vista SP1 and Windows Server 2008 with IIS 7.0. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8717751" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Web+Client/default.aspx">Web Client</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/S_2B00_S_5F00_Build/default.aspx">S+S_Build</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Security/default.aspx">Security</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Federated+Identity/default.aspx">Federated Identity</category><category domain="http://blogs.msdn.com/eugeniop/archive/tags/Claims/default.aspx">Claims</category></item></channel></rss>