<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.southworks.net/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Matias Woloski</title>
	
	<link>http://blogs.southworks.net/mwoloski</link>
	<description>my facade</description>
	<lastBuildDate>Thu, 20 Oct 2011 16:28:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.southworks.net/mwoloski" /><feedburner:info uri="mwoloski" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>DelegatingHandler vs HttpOperationHandler – WCF Web API</title>
		<link>http://feeds.southworks.net/~r/mwoloski/~3/dLRQjER4iwU/</link>
		<comments>http://blogs.southworks.net/mwoloski/2011/10/20/delegatinghandler-vs-httpoperationhandler-wcf-web-api/#comments</comments>
		<pubDate>Thu, 20 Oct 2011 16:16:01 +0000</pubDate>
		<dc:creator>Matias Woloski</dc:creator>
				<category><![CDATA[WCF Web API]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/mwoloski/?p=732</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/mwoloski/2011/10/20/delegatinghandler-vs-httpoperationhandler-wcf-web-api/" class="more-link">read more<img src="http://blogs.southworks.net/mwoloski/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p>Yesterday <a href="http://haacked.com">Phil Haack</a> wrote a post about <a href="http://haacked.com/archive/2011/10/19/implementing-an-authorization-attribute-for-wcf-web-api.aspx">Implementing an Authorization Attribute for WCF Web API</a>. We’re doing something similar to handle auth using SimpleWebTokens handled by <a href="http://www.google.com.ar/url?sa=t&amp;rct=j&amp;q=windows%20azure%20acs&amp;source=web&amp;cd=1&amp;ved=0CCsQFjAA&amp;url=http%3A%2F%2Facs.codeplex.com%2F&amp;ei=8EegTtjYJKTz0gHMg5HjBA&amp;usg=AFQjCNFAQwynNtM6Ip3ttXMKIqQSPlPJzg&amp;sig2=S9WqL107lA2OIat13tr_hA">ACS</a> and found a mix of approaches between <a href="http://pfelix.wordpress.com/2011/10/08/wcf-web-apibuilding-an-authorize-attribute/">Pedro Felix</a>, <a href="http://codebetter.com/howarddierking/2011/10/11/oauth-2-0-in-web-api/">Howard’s post</a>, <a href="https://bitbucket.org/lewisbenge/wcf-web-api-oauth-integration">Lewis</a>, and <a href="http://blogs.southworks.net/jhalife">Johnny</a>’s team who is also working on something similar. However I was too lazy to read the blogs and thrown this out to twitter knowing that <a href="http://twitter.com/gblock">@gblock</a> would give me the answer I wanted in matter of minutes <img style="border-bottom-style: none;border-left-style: none;border-top-style: none;border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.southworks.net/mwoloski/files/2011/10/wlEmoticon-smile.png"></p>
<blockquote><p><strong>@woloski:</strong> when would you use a <font color="#ff0000"></font><font color="#ff0000">delegatingchannel</font> vs <font color="#00ff00"></font><font color="#00ff00">httpoperationhandler</font><font color="#00ff00"></font>? I&#8217;ve found different samples using both</p>
</blockquote>
<p>And indeed he replied. I like things explained in plain English from someone who really knows the thing, so here are the tweets with some color coding to separate one from the other. </p>
<p><strong>NOTE</strong>: make sure to also read <a href="http://codebetter.com/glennblock/2011/05/17/message-handlers-vs-operation-handlers-which-one-to-use-2/">Glenn’s post which goes into much more detail</a>.</p>
<blockquote><p><strong>@gblock</strong>: there are significant diffs. One is for <font></font><font>pure <font color="#ff0000">http request / resp related concerns</font></font><font color="#ff0000"> </font>(message handlers) the other for <font></font><font color="#00ff00">app level</font><font></font></p>
<p><strong>@gblock: </strong>one is <font></font><font color="#ff0000">global / knows nothing about the service</font><font></font> the other does <font></font><font color="#00ff00">knows about the service</font><font></font>.</p>
<p><strong>@gblock: </strong>one is a <font></font><font color="#ff0000">Russian doll allowing pre-post handling</font><font></font>, the other is a <font></font><font color="#00ff00">sequential pipeline</font><font></font>.</p>
<p><strong>@gblock: </strong>one <font></font><font color="#00ff00"><font>handles model binding type scenarios</font> </font>(operation handlers) <font></font><font color="#ff0000">the other does not</font><font></font></p>
<p><strong>@gblock: </strong>one is <font></font><font color="#ff0000"><font>async</font> </font>(message handlers) the other is <font></font><font color="#00ff00">sync</font><font></font>. So if you have something <font></font><font color="#ff0000"><font>io bound</font> </font>use message handlers</p>
<p><font></font><strong>@gblock: </strong><font color="#ff0000"><font>for cross cutting http concerns like etags, or if-none-match</font> </font>use message handlers.</p>
<p><font></font><strong>@gblock: </strong><font color="#00ff00">for validation / logging of app data</font><font></font> use operation handlers. <font></font><font color="#0000ff">For security you might use both</font><font></font> as Howard did for Oauth</p>
<p><strong>@gblock: </strong>if it is <font></font><font color="#ff0000">truly cross cutting and doesn&#8217;t require details about the operation</font><font></font> itself like parameter values.</p>
<p><strong>@gblock: </strong>message handlers can <font></font><font color="#ff0000"><font>handle </font><font>requests dynamically</font></font><font></font> ie they can handle a request to \foo without an op foo</p>
<p><strong>@gblock: </strong>architecturally I think they make sense even though there is some overlap. <font><font></font></font><font><font color="#ff0000"><font>HTTP concerns</font> </font></font><font></font>vs <font><font></font></font><font><font color="#00ff00"><font>app concerns</font> </font></font><font></font>is the line.</p>
</blockquote>
<p>For our case we will use HttpOperationHandlers because we want access to the operation to check that it contains an attribute.</p>
<p>Case closed!</p>
<img src="http://feeds.feedburner.com/~r/mwoloski/~4/dLRQjER4iwU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss />
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blogs.southworks.net/mwoloski/2011/10/20/delegatinghandler-vs-httpoperationhandler-wcf-web-api/</feedburner:origLink></item>
		<item>
		<title>WebCast: Explorando Windows Azure AppFabric – Service Bus Messaging y Access Control Service</title>
		<link>http://feeds.southworks.net/~r/mwoloski/~3/o4j877OoozM/</link>
		<comments>http://blogs.southworks.net/mwoloski/2011/10/12/webcast-explorando-windows-azure-appfabric-service-bus-messaging-y-access-control-service/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 14:28:26 +0000</pubDate>
		<dc:creator>Matias Woloski</dc:creator>
				<category><![CDATA[Access Control Service]]></category>
		<category><![CDATA[Service Bus]]></category>
		<category><![CDATA[Windows Azure AppFabric]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/mwoloski/2011/10/12/webcast-explorando-windows-azure-appfabric-service-bus-messaging-y-access-control-service/</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/mwoloski/2011/10/12/webcast-explorando-windows-azure-appfabric-service-bus-messaging-y-access-control-service/" class="more-link">read more<img src="http://blogs.southworks.net/mwoloski/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p>Hace algo mas de un mes <a href="http://twitter.com/emangare">Edu Mangarelli</a> me invito a dar un web cast de Windows Azure AppFabric, que acepte con gusto. Finalmente, el Miercoles pasado con <a href="http://twitter.com/hmeydac">Hernan Meydac Jean</a> hicimos una presentacion de 1 hora de este tema. En particular nos enfocamos en explicar ServiceBus Messaging (colas, topics y subscriptions) y Access Control Service (la version 2 que esta en produccion). </p>
<p>Dejo aqui el link del webcast que fue grabado para aquellos que les interese.</p>
<p><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032494854&amp;culture=es-AR"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/10/image.png" width="644" height="377"></a></p>
<p><a title="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032494854&amp;culture=es-AR" href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032494854&amp;culture=es-AR">https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032494854&amp;culture=es-AR</a></p>
<img src="http://feeds.feedburner.com/~r/mwoloski/~4/o4j877OoozM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss />
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blogs.southworks.net/mwoloski/2011/10/12/webcast-explorando-windows-azure-appfabric-service-bus-messaging-y-access-control-service/</feedburner:origLink></item>
		<item>
		<title>Not enough space on the disk – Windows Azure</title>
		<link>http://feeds.southworks.net/~r/mwoloski/~3/j-Iwl-xRNHw/</link>
		<comments>http://blogs.southworks.net/mwoloski/2011/08/04/not-enough-space-on-the-disk-windows-azure/#comments</comments>
		<pubDate>Thu, 04 Aug 2011 22:33:10 +0000</pubDate>
		<dc:creator>Matias Woloski</dc:creator>
				<category><![CDATA[Azure]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/mwoloski/2011/08/04/not-enough-space-on-the-disk-windows-azure/</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/mwoloski/2011/08/04/not-enough-space-on-the-disk-windows-azure/" class="more-link">read more<img src="http://blogs.southworks.net/mwoloski/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p>No, it’s not because Local Storage quota is low. That’s easy to fix by just increasing the quota in the SerivceDef. I hit this nasty issue while working with WebDeploy, but since you might get this in a different context as well I wanted to share it and get hours back of your life, dear reader <img style="border-bottom-style: none;border-left-style: none;border-top-style: none;border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.southworks.net/mwoloski/files/2011/08/wlEmoticon-smile.png"><br />
<h2>Problem</h2>
<p>WebDeploy throws an out of disk exception when creating a package
<p><em>There is not enough space on the disk. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.WriteCore(Byte[] buffer, Int32 offset, Int32 count) at System.IO.BinaryWriter.Write(Byte[] buffer, Int32 index, Int32 count) at Microsoft.Web.Deployment.ZipEntry.ReadFromFile(String path, Boolean shouldCompress, BinaryWriter tempWriter, Stream stream, FileAttributes attr, DateTime lastModifiedTime, String descriptor, Int64 size) at Microsoft.Web.Deployment.ZipEntry..ctor(String path, DeploymentObject source, ZipFile zipFile)</em><br />
<h2>Analysis</h2>
<p>WebDeploy uses a temp path to create temporary files during the package creation. This folder seems to have a 100MB quota according to MSDN, so if the package is more than that, the process will throw an IO exception because the &#8220;disk is full&#8221; even though there is plenty of space. Below a trace of Process Monitor running from the Azure Web Role showing the CreateFile returning DISK FULL.
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/08/image2.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/08/image_thumb2.png" width="1028" height="446"></a></p>
<p>By looking with Reflector, we can validate that WebDeploy is using Path.GetTempPath. </p>
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/08/image1.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/08/image_thumb1.png" width="434" height="357"></a><br />
<h2>Solution</h2>
<p>Since we can&#8217;t change WebDeploy code nor parameterize it to use a different path, the solution is to change the TEMP/TMP environment variables, as suggested here <a href="http://msdn.microsoft.com/en-us/library/gg465400.aspx#Y976">http://msdn.microsoft.com/en-us/library/gg465400.aspx#Y976</a>. An excerpt…
<p><strong><font size="4">Ensure That the TEMP/TMP Target Directory Has Sufficient Space</font></strong></p>
<p>The standard Windows environment variables TEMP and TMP are available to code running in your application. Both TEMP and TMP point to a single directory that has a maximum size of 100 MB. Any data stored in this directory is not persisted across the lifecycle of the hosted service; if the role instances in a hosted service are recycled, the directory is cleaned.
<p>If the temporary directory for the hosted service runs out of space, or if you need data to persist in the temporary directory across the lifecycle of the hosted service, you can implement one of the following alternatives:
<li>You can configure a local storage resource, and access it directly instead of using TEMP or TMP. To access a local storage resource from code running within your application, call the <a href="http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.serviceruntime.roleenvironment.getlocalresource.aspx">RoleEnvironment.GetLocalResource</a> method. For more information about setting up local storage resources, see <a href="http://msdn.microsoft.com/en-us/library/ee758708.aspx">How to Configure Local Storage Resources</a>.&nbsp;
<li>You can configure a local storage resource, and point the TEMP and TMP directories to point to the path of the local storage resource. This modification should be performed within the <a href="http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.serviceruntime.roleentrypoint.onstart.aspx">RoleEntryPoint.OnStart</a> method.</li>
<p>The following code example shows how to modify the target directories for TEMP and TMP from within the OnStart method:
<pre>using System;
using Microsoft.WindowsAzure.ServiceRuntime;

namespace WorkerRole1
{
   public class WorkerRole : RoleEntryPoint
   {
      public override bool OnStart()
      {
         string customTempLocalResourcePath =
            RoleEnvironment.GetLocalResource("tempdir").RootPath;
         Environment.SetEnvironmentVariable("TMP", customTempLocalResourcePath);
         Environment.SetEnvironmentVariable("TEMP", customTempLocalResourcePath);

         // The rest of your startup code goes here…

         return base.OnStart();
      }
   }
}</pre>
<img src="http://feeds.feedburner.com/~r/mwoloski/~4/j-Iwl-xRNHw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss />
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blogs.southworks.net/mwoloski/2011/08/04/not-enough-space-on-the-disk-windows-azure/</feedburner:origLink></item>
		<item>
		<title>Windows Azure Accelerator for Worker Role – Update your workers faster</title>
		<link>http://feeds.southworks.net/~r/mwoloski/~3/KbLA4dKu9u4/</link>
		<comments>http://blogs.southworks.net/mwoloski/2011/07/22/windows-azure-accelerator-for-worker-role-update-your-workers-faster/#comments</comments>
		<pubDate>Fri, 22 Jul 2011 18:35:00 +0000</pubDate>
		<dc:creator>Matias Woloski</dc:creator>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Emerging Technology]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/mwoloski/?p=681</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/mwoloski/2011/07/22/windows-azure-accelerator-for-worker-role-update-your-workers-faster/" class="more-link">read more<img src="http://blogs.southworks.net/mwoloski/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p>During the last couple of years I worked quite a lot with Windows Azure. There is no other choice if you work with the Microsoft DPE team, like we do at <a href="http://blogs.southworks.net/">Southworks</a> <img style="border-bottom-style: none;border-left-style: none;border-top-style: none;border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.southworks.net/mwoloski/files/2011/07/wlEmoticon-smile2.png"></p>
<p>The thing is that we usually have to deal with last minute deployments to Azure that can take more than a minute &lt;grin&gt;. The good news is that some of that pain started to be eased lately. </p>
<ul>
<li>First, the Azure team enabled Web Deploy. For development this helped a lot.</li>
<li>Then, we helped DPE to build the <a href="http://waawebroles.codeplex.com/">Windows Azure Accelerators for Web Roles</a>, announced by <a href="http://ntotten.com/2011/07/windows-azure-accelerator-for-web-roles/">Nate last week</a>. I explained how the accelerator work in a <a href="http://blogs.southworks.net/mwoloski/2011/07/13/windows-azure-accelerators-for-web-roles-or-how-to-convert-azure-into-a-dedicated-hosting-elastic-automated-solution/">previous post</a>. We actually used the Web Role Accelerator to deploy <a href="http://www.tankster.net">www.tankster.net</a> (the <a href="http://watgames.codeplex.com/">social game</a> <a href="http://blogs.msdn.com/b/windowsazure/archive/2011/07/20/build-your-next-game-with-the-windows-azure-toolkit-for-social-games.aspx">announced on Wednesday</a>). We have the game backend running in two small instances and we had everything ready for the announcement last week but of course there were tweaks on the game till the last minute. We did like 10 deployments in the last day before the release. 10 * 15 minutes per deploy is almost three hours. Instead using the accelerator each deploy took us 30 seconds. The dev team happy with getting 3 hours of our life back.</li>
<li>Now, to complete the whole picture I saw it might be a good idea to have the same thing but for Worker Roles</li>
</ul>
<p align="left">So I teamed with Alejandro Iglesias and Fernando Tubio from the Southworks crew and together we created the <a href="http://snipurl.com/workerroleaccelerator">Windows Azure Accelerator for Worker Roles</a>.</p>
<h2>How it works?</h2>
<p>You basically deploy the accelerator with your Windows Azure solution and the “shell” worker will be polling a blob storage container to find and load the “real worker roles”. We made it easy so you don’t have to change any line of code of your actual worker role. Simply throw the entry point assembly and its dependencies in the storage container, set the name of the entry point assembly in a file (__entrypoint.txt) and the accelerator will pick it up, unload the previous AppDomain (if any) and create a new AppDomain with the latest version.</p>
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/07/image9.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/07/image_thumb8.png" width="640" height="371"></a></p>
<h2>How to use it?</h2>
<p>You can find the project in <a href="http://snipurl.com/workerroleaccelerator">github</a>, there is a README in the home page that explain the steps to use it.&nbsp; <a href="https://github.com/downloads/southworks/workerroleaccelerator/WorkerRoleAccelerator-1.0.0.zip">Download it</a> and let us know what you think! </p>
<p>I would like to have a Visual Studio template to make it easier to integrate with existing solutions.</p>
<p>Enjoy!</p>
<img src="http://feeds.feedburner.com/~r/mwoloski/~4/KbLA4dKu9u4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss />
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blogs.southworks.net/mwoloski/2011/07/22/windows-azure-accelerator-for-worker-role-update-your-workers-faster/</feedburner:origLink></item>
		<item>
		<title>Windows Azure Accelerators for Web Roles or How to Convert Azure into a dedicated hosting elastic automated solution</title>
		<link>http://feeds.southworks.net/~r/mwoloski/~3/kfORCvpKQ1o/</link>
		<comments>http://blogs.southworks.net/mwoloski/2011/07/13/windows-azure-accelerators-for-web-roles-or-how-to-convert-azure-into-a-dedicated-hosting-elastic-automated-solution/#comments</comments>
		<pubDate>Wed, 13 Jul 2011 19:02:37 +0000</pubDate>
		<dc:creator>Matias Woloski</dc:creator>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Emerging Technology]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/mwoloski/2011/07/13/windows-azure-accelerators-for-web-roles-or-how-to-convert-azure-into-a-dedicated-hosting-elastic-automated-solution/</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/mwoloski/2011/07/13/windows-azure-accelerators-for-web-roles-or-how-to-convert-azure-into-a-dedicated-hosting-elastic-automated-solution/" class="more-link">read more<img src="http://blogs.southworks.net/mwoloski/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p>Yesterday <a href="http://ntotten.com/2011/07/windows-azure-accelerator-for-web-roles/">Nathan announced</a> the release of the <a href="http://waawebroles.codeplex.com/">Windows Azure Accelerators for Web Roles</a>. If you are using Windows Azure today, this can be a pain relief if you’ve got used to wait 15 minutes (or more) every time you deploy to Windows Azure (and hope nothing was wrong in the package to realize after then that you’ve lost 15 minutes of your life). </p>
<p>Also, as the title says, and as <a href="http://blog.maartenballiauw.be/post/2011/07/13/Windows-Azure-Accelerator-for-Web-Roles.aspx">Maarten says in his blog</a>, if you have lots of small websites you don’t want to pay for 100 different web roles because that will be lots of money. Since Azure 1.4 you can use the Full IIS support but the experience is not optimal from the management perspective because it requires to redeploy each time you add a new website to the cscfg.</p>
<p>In short, the best way I can describe this accelerator is: </p>
<blockquote><p><strong>It transform your Windows Azure web roles into a dedicated elastic hosting solution with farm support and a very nice IIS web interface to manage the websites</strong>.</p>
</blockquote>
<p>I won’t go into much more details on the WHAT, since <a href="http://ntotten.com/2011/07/windows-azure-accelerator-for-web-roles/">Nathan</a> and <a href="http://blog.maartenballiauw.be/post/2011/07/13/Windows-Azure-Accelerator-for-Web-Roles.aspx">Maarten</a> already did a great job in their blogs. Instead I will focus on the HOW. We all love that things work, but when they don’t work you want to know where to touch. So, below you can find the <em>blueprints</em> of the engine.</p>
<p><font size="5"></font>&nbsp;</p>
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/07/image7.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/07/image_thumb6.png" width="640" height="455"></a></p>
<p>&nbsp;</p>
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/07/image8.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/07/image_thumb7.png" width="640" height="390"></a></p>
<p>Below some key code snippets that shows how things work.</p>
<p>The snippet below is the WebRole Entry Point Run method. We are spinning the Synchronization Service here that will block the execution. Since this is a web role, it will launch the IIS process as well and execute the code as usual.&nbsp; </p>
<pre class="brush: csharp;">public override void Run()
{
    Trace.TraceInformation("WebRole.Run");

    // Initialize SyncService
    var localSitesPath = GetLocalResourcePathAndSetAccess("Sites");
    var localTempPath = GetLocalResourcePathAndSetAccess("TempSites");
    var directoriesToExclude = RoleEnvironment.GetConfigurationSettingValue("DirectoriesToExclude").Split(';');
    var syncInterval = int.Parse(RoleEnvironment.GetConfigurationSettingValue("SyncIntervalInSeconds"), CultureInfo.InvariantCulture);

    this.syncService = new SyncService(localSitesPath, localTempPath, directoriesToExclude, "DataConnectionstring");
    this.syncService.SyncForever(TimeSpan.FromSeconds(syncInterval));
}
</pre>
<p>Then the other important piece is the SyncForever method. What this method does is the following:</p>
<ul>
<li>Update the IIS configuration using the IIS ServerManager API by reading from table storage</li>
<li>Synchronize the WebDeploy package from blob to local storage (point 4 in the diagram)</li>
<li>Deploy the sites using WebDeploy API, by taking the package from local storage</li>
<li>Creates and copies the WebDeploy package from IIS (if something changed)</li>
</ul>
<pre class="brush: csharp;">public void SyncForever(TimeSpan interval)
{
    while (true)
    {
        Trace.TraceInformation("SyncService.Checking for synchronization");

        try
        {
            this.UpdateIISSitesFromTableStorage();
        }
        catch (Exception e)
        {
            Trace.TraceError("SyncService.UpdateIISSitesFromTableStorage{0}{1}", Environment.NewLine, e.TraceInformation());
        }

        try
        {
            this.SyncBlobToLocal();
        }
        catch (Exception e)
        {
            Trace.TraceError("SyncService.SyncBlobToLocal{0}{1}", Environment.NewLine, e.TraceInformation());
        }

        try
        {
            this.DeploySitesFromLocal();
        }
        catch (Exception e)
        {
            Trace.TraceError("SyncService.DeploySitesFromLocal{0}{1}", Environment.NewLine, e.TraceInformation());
        }

        try
        {
            this.PackageSitesToLocal();
        }
        catch (Exception e)
        {
            Trace.TraceError("SyncService.PackageSitesToLocal{0}{1}", Environment.NewLine, e.TraceInformation());
        }

        Trace.TraceInformation("SyncService.Synchronization completed");

        Thread.Sleep(interval);
    }
}
</pre>
<p>My advice: If you are using Windows Azure today don’t waste more time doing lengthy deployments <img style="border-bottom-style: none;border-left-style: none;border-top-style: none;border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.southworks.net/mwoloski/files/2011/07/wlEmoticon-smile1.png">&nbsp;<a href="http://waawebroles.codeplex.com/">Download the Windows Azure Accelerators for Web Roles</a>.</p>
<p>Enjoy!</p>
<img src="http://feeds.feedburner.com/~r/mwoloski/~4/kfORCvpKQ1o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss />
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blogs.southworks.net/mwoloski/2011/07/13/windows-azure-accelerators-for-web-roles-or-how-to-convert-azure-into-a-dedicated-hosting-elastic-automated-solution/</feedburner:origLink></item>
		<item>
		<title>Windows Azure AppFabric Access Control in Practice (Spanish)</title>
		<link>http://feeds.southworks.net/~r/mwoloski/~3/H3g7ORbU-Sk/</link>
		<comments>http://blogs.southworks.net/mwoloski/2011/07/12/windows-azure-appfabric-access-control-in-practice-spanish/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 03:28:57 +0000</pubDate>
		<dc:creator>Matias Woloski</dc:creator>
				<category><![CDATA[ADFS]]></category>
		<category><![CDATA[Access Control Service]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[Claim-Based Identity]]></category>
		<category><![CDATA[Identity]]></category>
		<category><![CDATA[Windows Azure AppFabric]]></category>
		<category><![CDATA[Windows Identity Foundation]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/mwoloski/?p=666</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/mwoloski/2011/07/12/windows-azure-appfabric-access-control-in-practice-spanish/" class="more-link">read more<img src="http://blogs.southworks.net/mwoloski/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p>Como habia escrito en un <a href="http://blogs.southworks.net/mwoloski/2011/06/30/windows-azure-appfabric-cache-and-access-control-in-spanish-azure-bootcamp/">post anterior</a>, aqui dejo un video donde muestro Windows Identity Foundation y Windows Azure Access Control Service.</p>
<p>En este ejemplo muestro lo siguiente:</p>
<ul>
<li>Creo un sitio web de cero y agrego un identity provider de prueba (Add STS Reference)</li>
<li>Me falla una cosa con certificados y hago un poco de troubleshooting</li>
<li>Configuro el mismo sitio en Windows Azure Access Control (ACS) y genero la relacion de confianza entre mi sitio y ACS</li>
<li>Configuro otros identity providers en ACS</li>
<li>Muestro como podemos logearnos a una aplicacion utilizando diferentes proveedores de identidad. En particular muestro el ADFS de Microsoft,&nbsp; el ADFS de Southworks, Google, LiveID, etc.</li>
</ul>
<p>Sobre el final contesto algunas preguntas… </p>
<p><a href="http://vimeo.com/26211729"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/07/image4.png" width="636" height="361"></a></p>
<p>Espero que les sea util!</p>
<img src="http://feeds.feedburner.com/~r/mwoloski/~4/H3g7ORbU-Sk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss />
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blogs.southworks.net/mwoloski/2011/07/12/windows-azure-appfabric-access-control-in-practice-spanish/</feedburner:origLink></item>
		<item>
		<title>Ajax, Cross Domain, jQuery, WCF Web API or MVC, Windows Azure</title>
		<link>http://feeds.southworks.net/~r/mwoloski/~3/kCad--0ZsQ8/</link>
		<comments>http://blogs.southworks.net/mwoloski/2011/07/02/ajax-cross-domain-jquery-wcf-web-api-or-mvc-windows-azure/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 13:35:00 +0000</pubDate>
		<dc:creator>Matias Woloski</dc:creator>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Cross Domain]]></category>
		<category><![CDATA[WCF Web API]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/mwoloski/?p=658</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/mwoloski/2011/07/02/ajax-cross-domain-jquery-wcf-web-api-or-mvc-windows-azure/" class="more-link">read more<img src="http://blogs.southworks.net/mwoloski/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p>The title is SEO friendly as you can see <img style="border-bottom-style: none;border-left-style: none;border-top-style: none;border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.southworks.net/mwoloski/files/2011/07/wlEmoticon-smile.png">. This week, while working in a cool project, we had to explore options to expose a web API and make cross domain calls from an HTML5 client. Our specific scenario is: we develop the server API and another company is building the HTML5 client. Since we are in the development phase, we wanted to be agile and work independently from each other.&nbsp; The fact that we are using Azure and WCF Web API is an implementation detail, this can be applied to any server side REST framework and any platform.</p>
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/07/image3.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/07/image_thumb3.png" width="480" height="388"></a></p>
<p>We wanted a non-intrusive solution. This means being able to use the usual jQuery client (not learning a new client js API) and try to keep to the minimum the amount of changes in the client and server code. JSONP is an option but it does not work for POST requests. CORS is another option that I would like to try but I haven’t found a good jQuery plugin for that.</p>
<p>So in the end this is what we decided to use:</p>
<ul>
<li>WCF Web API to implement the REST backend (works also with MVC)
<li>jQuery to query the REST backend
<li>jQuery plugin (<a href="http://flxhr.flensed.com/">flXHR from flensed</a>) that overrides the jQuery AJAX transport with a headless flash component
<li>Windows Azure w/ WebDeploy enabled to host the API</li>
</ul>
<p>Having a working solution requires the following steps:</p>
<ol>
<li>Download <a href="https://github.com/getify/flensed">jQuery flXHR plugin</a> and add it to your scripts folder
<li>Download the <a href="http://flxhr.flensed.com/download.php">latest flXHR library</a>
<li>Put the cross domain policy xml file in the root of your server (change the allowed domains if you want)</p>
<pre class="brush: xml;">&lt;?xml version="1.0"?&gt;
&lt;!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"&gt;
&lt;cross-domain-policy&gt;

  &lt;allow-access-from domain="*" /&gt;
  &lt;allow-http-request-headers-from domain="*" headers="*" /&gt;

&lt;/cross-domain-policy&gt;
</pre>
</li>
</ol>
<p>Here is some JavaScript code that register the flXHR as a jQuery ajax transport and make an AJAX call when a button is click</p>
<pre class="brush: js;">&lt;script type="text/javascript"&gt;
    var baseUrl = "http://api.cloudapp.net/";

    $(function () {
        jQuery.flXHRproxy.registerOptions(baseUrl, { xmlResponseText: false, loadPolicyURL: baseUrl + "crossdomain.xml" });
    });

    $.ajaxSetup({ error: handleError });

    $("#btn").click(function () {
        $.ajax({
            url: baseUrl + "resources/1",
            success: function (data) {
                alert(data);
            }
        });
    });

    function handleError(jqXHR, errtype, errObj) {
        var XHRobj = jqXHR.__flXHR__;
        alert("Error: " + errObj.number
        + "\nType: " + errObj.name
        + "\nDescription: " + errObj.description
        + "\nSource Object Id: " + XHRobj.instanceId
    );
    }
&lt;/script&gt;
</pre>
<p>It’s important to set the ajaxSetup, otherwise POST requests will be converted to GET requests (seems like a bug in the library)</p>
<p>Finally, make sure to include the following scripts</p>
<pre class="brush: xml;">&lt;script src="/Scripts/jquery-1.6.2.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="/Scripts/flensed/flXHR.js"&gt;&lt;/script&gt;
&lt;script src="/Scripts/jquery.flXHRproxy.js" type="text/javascript"&gt;&lt;/script&gt;
</pre>
<p>The nice thing of this solution is that you can set the baseUrl to an empty string and remove the “registerOptions” and everything will keep working just fine from the same domain using the usual jQuery client.</p>
<p>This is the client with (default.html)</p>
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/07/image.png"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/07/image_thumb.png" width="545" height="210"></a></p>
<p>This is the server implemented with WCF Web API running in Azure</p>
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/07/image1.png"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/07/image_thumb1.png" width="547" height="198"></a></p>
<p>Turning on the network monitoring on IE9, we can see what is going on behind the scenes.</p>
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/07/image2.png"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/07/image_thumb2.png" width="684" height="196"></a></p>
<p>Notice the last two calls initiated by Flash. The first one downloading the crossdomain policy file and then the actual call to the API.</p>
<p>Some gotchas:</p>
<ul>
<li>I wasn’t able to send http headers (via beforeSend). This means that you can’t set the Accept header, it will always be */*</li>
<li>There is no support for other verbs than GET/POST (this is a Flash limitation)</li>
</ul>
<p>I uploaded the small <a href="http://snipurl.com/wcf-web-api-jquery-crossdomain">proof of concept here</a>.</p>
<p>Enjoy!</p>
<img src="http://feeds.feedburner.com/~r/mwoloski/~4/kCad--0ZsQ8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss />
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blogs.southworks.net/mwoloski/2011/07/02/ajax-cross-domain-jquery-wcf-web-api-or-mvc-windows-azure/</feedburner:origLink></item>
		<item>
		<title>Windows Azure AppFabric Cache and Access Control in Spanish – Azure Bootcamp</title>
		<link>http://feeds.southworks.net/~r/mwoloski/~3/HC0NSr2lRhI/</link>
		<comments>http://blogs.southworks.net/mwoloski/2011/06/30/windows-azure-appfabric-cache-and-access-control-in-spanish-azure-bootcamp/#comments</comments>
		<pubDate>Thu, 30 Jun 2011 12:38:00 +0000</pubDate>
		<dc:creator>Matias Woloski</dc:creator>
				<category><![CDATA[Access Control Service]]></category>
		<category><![CDATA[Caching]]></category>
		<category><![CDATA[Presentation]]></category>
		<category><![CDATA[Windows Azure AppFabric]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/mwoloski/2011/06/30/windows-azure-appfabric-cache-and-access-control-in-spanish-azure-bootcamp/</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/mwoloski/2011/06/30/windows-azure-appfabric-cache-and-access-control-in-spanish-azure-bootcamp/" class="more-link">read more<img src="http://blogs.southworks.net/mwoloski/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p>Hace un par de meses tuve el agrado de participar en el <a href="http://www.azurebootcamp.com/materials/enespanol">Windows Azure Bootcamp</a> organizado por Microsoft Argentina. Fue un evento de dos dias en el cual presente Windows Azure AppFabric (Caching y Access Control Service). Si conocen mi background se imaginaran que le dedique el 30% a Caching y el 70% a Access Control <img style="border-bottom-style: none;border-left-style: none;border-top-style: none;border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.southworks.net/mwoloski/files/2011/06/wlEmoticon-smile.png"></p>
<p>Gracias a <a href="http://twitter.com/#!/guadacasuso">Guada</a> y Microsoft que grabaron el evento y <a href="http://www.azurebootcamp.com/materials/enespanol">postearon el material</a>. Me tome el trabajo de subirlo a vimeo para que no se tengan que bajar un wmv completo de 700MB.&nbsp; </p>
<h2>Introduccion a Windows Azure AppFabric Caching</h2>
<p><a href="http://vimeo.com/25727939"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Screen shot 2011-06-29 at 2.26.53 PM" src="http://blogs.southworks.net/mwoloski/files/2011/06/Screen-shot-2011-06-29-at-2.26.53-PM.png" width="324" height="201"></a></p>
<p><strong>Contenido:</strong></p>
<p><strong>0:00 – 0:03 minutos: </strong>intro, agenda y un poco de blah blah</p>
<p><strong>0:03 – 0:25 minutos: </strong>Teoria de Windows Azure AppFabric Caching</p>
<h2>Introduccion a Windows Azure Access Control Service 2.0 (Teoria)</h2>
<p><strong>0:25 – 1:00</strong> <strong>minutos:</strong> Introduccion a Identidad Federada, Protocolos, Claims, STS, FAQ, ADFSv2 y Windows Azure AppFabric Access Control Service v2.</p>
<p><a href="http://vimeo.com/25727939"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Screen shot 2011-06-29 at 2.43.54 PM" src="http://blogs.southworks.net/mwoloski/files/2011/06/Screen-shot-2011-06-29-at-2.43.54-PM.png" width="324" height="192"></a></p>
<p>En un proximo post, la semana que viene, publicare la segunda parte de la charla en donde utilizo el Access Control Service para asegurar una aplicacion y utilzar diferentes proveedores de identidad.</p>
<p><strong>UPDATE: la </strong><a href="http://blogs.southworks.net/mwoloski/2011/07/12/windows-azure-appfabric-access-control-in-practice-spanish/"><strong>segunda parte esta publicada</strong></a></p>
<p>Espero que les sea util!</p>
<img src="http://feeds.feedburner.com/~r/mwoloski/~4/HC0NSr2lRhI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss />
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blogs.southworks.net/mwoloski/2011/06/30/windows-azure-appfabric-cache-and-access-control-in-spanish-azure-bootcamp/</feedburner:origLink></item>
		<item>
		<title>Troubleshooting WS-Federation and SAML2 Protocol</title>
		<link>http://feeds.southworks.net/~r/mwoloski/~3/ODO55_jT1ag/</link>
		<comments>http://blogs.southworks.net/mwoloski/2011/04/16/troubleshooting-ws-federation-and-saml2-protocol/#comments</comments>
		<pubDate>Sat, 16 Apr 2011 18:20:00 +0000</pubDate>
		<dc:creator>Matias Woloski</dc:creator>
				<category><![CDATA[ADFS]]></category>
		<category><![CDATA[Identity]]></category>
		<category><![CDATA[Windows Identity Foundation]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/mwoloski/2011/04/16/troubleshooting-ws-federation-and-saml2-protocol/</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/mwoloski/2011/04/16/troubleshooting-ws-federation-and-saml2-protocol/" class="more-link">read more<img src="http://blogs.southworks.net/mwoloski/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;float: right;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" align="right" src="http://blogs.southworks.net/mwoloski/files/2011/04/image20.png" width="130" height="128">During the last couple of years we have helped companies deploying federated identity solutions using WS-Fed and SAML2 protocols with products like ADFS, SiteMinder in various platforms. Claims-based identity has many benefits but as every solution it has its downsides. One of them is the additional complexity to troubleshoot issues if something goes wrong, especially when things are distributed and in production. Since the authentication is outsourced and it is not part of the application logic anymore you need someway to see what is happening behind the scenes.</p>
<p>I’ve used <a href="http://www.fiddler2.com/fiddler2/">Fiddler</a> and <a href="https://addons.mozilla.org/en-us/firefox/addon/httpfox/">HttpHook</a> in the past to see what’s going on in the wire. These are great tools but they are developer-oriented. If the user who is having issues to login to an app is not a developer, then things get more difficult. </p>
<ul>
<li>Either you have some kind of server side log with all the tokens that have been issued and a nice way to query those by user</li>
<li>Or you have some kind of tool that the user can run and intercept the token </li>
</ul>
<p><a href="http://blogs.southworks.net/fboerr">Fred</a>, one of the guys working on my team, had the idea couple of months ago to implement the latter. So we coded together the first version (very rough) of the <strong>token debugger. </strong>The code is really simple, we are embedding a WebBrowser control in a Winforms app and inspecting the content on the Navigating event. If we detect a token being posted we show that.</p>
<p>Let’s see how it works. First you enter the url of your app, in this case we are using wolof (the tool we use for the backlog) that is a Ruby app speaking WS-Fed protocol. .</p>
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image27.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image_thumb22.png" width="644" height="362"></a></p>
<p>After clicking the Southworks logo and entering my Active Directory account credentials, ADFS returns the token and it is POSTed to the app. In that moment, we intercept it and show it.</p>
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image28.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image_thumb23.png" width="644" height="362"></a></p>
<p>You can do two things with the token: <strong>send it via email </strong>(to someone that can read it <img style="border-bottom-style: none;border-left-style: none;border-top-style: none;border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.southworks.net/mwoloski/files/2011/04/wlEmoticon-smile.png">) or <strong>continue with the usual flow</strong>. If there is another STS in the way it will also show a second token.</p>
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image24.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image_thumb20.png" width="644" height="351"></a></p>
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image26.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image_thumb21.png" width="640" height="347"></a></p>
<p>Since I wanted to have this app handy I enabled ClickOnce deployment and deployed it to <a href="http://appharbor.com/">AppHarbor</a> (which works really well btw)</p>
<p>If you want to use it browse to and launch the ClickOnce app @ <a title="http://miller.apphb.com/" href="http://miller.apphb.com/">http://miller.apphb.com/</a></p>
<p>If you want to download the source code or contribute @ <a title="https://github.com/federicoboerr/token-requestor" href="https://github.com/federicoboerr/token-requestor">https://github.com/federicoboerr/token-requestor</a></p>
<img src="http://feeds.feedburner.com/~r/mwoloski/~4/ODO55_jT1ag" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss />
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blogs.southworks.net/mwoloski/2011/04/16/troubleshooting-ws-federation-and-saml2-protocol/</feedburner:origLink></item>
		<item>
		<title>Adding Internet Identity Providers like Facebook, Google, LiveID and Yahoo to your MVC web application using Windows Azure AppFabric Access Control Service and jQuery in 3 steps</title>
		<link>http://feeds.southworks.net/~r/mwoloski/~3/XOVP2FiL0BM/</link>
		<comments>http://blogs.southworks.net/mwoloski/2011/04/12/adding-internet-identity-providers-like-facebook-google-liveid-and-yahoo-to-your-mvc-web-application-using-windows-azure-appfabric-access-control-service-and-jquery-in-3-steps/#comments</comments>
		<pubDate>Tue, 12 Apr 2011 17:43:00 +0000</pubDate>
		<dc:creator>Matias Woloski</dc:creator>
				<category><![CDATA[Access Control Service]]></category>
		<category><![CDATA[Federation]]></category>
		<category><![CDATA[Identity]]></category>
		<category><![CDATA[Windows Identity Foundation]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/mwoloski/?p=593</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/mwoloski/2011/04/12/adding-internet-identity-providers-like-facebook-google-liveid-and-yahoo-to-your-mvc-web-application-using-windows-azure-appfabric-access-control-service-and-jquery-in-3-steps/" class="more-link">read more<img src="http://blogs.southworks.net/mwoloski/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p>If you want to achieve a login user experience like the one shown in the following screenshot, then keep reading…</p>
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image19.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image_thumb17.png" width="619" height="480"></a></p>
<p>Windows Azure AppFabric Access Control 2.0 has been released last week after one year in the Labs environment and it was officially announced today at <a href="http://live.visitmix.com">MIX</a>. If you haven’t heard about it yet, here is the elevator pitch of ACS v2:</p>
<blockquote><p><em>Windows Azure AppFabric Access Control Service (ACS) is a cloud-based service that provides an easy way of authenticating and authorizing users to gain access to your web applications and services while allowing the features of authentication and authorization to be factored out of your code. Instead of implementing an authentication system with user accounts that are specific to your application, you can let ACS orchestrate the authentication and much of the authorization of your users. ACS integrates with standards-based identity providers, including enterprise directories such as Active Directory, and web identities such as Windows Live ID, Google, Yahoo!, and Facebook</em></p>
</blockquote>
<p>According to the <a href="http://blogs.msdn.com/b/windowsazureappfabric/archive/2011/04/11/announcing-the-commercial-release-of-windows-azure-appfabric-caching-and-access-control.aspx">blog published today by the AppFabric team</a> you can use this service for free (at least throughout Jan 2012). Also the Labs environment are still available for testing purposes (not sure when they will turn this off).</p>
<blockquote><p><em>We encourage you to try the new version of the service and will be offering the service at no charge during a promotion period ending January 1, 2012. </em></p>
</blockquote>
<p>Now that we can use this for real, in this post I will show you how to create a little widget that will allow users of your website to login using social identity providers like Google, Facebook, LiveId or Yahoo. In this post I will go through the process of creating such experience for your website.</p>
<p>I will use an MVC Web Application, but this can be implemented in WebForms also or even WebMatrix if you understand the implementation details</p>
<h2>Step 1. Configure Windows Azure AppFabric Access Control Service</h2>
<ol>
<li>Create a new Service Namespace in <a href="http://portal.appfabriclabs.com">portal.appfabriclabs.com</a> or if you have an Azure subscription use the production version at <a href="http://windows.azure.com">windows.azure.com</a></p>
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image51.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image5_thumb.png" width="626" height="484"></a><br /> 
<li>The service namespace will be activated in a few minutes. Select it and click on Access Control Service to open the management console for that service namespace.
<li>In the management console go to Identity Providers and add Google, Yahoo and Facebook (LiveID is added by default). It’s very straightforward to do it. This is the information you have to provide for each of them. I just googled for the logos and some of them are not the best quality, so feel free to change them
<ul>
<li>Google
<ul>
<li>Login Text: Google
<li>Image Url: <a title="http://www.google.com/images/logos/ps_logo2.png" href="http://www.google.com/images/logos/ps_logo2.png">http://www.google.com/images/logos/ps_logo2.png</a></li>
</ul>
<li>Yahoo
<ul>
<li>Login Text: Yahoo
<li>Image Url: <a title="http://a1.twimg.com/profile_images/1178764754/yahoo_logo_twit_normal.jpg" href="http://a1.twimg.com/profile_images/1178764754/yahoo_logo_twit_normal.jpg">http://a1.twimg.com/profile_images/1178764754/yahoo_logo_twit_normal.jpg</a></li>
</ul>
<li>Facebok / Display Name: Facebook
<ul>
<li>Application Id: …… (follow <a href="http://go.microsoft.com/fwlink/?LinkID=196518">this tutorial</a> to get one)
<li>Application secret: idem
<li>Application permissions: email (you can request more things from here <a title="http://developers.facebook.com/docs/authentication/permissions/" href="http://developers.facebook.com/docs/authentication/permissions/">http://developers.facebook.com/docs/authentication/permissions/</a>)
<li>Image Url: <a title="https://secure-media-sf2p.facebook.com/ads3/creative/pressroom/jpg/n_1234209334_facebook_logo.jpg" href="https://secure-media-sf2p.facebook.com/ads3/creative/pressroom/jpg/n_1234209334_facebook_logo.jpg">https://secure-media-sf2p.facebook.com/ads3/creative/pressroom/jpg/n_1234209334_facebook_logo.jpg</a></p>
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image171.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image17_thumb.png" width="644" height="288"></a>&nbsp;</li>
</ul>
</li>
</ul>
<li>The next thing is to register the web application you just created in ACS. To do this, go to <strong>Relying party applications</strong> and click <strong>Add</strong>.
<li>Enter the following information<br /><strong>Name</strong>: a display name for ACS<br /><strong>Realm</strong>: <a href="https://localhost/&lt;TheNameOfTheWebApp&gt;/">https://localhost/&lt;TheNameOfTheWebApp&gt;/</a> <br /><em>This is the logical identifier for the app. For this, we can use any valid URI (notice the I instead of L). Using the base url of your app is a good idea in case you want to have one configuration for each environment.</em><br />Return Url: <a href="https://localhost/&lt;TheNameOfTheWebApp&gt;/">https://localhost/&lt;TheNameOfTheWebApp&gt;/</a><br /><em>This is the url where the token will be posted to. Since there will be an http module listen for any HTTP POST request coming in with a token, you can use any valid url of the app. The root is a good choice and, don’t worry, then you can redirect the user back to the original url she was browsing (in case of bookmarking).</em></p>
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image21.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image21_thumb.png" width="644" height="396"></a><br /> 
<li>Leave the other fields with the default values and click Save. You will notice that Facebook, Google, LiveID and Yahoo are checked. This means that you want to enable those identity providers for this application. If you uncheck one of those, the widget won’t show it.<br /><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image25.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image25_thumb.png" width="644" height="388"></a><br /> 
<li>Finally, go to the Rule Groups and click on the rule group for your web application.<br /><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image29.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image29_thumb.png" width="644" height="356"></a><br /> 
<li>Since each identity provider will give us different information (claims about the user), we have to generate a set of rules to passthrough that information to our application. Otherwise by default that won’t happen. To do this, click on Generate, make sure all the identity providers are checked and save. You should see a screen like this</p>
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image33.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image33_thumb.png" width="578" height="484"></a><br />&nbsp;</li>
</ol>
<h2>Step 2. Configure your application with Windows Azure AppFabric Access Control Service</h2>
<ol>
<li>Now that we have configured ACS, we have to go to our application and configure it to use ACS. <br /> 
<li>Create a new ASP.NET MVC Application. Use the Internet Application template to get the master page, controllers, etc.<br /><strong>NOTE</strong>: I am using MVC3 with Razor but you can use any version.<br /> 
<li>Before moving forward, make sure you have <a href="http://www.google.com.ar/url?sa=t&amp;source=web&amp;cd=1&amp;ved=0CCMQFjAA&amp;url=http%3A%2F%2Fwww.microsoft.com%2Fdownloads%2Fdetails.aspx%3FFamilyID%3Dc148b2df-c7af-46bb-9162-2c9422208504&amp;ei=x6CgTa-iF83AtgeDmc2dAw&amp;usg=AFQjCNGi5gK8PJ2vTTdRqID3ljBoxJi9vg&amp;sig2=ZGDEfHOgYeu384M5QwsRJw">Windows Identity Foudnation SDK</a> installed in your machine. Once you have it, then right click the web application and click <strong>Add STS Reference…</strong>. In the first step you will have already the right values so click <strong>Next<br /></strong><strong><br /><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image10.png"><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image_thumb8.png" width="644" height="484"></a><br /></strong>
<li>In the next step, select <strong>Use an existing STS</strong>. Enter the url of your service namespace Federation Metadata. This URL has a pattern like this:<br /><a title="https://mywebapp.accesscontrol.appfabriclabs.com/FederationMetadata/2007-06/FederationMetadata.xml" href="https://&lt;YourServiceNamespace&gt;.accesscontrol.appfabriclabs.com/FederationMetadata/2007-06/FederationMetadata.xml">https://&lt;YourServiceNamespace&gt;.accesscontrol.appfabriclabs.com/FederationMetadata/2007-06/FederationMetadata.xml</a></p>
<p>&nbsp;<a href="http://blogs.southworks.net/mwoloski/files/2011/04/image11.png"><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image_thumb9.png" width="644" height="484"></a> <br /> 
<li>In the following steps go ahead and click <strong>Next</strong> until the wizard finishes. <br /> 
<li>The wizard will add a couple of http modules and a section on the web.config that will have the thumbprint of the certificate that ACS will use to sign tokens. This is the basis of the trust relationship between your app and ACS. If you change that number, it means the trust is broken.<br /> 
<li>The next thing you have to do is replace the default <strong>AccountController</strong> with one that works when the authentication is outsourced of the app. Download the <a href="https://gist.github.com/911826#file_account_controller.cs">AccountController.cs</a>, change the namespace to yours and replace it. Among other things, this controller will have an action called IdentityProviders that will return from ACS the list of identity providers in JSON format.</p>
<pre class="brush: csharp;">public ActionResult IdentityProviders(string serviceNamespace, string appId)
{
    string idpsJsonEndpoint = string.Format(IdentityProviderJsonEndpoint, serviceNamespace, appId);
    var client = new WebClient();
    var data = client.DownloadData(idpsJsonEndpoint);

    return Content(Encoding.UTF8.GetString(data), "application/json");
}
</pre>
</li>
</ol>
<h2>Step 3. Using jQuery Dialog for the login box</h2>
<ol>
<li>In this last step we will use the jQuery UI dialog plugin to show the list of identity providers when clicking the LogOn link. Open the LogOnPartial cshtml file
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image12.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image_thumb10.png" width="278" height="327"></a></p>
<li>Replace the LogOnPartial markup with the following (or copy from <a href="https://gist.github.com/911826#file__log_on_partial.cshtml">here</a>). <strong>IMPORTANT</strong>: change the service namespace and appId in the ajax call to use your settings.
<pre class="brush: js;">@if(Request.IsAuthenticated) {
    &lt;text&gt;Welcome &lt;b&gt;@Context.User.Identity.Name&lt;/b&gt;!
    [ @Html.ActionLink("Log Off", "LogOff", "Account") ]&lt;/text&gt;
}
else {
    &lt;a href="#" id="logon"&gt;Log On&lt;/a&gt;
    &lt;div id="popup_logon"&gt;
    &lt;/div&gt;
    &lt;style type="text/css"&gt;
    #popup_logon ul
    {
        list-style: none;
    }
    #popup_logon ul li
    {
         margin: 10px;
         padding: 10px
    }
    &lt;/style&gt;
    &lt;script type="text/javascript"&gt;
    $("#logon").click(function() {
        $("#popup_logon").html("&lt;p&gt;Loading...&lt;/p&gt;");
        $("#popup_logon").dialog({ modal: true, draggable: false, resizable: false, title: 'Select your preferred login method' });
        $.ajax({
            url : '@Html.Raw(Url.Action("IdentityProviders", "Account", new { serviceNamespace = "YourServiceNamespace", appId = "https://localhost/&lt;YourWebApp&gt;/" }))',
            success : function(data){
                dialogHtml = '&lt;ul&gt;';
                for (i=0; i&lt;data.length; i++)
                {
                    dialogHtml += '&lt;li&gt;';
                    if (data[i].ImageUrl == '')
                    {
                        dialogHtml += '&lt;a href="' + data[i].LoginUrl + '"&gt;' + data[i].Name + '&lt;/a&gt;';
                    } else
                    {
                        dialogHtml += '&lt;a href="' + data[i].LoginUrl + '"&gt;&lt;img style="border: 0px; width: 100px" src="' + data[i].ImageUrl + '" alt="' + data[i].Name + '" /&gt;&lt;/a&gt;';
                    }

                    dialogHtml += '&lt;/li&gt;';
                }

                dialogHtml += '&lt;/ul&gt;';

                $("#popup_logon").html(dialogHtml);
            }
        })
     });

    &lt;/script&gt;

}</pre>
<li>Include jQuery UI and the corresponding css in the Master page (Layout.cshtml)
<pre class="brush: xml;">&lt;link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /&gt;
&lt;link href="@Url.Content("~/Content/themes/base/jquery-ui.css")" rel="stylesheet" type="text/css" /&gt;
&lt;script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="@Url.Content("~/Scripts/jquery-ui.min.js")" type="text/javascript"&gt;&lt;/script&gt;
</pre>
</li>
</ol>
<h2>Step 4. Try it!</h2>
<ol>
<li>That’s it. Start the application and click on the Log On link. Select one of the login methods and you will get redirected to the right page. You will have to login and the provider may ask you to grant permissions to access certain information from your profile. If you click yes you will be logged in and ACS will send you a set of claims like the screen below shows.
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image13.png"><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image_thumb11.png" width="827" height="693"></a></p>
<table style="color: #000000" border="0" cellspacing="0" cellpadding="2" width="922">
<tbody>
<tr>
<td valign="top" width="506"><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image15.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image_thumb13.png" width="328" height="250"></a></td>
<td valign="top" width="414"><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image16.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image_thumb14.png" width="328" height="254"></a></td>
</tr>
<tr>
<td valign="top" width="506"><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image17.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image_thumb15.png" width="328" height="254"></a></td>
<td valign="top" width="416"><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image18.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image_thumb16.png" width="328" height="254"></a></td>
</tr>
</tbody>
</table>
<p><a href="http://blogs.southworks.net/mwoloski/files/2011/04/image14.png"><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blogs.southworks.net/mwoloski/files/2011/04/image_thumb12.png" width="801" height="619"></a></li>
</ol>
<p>I added this line in the HomeController to show all the claims:</p>
<pre class="brush: csharp;">ViewBag.Message = string.Join("&lt;br/&gt;", ((IClaimsIdentity)this.User.Identity).Claims.Select(c =&gt; c.ClaimType + ": " + c.Value).ToArray());
</pre>
<p>Well, it wasn’t 3 steps, but you get the point <img style="border-bottom-style: none;border-left-style: none;border-top-style: none;border-right-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Winking smile" src="http://blogs.southworks.net/mwoloski/files/2011/04/wlEmoticon-winkingsmile.png">. Now, it would be really cool to create a NuGet that will do all this automatically&#8230; </p>
<p>Just for future reference, these are the claims that each identity provider will return by default</p>
<p><strong>Facebook</strong></p>
<p>http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier: 619815976<br />http://schemas.microsoft.com/ws/2008/06/identity/claims/expiration: 2011-04-09T21:00:01.0471518Z<br />http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress: <a href="mailto:yourfacebookemail@boo.com">yourfacebookemail@boo.com</a><br />http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name: Matias Woloski<br />http://www.facebook.com/claims/AccessToken: 111617558888963|2.k &lt;stripped&gt; 976|z_fmV&lt;stripped&gt;3kQuo<br />http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider: Facebook-&lt;appid&gt; </p>
<p><strong>Google</strong> </p>
<p>http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier: <a href="https://www.google.com/accounts/o8/id?id=AIt&lt;stripped&gt;UoU">https://www.google.com/accounts/o8/id?id=AIt&lt;stripped&gt;UoU</a><br />http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress: <a href="mailto:yourgooglemail@gmail.com">yourgooglemail@gmail.com</a><br />http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name: Matias Woloski<br />http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider: Google </p>
<p><strong>LiveID</strong></p>
<p>http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier: WJoV5kxtlzEbsu&lt;stripped&gt;mMxiMLQ=<br />http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider: uri:WindowsLiveID </p>
<p><strong>Yahoo</strong> </p>
<p>http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier: <a href="https://me.yahoo.com/a/VH6mn5oV&lt;stripped&gt;58mGa#e7b0c">https://me.yahoo.com/a/VH6mn5oV&lt;stripped&gt;58mGa#e7b0c</a><br />http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress: <a href="mailto:youryahoomail@yahoo.com">youryahoomail@yahoo.com</a><br />http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name: Matias Woloski<br />http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider: Yahoo! </p>
<h2>Following up</h2>
<p>Get the code used in this post from <a href="https://gist.github.com/911826">here</a>.</p>
<p>If you are interested in other features of ACS, these are some of the things you can do:</p>
<ul>
<li>Read <a href="http://blogs.msdn.com/b/vbertocci/archive/2011/04/11/the-new-acs-ships.aspx">Vittorio’s post</a> announcing ACS and pointing to lot of deliverables coming out today. This has been hard work from <a href="http://twitter.com/nbeni">@nbeni</a>, <a href="http://twitter.com/sebasiaco">@sebasiaco</a>, <a href="http://twitter.com/litodam">@litodam</a> and more <em>southies</em>.
<li>Go through the ACSv2 labs in the <a href="http://go.microsoft.com/fwlink/?LinkId=148795">Identity Training Kit</a>
<li>Follow <a href="http://blogs.msdn.com/b/vbertocci/">Vittorio’s blog</a>, <a href="http://blogs.msdn.com/b/eugeniop/">Eugenio’s blog</a>, <a href="http://blogs.msdn.com/b/justinjsmith/">Justin’s blog</a> and the <a href="http://blogs.msdn.com/b/windowsazureappfabric/">AppFabric team blog</a>
<li>Read articles like <a href="http://msdn.microsoft.com/en-us/magazine/gg490345.aspx">this</a>
<li>I am collaborating with patterns &amp; practices writing the second part of the Guide to Claims Based Identity and Access Control, including ACS and explaining the scenarios it enable. Stay tune at <a href="http://claimsid.codeplex.com">claimsid.codeplex.com</a> for fresh content.</li>
</ul>
<p>DISCLAIMER: use this at your own risk, this code is provided as-is. </p>
<img src="http://feeds.feedburner.com/~r/mwoloski/~4/XOVP2FiL0BM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss />
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blogs.southworks.net/mwoloski/2011/04/12/adding-internet-identity-providers-like-facebook-google-liveid-and-yahoo-to-your-mvc-web-application-using-windows-azure-appfabric-access-control-service-and-jquery-in-3-steps/</feedburner:origLink></item>
	</channel>
</rss>

