<?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>Vibro.NET</title><link>http://blogs.msdn.com/b/vbertocci/</link><description>Scatter thoughts</description><dc:language>en-US</dc:language><generator>Telligent Community 5.6.583.19431 (Build: 5.6.583.19431)</generator><item><title>Brand New ACS Walkthrough on the New Windows Azure Developer Center</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/12/12/brand-new-acs-walkthrough-on-the-new-windows-azure-developer-center.aspx</link><pubDate>Mon, 12 Dec 2011 18:48:25 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10246860</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10246860</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/12/12/brand-new-acs-walkthrough-on-the-new-windows-azure-developer-center.aspx#comments</comments><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8764.image_5F00_47E0E6EB.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5125.image_5F00_thumb_5F00_20A69DB6.png" width="265" height="262" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;By now, I am sure, you already heard about the &lt;a href="http://blogs.msdn.com/b/windowsazure/archive/2011/12/12/improved-developer-experience-interoperability-and-scalability-on-windows-azure.aspx"&gt;flurry of improvements&lt;/a&gt; that swept the Azure Land. If you didn’t, please take a moment to go through Bob’s post &lt;a href="http://blogs.msdn.com/b/windowsazure/archive/2011/12/12/improved-developer-experience-interoperability-and-scalability-on-windows-azure.aspx"&gt;here&lt;/a&gt;: socks will be blown, the Windows Azure team did an *amazing* job. &lt;/p&gt;  &lt;p&gt;If you explore the new developer center you’ll eventually land on a &lt;a href="http://bit.ly/t7tHch"&gt;brand new howto guide&lt;/a&gt; which provides a concise introduction to ACS. If you are new to this space and want to get a feeling of what ACS can do, I am sure you’ll find the new guide useful. If you already know about ACS, you now have a &lt;a href="http://bit.ly/t7tHch"&gt;nice, self-contained guide&lt;/a&gt; you can use with the ones in your team who need to ramp up.&lt;/p&gt;  &lt;p&gt;Have fun, and don’t forget to tune in for tomorrow’s &lt;a href="http://learnwindowsazureevent.com/"&gt;Learn Windows Azure&lt;/a&gt; online event! I might even have a brief cameo &lt;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.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1423.wlEmoticon_2D00_winkingsmile_5F00_6070843B.png" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10246860" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Azure/">Windows Azure</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Access+Control+Service/">Access Control Service</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ACS/">ACS</category></item><item><title>Identity Is Your Passion? We Are Hiring!</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/11/02/identity-is-your-passion-we-are-hiring.aspx</link><pubDate>Wed, 02 Nov 2011 07:53:22 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10232368</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10232368</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/11/02/identity-is-your-passion-we-are-hiring.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5635.IdentityGateway_5F00_2C7F46EC.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IdentityGateway" border="0" alt="IdentityGateway" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7360.IdentityGateway_5F00_thumb_5F00_0B1FA150.png" width="431" height="208" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;We have a number of open positions for developers and testers in the identity team. We are building something pretty awesome, which of course I can’t (yet) talk about, but if you are a regular reader of this blog I can tell you this: you *will* want to be part of it &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5226.wlEmoticon_2D00_smile_5F00_7F89E410.png" /&gt;&lt;/p&gt;  &lt;p&gt;You can take a look at the details of the various positions &lt;a href="http://bit.ly/t8BVNS"&gt;here&lt;/a&gt;: but in general I can tell you that we seek talented C, C++ and C# developers who like to ship software. If you have experience with distributed services that would definitely help; experience with Windows Azure would be a *really*nice boost.    &lt;br /&gt;The list of positions covers a pretty broad seniority spectrum, hence chances are there is a spot that matches with your current career level.&lt;/p&gt;  &lt;p&gt;Ah, and just in case the idea of working with yours truly and the (waaaay more) talented people here is not enough:&lt;/p&gt;  &lt;p align="center"&gt;&amp;#160;&lt;strong&gt;Microsoft has just been named the &lt;/strong&gt;&lt;a href="http://www.greatplacetowork.com/best-companies/worlds-best-multinationals/list-of-the-25-best-from-2011"&gt;&lt;strong&gt;Best Place in the World to Work&lt;/strong&gt;&lt;/a&gt;. &lt;/p&gt;  &lt;p align="left"&gt;‘nuff said, folks.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt; If you are interested, feel free to &lt;/u&gt;&lt;/strong&gt;&lt;a href="http://bit.ly/n7VJ3c"&gt;&lt;strong&gt;&lt;u&gt;contact me&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;u&gt;: I am glad to chat about this.&lt;/u&gt;&lt;/strong&gt; Looking forward to work with you! &lt;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.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6886.wlEmoticon_2D00_winkingsmile_5F00_5F6ED753.png" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10232368" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Identity/">Identity</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Azure/">Windows Azure</category></item><item><title>BlobShare Sample: ACS-Protected File Sharing</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/10/31/blobshare-sample-acs-protected-file-sharing.aspx</link><pubDate>Mon, 31 Oct 2011 08:54:38 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10231561</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10231561</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/10/31/blobshare-sample-acs-protected-file-sharing.aspx#comments</comments><description>&lt;p align="left"&gt;Weather is not that good this Sunday afternoon, and the wife warned me already yesterday that today she was going to catch up with the &lt;a href="https://www.ai-class.com/"&gt;AI class&lt;/a&gt;; hence, I think I am going to break the blog-silence and spend some time describing &lt;a href="http://blobshare.codeplex.com/"&gt;BlobShare&lt;/a&gt;, a little jewel my DPE friends quietly released last week (and covered during &lt;a href="http://channel9.msdn.com/Shows/Cloud+Cover/Episode-63-Securely-Sharing-Files-with-Windows-Azure"&gt;the latest CloudCover episode&lt;/a&gt;, no pun intended).&lt;/p&gt;  &lt;p align="left"&gt;BlobShare is a very nice Windows Azure sample, which demonstrates one way of solving a very concrete problem: how to share large files on the public internet, while maintaining full control over who can access what?   &lt;br /&gt;The usual disclaimers about a sample being a sample apply here, however you’ll be happy to know that DPE has been using an instance of BlobShare for sharing content for many months by now, it started while I was still over there. Many features in BlobShare derive from real usage requirements that emerged while actually using the application. I am &lt;strong&gt;&lt;em&gt;so&lt;/em&gt;&lt;/strong&gt; glad to see they finally managed to release it in a consumable form. Good job &lt;a href="http://www.wadewegner.com/"&gt;Wade’s&lt;/a&gt; gang!&lt;/p&gt;  &lt;p align="left"&gt;Many of the things demonstrated in BlobShare have been featured in other samples: exhibit A, the email invitation system (seen in &lt;a href="http://www.fabrikamshipping.com/"&gt;FabrikamShipping&lt;/a&gt;, the &lt;a href="http://waacceleratorumbraco.codeplex.com/"&gt;Umbraco ACS accelerator&lt;/a&gt;, etc). However it was always buried within many more moving parts, whereas here it is pretty easy to isolate. I am sure you’ll find it much easier to grok.    &lt;br /&gt;The same holds for various other aspects I am often asked about, like how to integrate an incoming IClaimsIdentity with attributes from a store which is local to the application: BlobShare does it to enable one of its key capabilities, enforcing locally stored permissions, hence the signal/noise ratio should be blindingly good.&lt;/p&gt;  &lt;p&gt;Do watch &lt;a href="http://channel9.msdn.com/Shows/Cloud+Cover/Episode-63-Securely-Sharing-Files-with-Windows-Azure"&gt;the latest CloudCover episode&lt;/a&gt;, where Wade &amp;amp; Steve properly introduce the &lt;a href="http://blobshare.codeplex.com/"&gt;project&lt;/a&gt;, talk about setup, etc etc: here I am (surprise surprise) mostly focusing on the identity &amp;amp; access aspects.&lt;/p&gt;  &lt;h1&gt;Overview&lt;/h1&gt;  &lt;p&gt;In a nutshell: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;BlobShare is an MVC app which sits in front of your blob storage account&lt;/li&gt;    &lt;li&gt;The MVC app leverages ACS for admitting users with accounts from any of the identity providers it can trust…&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;…but it maintains an application-local (SQL Azure) database of user profiles and roles.&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;local user info and roles are used to establish if a given user has access to the blob he/she is requesting&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;Basically, all your blobs live in a &lt;strong&gt;trusted subsystem&lt;/strong&gt;: only BlobShare can access blobs directly. BlobShare offers individual URLs for every blob, of course, but they are all rooted in the BlobShare app itself. As you try to get to one blob, BlobShare will funnel you through the authentication process and if it turns out you don’t have permissions for that specific blob, you don’t get access.     &lt;br /&gt;That’s pretty handy when you are sharing stuff you want to keep a close eye on: with a shared signature if the URL leaks you’re done, here not only you force authentication, you can even keep a useful audit trail and notice if there’s something fishy going on (if the same user accesses the same content in a small time interval and from many different machines, chances are you have somebody who’s sharing his account).&lt;/p&gt;  &lt;p&gt;BlobShare offers a full UI for all the tasks that the flows introduced above entail. Administrators can upload blobs, group multiple blobs in larger sets, create users by sending them an invitation email, assign roles to users, permissions to roles and individual users, and examine a complete audit trail of all the users’ activities. Users can sign up (by responding to an invitation) and access the blobs for which they received permissions for, for as long as those permissions have been deemed valid. &lt;/p&gt;  &lt;p&gt;Justo give you a feeling of the kind of things BlobShare keeps track of, below you can find the diagram of its SQL Azure database.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2100.image_5F00_529EA05E.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1614.image_5F00_thumb_5F00_469CB02A.png" width="626" height="390" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As you might notice, all the access control policy is kept in the database. Here ACS is being used to take care of authenticating with all the various trusted IPs: BlobShare’s setup will add the usual IPs, add the BlobShare instance as an RP, and create pass-through rules for all. BlobShare expects ACS to return a normalized token containing just the NameIdentifier and the IdentityProvider claims (take note if you later add custom providers). Those two claims are used to uniquely identify each user in the BlobShare database. There is no concept of pure, un-provisioned federated user here: if the incoming NameIdentifier-IdentityProvider tuple is not present in the db (and associated to the permissions of the blob being requested) the access is denied.&lt;/p&gt;  &lt;p&gt;From the access control point of view, there are three (actually, four) different types of requests that are interesting to examine:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Bootstrap&lt;/strong&gt;, or &lt;strong&gt;Imprinting&lt;/strong&gt;. The very first time a newly deployed BlobShare instance runs, it will onboard its first Administrator&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;User redeeming an invitation&lt;/strong&gt;. One new user received an invitation and is now going through the sign up flow&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;User accessing a BlobShare URL that points to a blob&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;User signing in&lt;/strong&gt;. Very similar to the above, sans interesting authorization tidbits&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Instead of discussing those in abstract, we will explore those paths while walking through some typical application use. In a minute.&lt;/p&gt;  &lt;p&gt;As you know I have this unhealthy passion for putting together pictures which show as many things at the same time as I can fit in the allotted real estate. That’s great when you already understand the matter, I find it helps me to understand relationships and an architecture as a whole; but while you are learning it might not offer the most gentle slope for ramping up.   &lt;br /&gt;Well, below you can find one such diagram: it lists the relevant moving parts in BlobShare that come into play when a request carrying a token shows up.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1220.image_5F00_26157078.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0045.image_5F00_thumb_5F00_25A93D83.png" width="600" height="445" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Please ignore the details of the flows for now, you can come back to this figure every time we’ll delve in the details of those. The thing I’d like you to observe at this time is how the solution is layered in various elements, each taking care of a specific access control task:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;WIF sits in front of the application&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;The first layer implements the classic mechanisms of federated authentication: forward the user to the identity provider (or to a broker like ACS, in this case) according to the protocol of choice, verify that incoming tokens are well-formed/have not been tampered with/are not expired/come from the expected authority and so on&lt;/li&gt;      &lt;li&gt;The next layer is a ClaimsAuthenticationManager implementation. In BlobShare this an especially important stage, as so much information that is relevant to the incoming user’s identity resides in the RP’s database and needs to be reconciled before the call can go any further. Moreover, which information is relevant changes dramatically between call types (more below)&lt;/li&gt;      &lt;li&gt;The last layer before giving control to the application is an implementation of a ClaimsAuthorizationManager. This is a cornerstone in BlobShare, as it represents the enforcement stage for the policies defined through the application flow&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;The application itself will use the incoming claims to customize what is shown (i.e. every user will see only the blobs he/she has access to) and for auditing purposes&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;IN the rest of the post I’ll go through BlobShare doing some basic tasks. As the elements and the different requests types come into play I’ll add commentary &amp;amp; take the chance to dig deeper in some of those concepts.   &lt;br /&gt;As I mentioned earlier, those tasks correspond to questions I get very often, hence I suspect that some of you guys will really like some of this stuff &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1526.wlEmoticon_2D00_smile_5F00_253D0A8E.png" /&gt; &lt;/p&gt;  &lt;h1&gt;Imprinting&lt;/h1&gt;  &lt;p&gt;Handling the administrator of those sites that use federated identity is always an interesting challenge. How to ensure that once you deployed your site, the administrator can log in and start working right away?&lt;/p&gt;  &lt;p&gt; Adding a username/password is kind of bad form. Every user can reuse existing social accounts, why should the admin be left out? On the other hand, if you want to authenticate the admin with a social account you have the following problems:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;at design time you might not know the values (like the nameidentifier) that will be in the authentication token the admin will send. Without those values how can you tell if the incoming user is really the intended admin?&lt;/li&gt;    &lt;li&gt;you might not even know which identity provider the admin will want to use: live id? Google? who knows.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Sure, one could use also with the admin the classic email invitation flow: after all, we are using it for other users right? Unfortunately it might not be a good idea to take a dependency on a setting that the admin itself might be required to provide (in BlobShare the SMTP server is already set up, but it’s just coincidence: I think that the original plan was to make it configurable on first run).&lt;/p&gt;  &lt;p&gt;At the time we toyed with the idea of just making admin the first user who logs in in the newly deployed instance: I like to call this &lt;a href="http://en.wikipedia.org/wiki/Imprinting_(psychology)"&gt;imprinting&lt;/a&gt;, isn’t this a bit like &lt;a href="http://en.wikipedia.org/wiki/Konrad_Lorenz"&gt;Konrad Lorentz’s&lt;/a&gt; ducks? &lt;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.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3276.wlEmoticon_2D00_winkingsmile_5F00_44EBE456.png" /&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;However, even if the probability that a random dude beats you to your deployment, it was still a possibility: hence we devised a schema for which at deployment time you establish a secret, and you are required to provide that secret on first run to associate your social account to the administrator user of that BlobShare’s instance. &lt;/p&gt;  &lt;p&gt;Easier to show that to describe! Hit F5 on your local instance, you’ll be brought straight to the page below.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1220.image_5F00_3DCCA7DE.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7484.image_5F00_thumb_5F00_044997E7.png" width="630" height="437" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;At the time this page was called sign up: I am not sure why the guys decided to change it, but it works nonetheless. Just sign in using whatever account you prefer.&lt;/p&gt;  &lt;p&gt;You’ll go through the usual dance with your IP and ACS, then land on the page below.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0636.image_5F00_35D5057C.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4747.image_5F00_thumb_5F00_2E49960F.png" width="632" height="444" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Add the email you want to use, provide the secret and…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4353.image_5F00_699CFBCD.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0640.image_5F00_thumb_5F00_022C991E.png" width="630" height="349" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;…the duckling will think you are Momma, and from now on you’ll have admin access to BlobShare.&lt;/p&gt;  &lt;p&gt;How did this happen? Didn’t I say above that one user needs to be in the database in order to have access? Yes I did, but AccountAssociationClaimsAuthenticatonManager makes an exception for the case in which the database has exactly zero users. It even creates a new user for the occasion!&amp;#160; The secret verification takes place in the associated controller (point (A ) in the uber-diagram).&lt;/p&gt;  &lt;h1&gt;Uploading Files&lt;/h1&gt;  &lt;p&gt;Now that we are admin, we can start to play. Let’s sign in.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4331.image_5F00_1ABC366E.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1207.image_5F00_thumb_5F00_21030CFC.png" width="631" height="436" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;..and we’re in (BTW: wow, this sample looks great. The designers did an excellent job).   &lt;br /&gt;You might not see anything out of the ordinary, but that’s mostly because you didn’t see that I used Live ID for signing in. Live ID does not give any claims besides the nameidentifier, whereas in the screenshot below BlobShare is clearly greeting me with something else (my email).&lt;/p&gt;  &lt;p&gt;That’s because AccountAssociationClaimsAuthenticatonManager graciously recognized me as an existing user of BlobShare, hence retrieved my extra attributes (Name and email, which in this case are both set to the email value) and used them to augment the claims already in the existing ClaimsPrincipal.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0121.image_5F00_6060C08C.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7558.image_5F00_thumb_5F00_189F37A5.png" width="632" height="440" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Let’s go under Blobs.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2703.image_5F00_50DDAEBD.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6318.image_5F00_thumb_5F00_3DBC8211.png" width="621" height="343" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Hmm, it’s pretty barren here. Let’s click on Upload, then Single File Upload.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4353.image_5F00_0439721A.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1207.image_5F00_thumb_5F00_1CC90F6A.png" width="621" height="418" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Let’s add a picture I am sure I own the rights for, and jolt down some comments just for color.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7870.image_5F00_3558ACBA.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1614.image_5F00_thumb_5F00_42BEBFC0.png" width="622" height="419" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;…and here there’s our first blob. &lt;/p&gt;          &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4857.image_5F00_2237800E.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3757.image_5F00_thumb_5F00_33A7E0E6.png" width="623" height="420" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Let’s hit on Permissions.&lt;/p&gt;  &lt;h1&gt;Handling Access Rights and Users&lt;/h1&gt;  &lt;p&gt;Here I can grant access to this blob for users or roles, but I have none for now (apart from myself and the admin role, who already does have access).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7558.image_5F00_0C0164BC.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3264.image_5F00_thumb_5F00_6B7A2509.png" width="622" height="419" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Let’s add a new role, then. Click on Roles on the top bar.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8561.image_5F00_63EEB59C.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3348.image_5F00_thumb_5F00_638282A7.png" width="621" height="418" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Click new, and you get to the simplest role creation form you’ve seen to date. Once you’re done hit Update.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1526.image_5F00_63164FB2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8561.image_5F00_thumb_5F00_3E84C22E.png" width="620" height="418" /&gt;&lt;/a&gt;&lt;/p&gt;          &lt;p&gt;Excellent, we have a role now; but no user to assign this to. Let’s go to Users by clicking the associated entry in the top bar.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5415.image_5F00_57145F7E.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0121.image_5F00_thumb_5F00_368D1FCC.png" width="620" height="417" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h1&gt;Inviting Users&lt;/h1&gt;  &lt;p&gt;Here there’s the list of our users, currently including only myself. I could add many at once, but for the sake of demonstration I’ll create just one. Hit on Invite User.&lt;/p&gt;  &lt;p&gt;(note: all those controllers, which require administrative privileges, are decorated by a custom AuthorizeAttribute which enforces things accordingly).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7065.image_5F00_212F6A64.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2671.image_5F00_thumb_5F00_67AC5A6C.png" width="620" height="418" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The matter is pretty simple: you specify an email address to send the invite to, and you decide which roles the new guy will belong to. Hit Create and you’re done for now.&lt;/p&gt;          &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1682.image_5F00_2E294A75.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1602.image_5F00_thumb_5F00_5FB4B80A.png" width="617" height="413" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The user has been created in BlobShare’s database, and an email with the invitation has been sent; however until Adam has not accepted, we don’t know which nameidentifier should be associated to this profile (nor from which identity provider we should expect Adam to come from).&lt;/p&gt;  &lt;p&gt;What happened is that BlobShare created a unique ID associated to this profile. That ID will be embedded in one registration URL that Adam will receive in the invitation; whomever will present a token through that URL will become Adam as far as BlobShare is concerned.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4341.image_5F00_3F2D7858.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1205.image_5F00_thumb_5F00_5E03EC36.png" width="615" height="413" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h1&gt;Accepting an Invitation&lt;/h1&gt;  &lt;p&gt;Let’s take a look at things from Adam’s perspective.&lt;/p&gt;  &lt;p&gt;Adam receives the invitation mail below. The mail contains the mentioned invitation URL; nobody but Adam (or better, whomever has access to the mailbox specified at invitation time) know this URL, which is a pretty good way to be reassured that we are inviting the right person. Let’s click on the URL.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1207.image_5F00_39725EB2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8547.image_5F00_thumb_5F00_317ABC50.png" width="616" height="395" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Here we once again encounter the sign-in page (again, at the time it was supposed to say sign-up and some helpful text, but that’s a technicality). Adam can use whatever account from the listed providers: that account will become Adam for BlobShare. Once again, take a look at AccountAssociationClaimsAuthenticationManager&amp;#160; to see how the reconciliation happens.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3264.image_5F00_2FC9F07C.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8547.image_5F00_thumb_5F00_1661ED42.png" width="612" height="283" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Once the profile-token reconciliation took place, you can even update some values (like the name that was originally specified when creating the invitation).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0624.image_5F00_3610C70A.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8055.image_5F00_thumb_5F00_009804E5.png" width="608" height="321" /&gt;&lt;/a&gt;&lt;/p&gt;      &lt;p&gt;Once signed in (again) and gone to Blob, Adam will find that there are still no blobs he can see. Let’s leave Adam for a moment and go back to the administrator’s experience.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3755.image_5F00_0DFE17EB.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6813.image_5F00_thumb_5F00_0672A87E.png" width="607" height="328" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h1&gt;Assigning Roles &amp;amp; Permissions&lt;/h1&gt;  &lt;p&gt;If you refresh Adam’s page, you’ll see that the user is now active and the attributes all have the correct values.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0118.image_5F00_65EB68CB.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1033.image_5F00_thumb_5F00_53366F14.png" width="606" height="502" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Now that our Colleagues role is non-empty, we can get back there and assign some permissions.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5315.image_5F00_129422A5.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5482.image_5F00_thumb_5F00_441F903A.png" width="606" height="379" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;And here it is: the Colleagues role has been granted Read access to our only blob. Note that I could have granted access directly to Adam instead of the group he belongs to; or that I could have put my blob in a blob set and handled access to the set rather than the individual blob. BlobShare is VERY flexible.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6888.image_5F00_5185A340.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1207.image_5F00_thumb_5F00_3508B160.png" width="606" height="400" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;It is worth stressing that all those changes are happening in the SQL Azure database, not in ACS: no new rules are being written. In BlobShare all settings are at the RP side.&lt;/p&gt;  &lt;h1&gt;Accessing a File&lt;/h1&gt;  &lt;p&gt;Let’s get back to Adam. If Adam hits F5, the browser will refresh &amp;amp; show the newly granted blob.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1108.image_5F00_50410A61.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8561.image_5F00_thumb_5F00_61B16B39.png" width="607" height="304" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Adam can hit both the name of the file in the blob (Phoenix in the sample) or Download. Access-wise there is no difference, this only impacts how the file will be served. Clicking on the file will show it in the browser, as you can see below (yes, that was a LONG meeting).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4341.image_5F00_561BADFA.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0131.image_5F00_thumb_5F00_4DB7D8A3.png" width="606" height="606" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now, until now I omitted to mention the BlobAuthorizationManager. The reason is that the guy steps out of the way every time the request is going to a controller other than MyBlobs. If it is MyBlobs, as it is the case now, it queries the db (via a service) to ensure that the user has the rights to access the blob he is requesting. Check out the code, it’s very nicely readable.&lt;/p&gt;  &lt;h1&gt;Reports&lt;/h1&gt;  &lt;p&gt;Let’s get back to the administrator for one more thing. If you click on Reports, you’ll land on the page below.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3362.image_5F00_4554034C.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7450.image_5F00_thumb_5F00_44E7D057.png" width="606" height="307" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Let’s click on User Activity; we’ll see all the things we’ve been doing until now with BlobShare, which is quite handy. If you look at the code, you’ll see that the current ClaimsIdentity is used across the board for retrieving the user info in a nice, consistent way, regardless of whether they come from the identity provider or they have been extracted from the RP database.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5482.image_5F00_7268F01A.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5305.image_5F00_thumb_5F00_1C68EE43.png" width="608" height="734" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h1&gt;Summary&lt;/h1&gt;                  &lt;p&gt;Well, the afternoon kind of stretched well into the evening &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1526.wlEmoticon_2D00_smile_5F00_253D0A8E.png" /&gt; but BlobShare is a great sample, and I think it deserves all the coverage it can get. &lt;/p&gt;  &lt;p&gt;If you are into WIF, this is a great sample that demonstrates how to take advantage of the main extensibility points. Do play with the code, and if you have questions or feedback I am sure that the Wade gang will be delighted to hear you out. If you want to chat about the identity side of things, I am happy to chat as well but I can’t take feature requests, that’s Wade’s jurisdiction &lt;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.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3276.wlEmoticon_2D00_winkingsmile_5F00_44EBE456.png" /&gt;&lt;/p&gt;  &lt;p&gt;Happy &lt;a href="http://blobshare.codeplex.com/"&gt;BlobSharing&lt;/a&gt;!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10231561" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Identity+Foundation/">Windows Identity Foundation</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/WIF/">WIF</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Azure/">Windows Azure</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Access+Control+Service/">Access Control Service</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ACS/">ACS</category></item><item><title>TechEd 2011微软中国技术大会：下周与您相约</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/10/06/teched-2011.aspx</link><pubDate>Fri, 07 Oct 2011 02:43:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10221412</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10221412</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/10/06/teched-2011.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4370.image_5F00_3B55A897.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0763.image_5F00_thumb_5F00_4C59D67A.png" width="600" height="181" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;亲爱的中国读者，&lt;/p&gt;
&lt;p&gt;我很高兴地宣布今年我也将会出席在北京的&lt;a href="http://bit.ly/oVPsug"&gt;TechEd&lt;/a&gt;技术会议！&lt;/p&gt;
&lt;p&gt;我将会在10月13日星期四演讲几个话题；其中的一个话题跟我在几周前的//Build会议上展示的比较相似，另外一个话题将会是基于&lt;b&gt;claims&lt;/b&gt;身份架构的深入浅出。&lt;/p&gt;
&lt;p&gt;不过我来北京最重要的原因其实是见到你们！我想向你们学习一切有关如何处理你们应用程序身份的问题，这样我才能够把你们的要求带回雷蒙德。我将会有空出席于&lt;a href="http://bit.ly/oVPsug"&gt;TechEd&lt;/a&gt; 会场星期三（12日）以及星期五（14日）的会议，如果您感兴趣，请跟我联系吧。&lt;/p&gt;
&lt;p&gt;谢谢！期待下周与您相约！&lt;/p&gt;
&lt;p&gt;维托里奥&lt;/p&gt;
&lt;p&gt;附言：十分感谢我的好朋友兼同事 王超 帮我翻译这篇博客。&lt;img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6840.wlEmoticon_2D00_smile_5F00_1989D006.png" /&gt;&lt;/p&gt;
&lt;p&gt;P.P.S.: last year&amp;rsquo;s keynote recording:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://technet.microsoft.com/zh-cn/teched2011_video"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7103.image_5F00_126A938E.png" width="292" height="248" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10221412" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Identity/">Identity</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Events/">Events</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/TechEd/">TechEd</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ACS/">ACS</category></item><item><title>Using ACS in Metro Style Applications</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/09/14/using-acs-in-metro-style-applications.aspx</link><pubDate>Wed, 14 Sep 2011 18:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10209665</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10209665</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/09/14/using-acs-in-metro-style-applications.aspx#comments</comments><description>&lt;p&gt;I am sure that many of you, amazed by the fantastic news about the &lt;a href="http://msdn.microsoft.com/en-us/windows/apps/br229516/"&gt;Windows Developer Preview&lt;/a&gt; capabilities, wondered if it will be possible to take advantage of ACS even from Metro Style applications.&lt;/p&gt;
&lt;p&gt;The answer is &amp;ldquo;yes, absolutely&amp;rdquo;. &lt;img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4571.wlEmoticon_2D00_smile_5F00_6E76BD97.png" /&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve been working with the appropriate Windows engineering team to make sure we connect to ACS from Metro style applications by making proper use of the new Windows security features: today we are sharing with you some of the outcomes of that conversation.&lt;/p&gt;
&lt;p&gt;More precisely:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you are at &lt;a href="http://www.buildwindows.com/"&gt;//BUILD&lt;/a&gt;, or were &lt;a href="http://www.buildwindows.com/"&gt;watching the keynote in streaming&lt;/a&gt;, you just saw a Metro Style app taking advantage of ACS&lt;/li&gt;
&lt;li&gt;Today my formidable ex-colleagues in DPE are releasing the &lt;a href="http://watwindows8.codeplex.com/"&gt;Windows Azure Toolkit for Windows 8&lt;/a&gt; which, among other super-cool things, features an ACS sample which demonstrates the same flow shown in the keynote&lt;/li&gt;
&lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/BUILD/BUILD2011/SAC-858T"&gt;Tomorrow at 2:30pm&lt;/a&gt; I&amp;rsquo;ll dig deeper in the scenario here at //BUILD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Below I&amp;rsquo;ll add some details on the first two items. &lt;br /&gt;Please keep in mind at all times that, in line with what you heard these days, what we are sharing on this topic is a developer preview.&lt;/p&gt;
&lt;h3&gt;John Shewchuk&amp;rsquo;s Demo in Today&amp;rsquo;s //BUILD Keynote&lt;/h3&gt;
&lt;p&gt;If you weren&amp;rsquo;t following the keynote, or if you were spacing out right at the crucial moment, here there&amp;rsquo;s a brief summary of what John demonstrated today (minus the notification parts, I am focusing just on authentication here). The demo John showed is a version of the app I built with the help of the Windows guys: Wade made a great job in polishing it and inserting in a realistic scenario, turning the rough developer-oriented prototype in a nice looking demo. In &lt;a href="http://channel9.msdn.com/Events/BUILD/BUILD2011/SAC-858T"&gt;my session on Thursday&lt;/a&gt; you are going to see things in details. &lt;br /&gt;I don&amp;rsquo;t want to spoil the simplicity of the scenario by hitting you with the explanation of what&amp;rsquo;s going on behind the scenes; not yet. I&amp;rsquo;ll get to that in a moment.&lt;/p&gt;
&lt;p&gt;The application is a very simple travel management utility, with the typical look of the Metro Style app:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4186.clip_5F00_image0014_5F00_603844A7.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image001[4]" border="0" alt="clip_image001[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0842.clip_5F00_image0014_5F00_thumb_5F00_535DEE89.png" width="500" height="292" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you hit the login button, you&amp;rsquo;ll be prompted to sign in by choosing among four well-known identity providers.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2018.clip_5F00_image0024_5F00_0AC3FFB8.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image002[4]" border="0" alt="clip_image002[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3581.clip_5F00_image0024_5F00_thumb_5F00_1751ACD4.png" width="500" height="271" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s pick Facebook: the familiar Facebook authentication UI appears in what looks like a dialog.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3021.clip_5F00_image0034_5F00_5A4D7B41.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image003[4]" border="0" alt="clip_image003[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7536.clip_5F00_image0034_5F00_thumb_5F00_6DFA64D5.png" width="500" height="274" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Upon successful authentication the application lets you in and retrieves your data.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1856.clip_5F00_image0044_5F00_068A0226.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image004[4]" border="0" alt="clip_image004[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7711.clip_5F00_image0044_5F00_thumb_5F00_7DB9F9D9.png" width="500" height="260" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Simple, right? But there&amp;rsquo;s more.&lt;/p&gt;
&lt;p&gt;If the application ran on a trusted device, and you logged on the machine using Windows Live ID, you are in for a nice surprise. If you launch the travel application on &lt;i&gt;another&lt;/i&gt; trusted device, you won&amp;rsquo;t have to go through the authentication phase again; you will find that you are already logged in!&lt;/p&gt;
&lt;p&gt;Now that you saw how the user experience unfolds, let&amp;rsquo;s take a quick pick under the hood.&lt;/p&gt;
&lt;h4&gt;The App&lt;/h4&gt;
&lt;p&gt;The application is Metro style app based on HTML. All the code running on the client site is Javascript. And in Javascript tradition, it is extremely simple.&lt;/p&gt;
&lt;h4&gt;The Identity Providers&lt;/h4&gt;
&lt;p&gt;The list of identity providers displayed at sign in time is, surprise surprise, retrieved from ACS. As many of you loyal readers know by now, ACS offers the list of configured identity providers (and their sign-in URLs) in form of a JSON list. And how hard is it to retrieve a JSON list via Javascript? Thought so.&lt;/p&gt;
&lt;div style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;" id="codeSnippetWrapper"&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;" id="codeSnippet"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; SignIn() {&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt; {&lt;br /&gt;&lt;br /&gt;        Show(&lt;span style="color: #006080;"&gt;'signon-block'&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; request = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; XMLHttpRequest();&lt;br /&gt;        request.open(&lt;span style="color: #006080;"&gt;"GET"&lt;/span&gt;, IPSFeedURL(&lt;span style="color: #006080;"&gt;"https://xxxxxxxxxxx.accesscontrol.windows.net"&lt;/span&gt;), &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;);&lt;br /&gt;        request.send(&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; jsonString = request.responseText;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; jsonlist = ParseIPList(jsonString);&lt;br /&gt;&lt;br /&gt;        BindJsonToList(jsonlist);&lt;br /&gt;        &lt;span style="color: #008000;"&gt;// result&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    } &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (e) {&lt;br /&gt;        ShowDialog(e);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Web Authentication Experience in a Metro Style App&lt;/h4&gt;
&lt;p&gt;The dialog which displayed the Facebook authentication UI is part of a new Windows runtime feature. I don&amp;rsquo;t want to go too much in details, as I am sure that the Windows guys will talk at length about it and they are THE authoritative source of information about their feature. Here I&amp;rsquo;ll stick to the talking points they gave me: the WebAuthenticationBroker is a surface that developers can use to host authentication experiences for online services, just like the demo did for Facebook (and would have done for any other provider, had we picked a different one).&lt;/p&gt;
&lt;div style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;" id="codeSnippetWrapper"&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;" id="codeSnippet"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; ItemSelected(element) {&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt; {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; acsURL = ipList[element.detail.itemIndex].LoginUrl;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; startURI = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Windows.Foundation.Uri(acsURL);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; endURI = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Windows.Foundation.Uri(callbackURL);&lt;br /&gt;&lt;br /&gt;        Windows.Security.Authentication.Web.WebAuthenticationBroker.authenticateAsync(&lt;br /&gt;            Windows.Security.Authentication.Web.WebAuthenticationOptions.n,&lt;br /&gt;            startURI,&lt;br /&gt;            endURI).then(callbackACSAuth, callbackACSAuthError);&lt;br /&gt;&lt;br /&gt;    } &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (e) {&lt;br /&gt;        ShowDialog(e);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;h4&gt;Invoking a Service With OAuth&lt;/h4&gt;
&lt;p&gt;Upon successful authentication, the flow bounces from Facebook to ACS, where a slim, RESTful SWT token is minted. The token is returned from the broker to the application (more about how that happens in the section about the toolkit). The token is then used for securing an OAuth 2.0 call to a service on the travel app backend (on Windows Azure of course, but technically it could live anywhere). The operation in itself is absolutely trivial to implement in Javascript, it&amp;rsquo;s just a matter of putting the token in the authorization HTTP header according to the OAuth2.0 syntax.&lt;/p&gt;
&lt;div style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;" id="codeSnippetWrapper"&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;" id="codeSnippet"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; GetTravelerInfo(token, serviceUrl) {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt; {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; authHeader = &lt;span style="color: #006080;"&gt;"OAuth "&lt;/span&gt; + token;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; request = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; XMLHttpRequest();&lt;br /&gt;        request.open(&lt;span style="color: #006080;"&gt;"GET"&lt;/span&gt;, serviceUrl, &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;);&lt;br /&gt;        request.setRequestHeader(&lt;span style="color: #006080;"&gt;"Authorization"&lt;/span&gt;, authHeader);&lt;br /&gt;&lt;br /&gt;        request.send();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; request.responseText;&lt;br /&gt;&lt;br /&gt;    } &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (e) {&lt;br /&gt;        ShowDialog(e);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;The token validation on the service side is done via WIF, but given the simplicity of the operation it could be done even directly in the app code.&lt;/p&gt;
&lt;h4&gt;Roaming Tokens&lt;/h4&gt;
&lt;p&gt;This is all fine and dandy, I can almost hear you say: but how did you pull off the trick of avoiding the need to re-authenticate on the other device? The answer lies in another great new feature of Windows, the Credentials Vault. The considerations I made earlier about the WebAuthenticationBroker are valid for the Vault, too: in fact, it is coming from the same awesome Windows feature team. &lt;br /&gt;Here I will just say that, as you have seen in the keynote and big picture sessions, Windows is introducing phenomenal new roaming capabilities: if you save your tokens in the Vault, and the correct conditions are met, you can take advantage of those roaming capabilities too.&lt;/p&gt;
&lt;div style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;" id="codeSnippetWrapper"&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;" id="codeSnippet"&gt;&lt;span style="color: #008000;"&gt;//saving the token in the Vault&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; vault = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Windows.Security.Credentials.PasswordVault();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; cred = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Windows.Security.Credentials.PasswordCredential(&lt;br /&gt;                url,&lt;br /&gt;                username,&lt;br /&gt;                token);&lt;br /&gt;            vault.add(cred);&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now, that was quite the whirlwind tour! Don&amp;rsquo;t get fooled by the length of the post, that is due to the fact that there are so many new things to describe. In fact, I keep being amazed by how little, non-esoteric code all this requires on the client side when you develop Metro Style apps. &lt;br /&gt;What&amp;rsquo;s that? You want to try it by yourself? Keep reading, then!&lt;/p&gt;
&lt;h3&gt;The ACS Sample in the Windows Azure Toolkit for Windows 8&lt;/h3&gt;
&lt;p&gt;Want to take advantage from the &lt;a href="http://msdn.microsoft.com/en-us/windows/apps/br229516/"&gt;Windows Developer Preview&lt;/a&gt; of the Windows Azure services you already know and love? Want to learn more about the new Windows Push Notification Services? &lt;br /&gt;Then &lt;a href="http://msdn.microsoft.com/en-us/windows/apps/br229516/"&gt;download the Windows Developer Preview&lt;/a&gt;, install it and &lt;a href="http://watwindows8.codeplex.com/"&gt;get yourself a copy of the Windows Azure Toolkit for Windows 8&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://watwindows8.codeplex.com/"&gt;Windows Azure Toolkit for Windows 8&lt;/a&gt; contains a sample ACS application which demonstrates the same flow described earlier for the keynote demo. The notable differences are that the UI is much less fancy (but still metro style!) and the backend is designed to run on the local Windows Azure simulation environment, which makes it especially handy.&lt;/p&gt;
&lt;p&gt;In this post I won&amp;rsquo;t drill too deep in the code, that&amp;rsquo;s for a future installment (or, if you are at //BUILD and you are interested, come by on Thursday). For now I just want to give you few tips for finding your way through the sample and run it successfully.&lt;/p&gt;
&lt;h4&gt;Setup&lt;/h4&gt;
&lt;p&gt;Install the Windows Developer Preview; download the &lt;a href="http://watwindows8.codeplex.com/"&gt;Windows Azure Toolkit for Windows 8&lt;/a&gt; and launch it. That&amp;rsquo;s all you need to do. The (metaphorically) award-winning Dependency Checker takes care of tracking down everything you need and offer you the right links for downloading/installing it. In fact, I used it for getting Visual Studio 2010 installed and configured side by side with the IDE out-of-the-box in this preview, Visual Studio 2011 Express.&lt;/p&gt;
&lt;p&gt;Few suggestions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Some of the entries in the dependency checker can take a long time. Be patient when
&lt;ul&gt;
&lt;li&gt;downloading &amp;amp; installing WebPI (if you don&amp;rsquo;t have it already)&lt;/li&gt;
&lt;li&gt;enabling the Internet Information Services 7 (IIS7) feature&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The ACS sample is in c:\WindowsAzure\WATWindows\Samples\ACS. &lt;br /&gt;In order to use the sample, you need to run SetupSample.cmd in the same folder. You can&amp;rsquo;t skip this, as the setup needs to adapt the code to the ACS namespace you&amp;rsquo;ll use and update the namespace itself accordingly
&lt;ul&gt;
&lt;li&gt;The setup will ask you for one ACS namespace and its management key. I suggest getting those info in advance: instructions on how to do that are in the readme of the toolkit, in Appendix II&lt;/li&gt;
&lt;li&gt;If you want to use Facebook, you&amp;rsquo;ll need to create one Facebook app tied to your ACS namespace; the setup will ask for the app ID and the secret. Again, I suggest getting those values in advance&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;The Sample&lt;/h4&gt;
&lt;p&gt;The sample includes two solutions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ACSMetroClient, the Metro style application&lt;/li&gt;
&lt;li&gt;ModernCloudIdentity, the service called by the client (and some other stuff)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6646.solutions_5F00_687BCE64.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="solutions" border="0" alt="solutions" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7128.solutions_5F00_thumb_5F00_199B0905.png" width="240" height="177" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Metro style application templates are available only in Visual Studio 11; and as of today, the Windows Azure tools for Visual Studio will work only with VS 2010. This means that you need to open ACSMetroClient with VS11 and ModernCloudIdentity with VS10.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0842.shortcut_5F00_66CB0290.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="shortcut" border="0" alt="shortcut" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5657.shortcut_5F00_thumb_5F00_4C8A996C.png" width="200" height="272" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pro tip: although you can open ACSMetroClient.sln by double-clicking it, it is suggested that you open ModernCloudIdentity.sln by first launching VS10 via the shortcut to VisualStudio2010WindowsAzure.cmd that the setup placed on your desktop, and then you open the solution from there.&lt;/p&gt;
&lt;h5&gt;The Service solution&lt;/h5&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7215.waz_5F00_6F6B5B1C.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="waz" border="0" alt="waz" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2844.waz_5F00_thumb_5F00_62FD37F3.png" width="134" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The solution contains three projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DPE.OAuth, a class library containing an OAuth implementation for WIF (from the good old FabrikamShipping)&lt;/li&gt;
&lt;li&gt;ModernCloudIdentity, the cloud project hosting the web role for the service&lt;/li&gt;
&lt;li&gt;ModernCloudIdentity.Web, a web role containing the service and a a couple of utility pages (Default.aspx and Bouncer.aspx)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The service part is well known, basically the same as every REST-based sample or hands-on lab we released in the past.&lt;/p&gt;
&lt;p&gt;The Default page here is a little trick in this sample for bridging the different ways in which ACS issues tokens in redirect scenarios (in a POST) and the WebAuthenticationBroker expects them (in the querystring of the Url that has been defined as callback). As I mentioned I don&amp;rsquo;t want to go in details here. I&amp;rsquo;ll just say that when Default.aspx receives the SWT token from ACS in a classic wresult POST , it extracts the token and adds it in the querystring of a redirect to Bouncer.aspx; but Bouncer.aspx is the designated callback URL, hence the broker retrieves the token from the querystring and returns. More complicated to explain than to do; and in any case, please keep in mind that this is just a sample based on developer preview software.&lt;/p&gt;
&lt;p&gt;Hit F5 to start the simulation environment: you&amp;rsquo;ll get a couple of browsers complaining that you didn&amp;rsquo;t send a token, don&amp;rsquo;t mind them and move to the client solution.&lt;/p&gt;
&lt;h4&gt;The Metro Style client&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6237.client_5F00_08F2E84A.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="client" border="0" alt="client" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7215.client_5F00_thumb_5F00_67FF75A2.png" width="226" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The client code is really straightforward. It is basically the default app as it comes out of the template, with just few modifications to default.html and default.js:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The UI is really a series of DIVs, which are made visible or invisible depending on where in the app the user. There is a splash screen, a home realm discovery screen, and a service invocation UI. If you follow the flow described for the keynote demo, you&amp;rsquo;ll see them in that order. The main difference, apart from the look&amp;amp;feel, is that the call to the service does not happen automatically right after the authentication experience but takes place when you click on &amp;ldquo;Invoke&amp;rdquo;. Note that the token text is available on the page, so that you can experiment with tampering with the string before sending it and get an &amp;ldquo;invalid signature&amp;rdquo; on purpose. &lt;br /&gt;If there is already a token in the vault from former sessions, the app will skip the authentication and go straight to the invoke screen.&lt;/li&gt;
&lt;li&gt;The JS contains the logic for moving thru the app, getting the list of IPs and presenting it to the user (databinding is fun! Thanks Giorgio and Jaime for all your help on that), using the WebAuthenticationBroker, the Vault, and performing calls. As mentioned, I won&amp;rsquo;t go in details yet: we&amp;rsquo;ll get to this in &lt;a href="http://channel9.msdn.com/Events/BUILD/BUILD2011/SAC-858T"&gt;tomorrow&amp;rsquo;s session&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Exciting times! &lt;br /&gt;Among all the great news of the last two days, it&amp;rsquo;s nice to see that claims-based identity is the gift that keeps on giving. I just *love* to see how ACS can really simplify your life even when used with those brand-new development technologies. Looking forward for your feedback!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10209665" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Azure/">Windows Azure</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Access+Control+Service/">Access Control Service</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ACS/">ACS</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/build/">build</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/windows8/">windows8</category></item><item><title>Guess what?</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/08/21/guess-what.aspx</link><pubDate>Mon, 22 Aug 2011 06:45:09 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10198362</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10198362</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/08/21/guess-what.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6114.buildbig_5F00_56C6A1FF.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="buildbig" border="0" alt="buildbig" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6204.buildbig_5F00_thumb_5F00_2AA9A50E.png" width="495" height="423" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;…and that’s as much as I can say for now &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7774.wlEmoticon_2D00_smile_5F00_6A07589E.png" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10198362" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Identity/">Identity</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Events/">Events</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/build/">build</category></item><item><title>Hands-on lab: Windows Azure Marketplace for Applications</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/08/09/hands-on-lab-windows-azure-marketplace-for-applications.aspx</link><pubDate>Tue, 09 Aug 2011 07:51:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10193931</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10193931</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/08/09/hands-on-lab-windows-azure-marketplace-for-applications.aspx#comments</comments><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4466.Picture1_5F00_609A2F31.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Picture1" border="0" alt="Picture1" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0763.Picture1_5F00_thumb_5F00_38878012.png" width="322" height="155" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;For the series “&lt;a href="http://blogs.msdn.com/b/vbertocci/archive/2011/07/10/ch-ch-ch-changes.aspx"&gt;things I was working on before moving from DPE to the product team&lt;/a&gt;”. Today &lt;a href="http://www.wadewegner.com/"&gt;Wade’s&lt;/a&gt; gang released an update to the &lt;a href="http://go.microsoft.com/fwlink/?LinkID=130354"&gt;Windows Azure Platform Training Kit&lt;/a&gt; containing a new lab, “&lt;a href="http://msdn.microsoft.com/en-us/WAZPlatformTrainingCourse_IntroToWAzMarketplace"&gt;Introduction to the Windows Azure Marketplace for Applications&lt;/a&gt;”. Here there’s a bit of brain dump (not too long, it’s already past midnight here) of what were the thoughts in designing the lab: I see that the guys did some changes here and there, but the structure appears to be the same.&lt;/p&gt;  &lt;p&gt;You may have seen last month the announcement that &lt;a href="http://www.microsoft.com/windowsazure/features/marketplace/"&gt;Windows Azure opened up a marketplace for applications&lt;/a&gt;: the aforementioned lab walks you though the process of adapting one existing SaaS application to take advantage of the marketplace for handling subscriptions &amp;amp; subscription lifecycle.&lt;/p&gt;  &lt;p&gt;The main idea behind the lab was to show how an existing subscription management solution- such as a redeemable code handed out by your salesperson for every new deal - could be handled in a much more natural way by integrating with the Windows Azure marketplace.    &lt;br /&gt;Another reason for starting from an existing working solution was to make extra-clear where the marketplace responsibilities end and yours begin: for example the user registration (via ACS, of course) are entirely up to you. I would have liked to add a feature for handling multiple users (in order to be extra certain that nobody confuses “user” with “tenant”, you won’t believe how many times that happens) but there was no time. In any case, I am satisfied with the amount of identity topics we got in there &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4786.wlEmoticon_2D00_smile_5F00_17940D6B.png" /&gt;&lt;/p&gt;  &lt;p&gt;I won’t spoil (all) the surprise to you, but integrating your app in the marketplace largely consists in adding to your app an endpoint that the marketplace can call to notify you of a new subscription, a deprovisioning of an existing subscriptions, and the various details you need to act upon that info (for example which subscription level the customer paid for). Those calls are secured by…. surprise surprise… &lt;strong&gt;OAuth2&lt;/strong&gt;. In fact, the lab takes advantage of &lt;a href="http://blogs.msdn.com/b/card/archive/2010/11/29/protecting-and-consuming-rest-based-resources-with-acs-wif-and-the-oauth-2-0-protocol.aspx"&gt;WIF’s OAuth2 extensions&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The Windows Azure marketplace has various developer-friendly features, such as a “playground” from where you can send test subscription and deprovisioning messages; the lab walks you thru their user in detail. The lab also demonstrates how to go through the publication process, necessary to get one entry for your app in the application catalog.&lt;/p&gt;  &lt;p&gt;Of course another important goal of the lab was to help you wrap your head about how to handle multitenancy (by managing the subscriptions info accordingly) and think a bit about what a real system may need to cope with (for example avoiding to delete all tenant data upon preprovisioning messages, or handle idempotency in case the same message needs to be re-sent). You tell me, but I think that the lab covers that pretty nicely.&lt;/p&gt;  &lt;p&gt;Extra goodness? The lab setup uses the &lt;a href="http://blogs.msdn.com/b/vbertocci/archive/2011/07/12/updated-windows-azure-access-control-service-cmdlets-modules-continuation-and-backup-restore.aspx"&gt;ACS cmdlets&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;What is there to add? Congratulations to &lt;a href="http://www.wadewegner.com/"&gt;Wade&lt;/a&gt;, Donovan &amp;amp; he rest o the gang for the new release, and I wish you best of luck for your Windows Azure apps in the Marketplace!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10193931" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Identity+Foundation/">Windows Identity Foundation</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Azure/">Windows Azure</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Access+Control+Service/">Access Control Service</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ACS/">ACS</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/OAuth2/">OAuth2</category></item><item><title>A Digression on ACS and Rules</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/07/25/a-digression-on-acs-and-rules.aspx</link><pubDate>Tue, 26 Jul 2011 06:12:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10189369</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10189369</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/07/25/a-digression-on-acs-and-rules.aspx#comments</comments><description>&lt;p&gt;As you know, ACS offers a simple-yet-powerful rule engine which you can use for processing incoming claims and keep out of your application a considerable chunk of logic: claims set normalization, occasional policy decision point, and so on. The primitive there is the &lt;em&gt;claim mapping rule:&lt;/em&gt; if an incoming claim matches the premise of a rule then the conclusion (in form of output claim) is added to the token that ACS will issue. Classic modus ponens, for the first-order logic aficionados among you. In inference rule notation:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2477.image_5F00_thumb4_5F00_4C2981A0.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image_thumb[4]" border="0" alt="image_thumb[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1411.image_5F00_thumb4_5F00_thumb_5F00_32554B71.png" width="300" height="158" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Simply put, that means that I can codify logic such as &lt;em&gt;&amp;ldquo;if you see a claim coming from Google, of type &amp;lsquo;email&amp;rsquo; and with value &amp;lsquo;&lt;/em&gt;&lt;a href="mailto:&amp;lsquo;johndoenet64@gmail.com&amp;rsquo;"&gt;&lt;em&gt;johndoenet64@gmail.com&amp;rsquo;&lt;/em&gt;&lt;/a&gt;&lt;em&gt; please add to the output token a claim of type &amp;lsquo;role&amp;rsquo; and value &amp;lsquo;hairdresser&amp;rsquo;&amp;rdquo;&lt;/em&gt;. There are variations, for example I can omit claim type and/or value if I want my rule to be triggered for a wider range of inputs (i.e. I might want a rule which gets triggered every time I get something from Google, regardless of which claims are provided: the system rule adding identity provider info is a good example of that), but that&amp;rsquo;s pretty much it.&lt;/p&gt;
&lt;p&gt;One interesting fact you may not be aware of is that &lt;em&gt;ACS rules can be chained&lt;/em&gt;: that is, you can create rules which will be triggered by the output of other rules. All you need to do is create a rule whose input claim has ACS itself as issuer.&lt;/p&gt;
&lt;p&gt;For example: you could create a rule which assigns to all the users in the role &amp;ldquo;hairdresser&amp;rdquo; to the role &amp;ldquo;cashier&amp;rdquo; and &amp;ldquo;authorized shipment slips signer&amp;rdquo;, two roles associated to the hairdresser position.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5621.image_5F00_3FBB5E77.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2480.image_5F00_thumb_5F00_108972E0.png" width="500" height="365" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The advantages of the chained approach to the &amp;ldquo;enumeration&amp;rdquo; one is obvious. If both John and Pamela are hairdressers, with the chaining I need just 4 rules (two for assigning the hairdresser role to the users, two for adding the extra roles to the hairdresser role (which starts looking more like a group)) versus the 6 I&amp;rsquo;d need without chaining (three rules with email premise and role conclusion per user). That&amp;rsquo;s N+2 vs 3N&amp;hellip; they diverge pretty quickly &lt;img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0250.wlEmoticon_2D00_smile_5F00_101D3FEB.png" /&gt; &lt;br /&gt;Apart from the sheer number of rules, there&amp;rsquo;s also the manageability of the system. Onboarding Pamela as hairdresser, or changing her position later on, entails just adding (or changing) one single rule. If the hairdresser responsibilities change over time, all you need to do is changing the rules that have role-hairdresser as premise. Neat-o.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0827.image_5F00_thumb7_5F00_61C3BA3D.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image_thumb[7]" border="0" alt="image_thumb[7]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2313.image_5F00_thumb7_5F00_thumb_5F00_562DFCFE.png" width="300" height="241" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The above is a schema of how the usual rules work. A is the set of all possible claim types/values from the A issuer, O is the set of the claims issued by ACS (B is there just for showing that there can be multiple IPs). The blue arrow from A to O represent rules of the first type, the blue arrow that loops from O to O represents the chained rules. Let&amp;rsquo;s abuse this notation a bit and give a representation of the two rule styles above.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7608.image_5F00_thumb9_5F00_7570A3D1.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image_thumb[9]" border="0" alt="image_thumb[9]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1016.image_5F00_thumb9_5F00_thumb_5F00_7C23AD54.png" width="300" height="137" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the version without chaining, we have 6 rules (all of the form {A,O} predicate) which assign to John and Pamela to the 3 roles.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0246.image_5F00_thumb10_5F00_74983DE7.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image_thumb[10]" border="0" alt="image_thumb[10]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2084.image_5F00_thumb10_5F00_thumb_5F00_463EB83A.png" width="300" height="138" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the version with chaining, we have two rules of the form {A,O} and two of the form {O,O}. Welcome to the exciting world of predicates. &lt;br /&gt;See what we have done here? The blue rule assigned Joe and Pamela to the set of the hairdressers; the red and green rules got chained and indirectly assigned Joe and Pamela to the set of the signers and the set of the cashiers, too.&lt;/p&gt;
&lt;p&gt;The case above is a fairly unfortunate case, as the defining property we are using for determining that a user belongs to a given set (hairdressers) is unique to every element (every user has a different email address) hence in order to define our first set we need to add as many rule as there are users. &lt;br /&gt;If our users would come from an identity provider that supplies more structured info, such as the directory for a cosmetology school, we could be in a better shape. For example students may be subdivided in groups according to the specialties they elected: hair stylist, skin care, nail technology and so on. Why did I pick up this sample again? Now I have to play along, tho &lt;img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0250.wlEmoticon_2D00_smile_5F00_101D3FEB.png" /&gt; &lt;br /&gt;Anyway, let&amp;rsquo;s say that those students all go to work in a salon during the summer break, and that salon uses an application secured via ACS. At this point the rule could be &lt;em&gt;&amp;ldquo;if you see a claim coming from the cosmetology school AD, of type &amp;lsquo;group&amp;rsquo; and with value &amp;lsquo;&lt;/em&gt;&lt;em&gt;hair stylist&amp;rsquo;&lt;/em&gt;&lt;em&gt; please add to the output token a claim of type &amp;lsquo;role&amp;rsquo; and value &amp;lsquo;hairdresser&amp;rsquo;&amp;rdquo;&lt;/em&gt;. That rule would instantly cover all the students satisfying the criteria, as opposed to just one as before. You can even extend those sets by boolean union, for example adding a rule which establishes that the Barbering students are also in the Hairdresser role. &lt;br /&gt;The chaining technique would have the same value, refining the properties of one set instead of having to recreate it; but never really doing anything for altering the number of elements affected.&lt;/p&gt;
&lt;p&gt;Now what if, instead of the union of sets, we&amp;rsquo;d want to target the intersection? This is a very, very common requirement. For example, let&amp;rsquo;s say that the salon will employ only hair stylist students who are at the last year of the course. With the current {A, O} and {O, O} set of predicates, the answer is simple: you can&amp;rsquo;t. Or better, you can if you &amp;ldquo;cheat&amp;rdquo;. You can go by enumeration: if you know in advance that Rudy is a last year student in the hair stylist track, you can provision him by email and do the same with everybody else. That is not always possible, of course, and it&amp;rsquo;s not very efficient or manageable. &lt;br /&gt;The other possibility is to rely on the directory administration of the school, and ask him/her to create a group &amp;ldquo;employed at salon A&amp;rdquo; that can can be used by ACS for assigning the hairdresser role to the correct group. There will be occasions in which you&amp;rsquo;ll be able to do it, but most often than not you should take as little dependency from the incoming source as possible (no guarantees they are willing to help, or will reliably and timely do so).&lt;/p&gt;
&lt;p&gt;As mentioned here, &lt;a href="http://bit.ly/qgjmLg"&gt;from today ACS offers a new type of rule&lt;/a&gt; which allows you to identify the intersection of two sets. By allowing you to define two input claim conditions in logical AND from the same IP, that is to say a predicate of the form {A&amp;amp;A,O} you can effectively express that &lt;br /&gt;&lt;em&gt;&amp;ldquo;if you see a claim coming from the cosmetology school AD, of type &amp;lsquo;group&amp;rsquo; and with value &amp;lsquo;&lt;/em&gt;&lt;em&gt;hair stylist&amp;rsquo;&lt;/em&gt;&lt;em&gt; AND &lt;br /&gt;&lt;em&gt;you see a claim coming from the cosmetology school AD, of type &amp;lsquo;group&amp;rsquo; and with value &amp;lsquo;&lt;/em&gt;&lt;em&gt;last year student&amp;rsquo;&lt;/em&gt;&lt;em&gt; &lt;br /&gt;&lt;/em&gt;please add to the output token a claim of type &amp;lsquo;role&amp;rsquo; and value &amp;lsquo;hairdresser&amp;rsquo;&amp;rdquo;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3808.image_5F00_7E7D2F52.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8360.image_5F00_thumb_5F00_44FA1F5B.png" width="400" height="132" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In other &amp;ldquo;words&amp;rdquo;, our diagram earns an extra predicate with different arity:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1732.image_5F00_38F82F27.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6786.image_5F00_thumb_5F00_31008CC5.png" width="290" height="237" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;..and adding a bit of notation abuse, we can see how this new predicate effectively gives you the power of identifying intersections:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1423.image_5F00_29751D58.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4666.image_5F00_thumb_5F00_289CB76E.png" width="400" height="189" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now, you may raise the fact that some conditions may require intersection with more than two sets. That&amp;rsquo;s fair. The good news is that you can add extra conditions, by feeding the result of one rule as one of the two inputs of another. In other words, you can write rules of the form {A&amp;amp;O, O} (of course the order of A and O in the premise does not matter, as AND is commutative). So if you want one of the students you employ to be allowed to operate a cashier machine only if older than 21, you can cascade the former cashier rule by modifying it as follows:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1016.image_5F00_081577BC.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2821.image_5F00_thumb_5F00_0DF01B55.png" width="500" height="248" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;basically that means we added a predicate of the form shown in red:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1832.image_5F00_5877592F.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3404.image_5F00_thumb_5F00_2CC68F33.png" width="306" height="325" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here you can see one case in which no student is actually allowed to operate the cashier:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8787.image_5F00_5E51FCC8.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0842.image_5F00_thumb_5F00_726B1951.png" width="400" height="224" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There is one guy in the &amp;ldquo;adults&amp;rdquo; group, but that group has empty intersection with the hairdresser role (which was itself the intersection of the hair stylists and the last year students groups). You can iterate as many times you want, and you can even do intersections entirely in the O domain (with predicates of the form {O&amp;amp;O, O}).&lt;/p&gt;
&lt;p&gt;Well, it&amp;rsquo;s the 3rd blog post I write this weekend, and it&amp;rsquo;s technically Monday morning now &lt;img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0250.wlEmoticon_2D00_smile_5F00_101D3FEB.png" /&gt; the time is up, I better get some sleep. &lt;br /&gt;The hair salon scenario is perhaps not the most common SaaS application you&amp;rsquo;ll find around, but I hope this was useful for you to think about how to use ACS rules. If you have feedback on how ACS rules, don&amp;rsquo;t be shy! &lt;img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0250.wlEmoticon_2D00_smile_5F00_101D3FEB.png" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10189369" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Identity/">Identity</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Access+Control+Service/">Access Control Service</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ACS/">ACS</category></item><item><title>Using the Windows Azure Access Control Service in iOS Applications</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/07/25/using-the-windows-azure-access-control-service-in-ios-applications.aspx</link><pubDate>Mon, 25 Jul 2011 17:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10189334</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10189334</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/07/25/using-the-windows-azure-access-control-service-in-ios-applications.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://bit.ly/nAixFi"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1513.image_5F00_thumb_5F00_6D53D403.png" width="500" height="312" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nossir, there is nothing wrong with my blog &lt;img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0028.wlEmoticon_2D00_smile_5F00_3DB5B577.png" /&gt; the screenshot above is indeed taken from a Mac desktop, and the one you see on the center is actually an instance of the iPhone emulator. What you should notice, however, is the list of Identity Providers it shows, so strangely similar to what we have shown on Windows Phone 7 and ACS&amp;hellip; but I better start from the beginning.&lt;/p&gt;
&lt;p&gt;A couple of months ago the Windows Azure Platform Evangelism team, in which I worked until recently, released a &lt;a href="http://watoolkitwp7.codeplex.com/"&gt;toolkit&lt;/a&gt; for taking advantage of the Windows Azure platform services from Windows Phone 7 applications. The toolkit featured various integration points with ACS, as explained at length &lt;a href="http://blogs.msdn.com/b/vbertocci/archive/2011/05/09/windows-azure-toolkit-for-windows-phone-7-1-2-will-integrate-with-acs.aspx"&gt;here&lt;/a&gt;. &lt;br /&gt;At about the same time, the team (and Wade specifically) released a version of the same &lt;a href="http://www.wadewegner.com/2011/05/windows-azure-toolkit-for-ios/"&gt;toolkit tailored to iOS developers&lt;/a&gt;. That first iOS version integrated with the core Windows Azure services, but didn&amp;rsquo;t take advantage of ACS. &lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;&lt;span style="color: #ff0000; text-decoration: underline;"&gt;Well, &lt;a href="http://www.wadewegner.com/2011/07/windows-azure-toolkit-for-ios-now-supports-the-access-control-service/"&gt;today we are releasing a new version of the Windows Azure toolkit for iOS featuring ACS integration!&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0028.wlEmoticon_2D00_smile_5F00_3DB5B577.png" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="background-color: #ffff00;"&gt;Dear iOS friends landing on this blog for the first time&lt;/span&gt;: of course I understand you many not be familiar with the Windows Azure Control Service. You can get a &lt;a href="http://msdn.microsoft.com/en-us/magazine/gg490345.aspx"&gt;quick introduction&lt;strong&gt; here&lt;/strong&gt;&lt;/a&gt;, however for the purpose of providing context for this post let me just say the following: ACS is a fully cloud-hosted service which helps you to add to your application sign-in capabilities from many user sources such as Windows Live ID, Facebook, Google, Yahoo, arbitrary OpenID providers, local Active Directory instances, and many more. Best of all, it allows you to do so without having to learn each and every API or SDK; the integration code is the same for everybody, and extremely straightforward. All communications are done via open protocols, hence you can easily take advantage of the service from &lt;em&gt;any &lt;/em&gt;platform, as this very post demonstrates. Try it! &lt;img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2577.wlEmoticon_2D00_smile_5F00_5A485137.png" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I am no longer on the Evangelism team, but the ACS work for this deliverable largely took place while I was still on it: recording &lt;a href="http://bit.ly/nAixFi"&gt;the screencast&lt;/a&gt; and writing this blog post provides nice closure. Thanks to &lt;a href="http://www.wadewegner.com"&gt;Wade&lt;/a&gt; for having patiently prepped &amp;amp; provided a Mac already perfectly configured for the&lt;a href="http://bit.ly/nAixFi"&gt; recording&lt;/a&gt;! Also, for driving the entire project, IMO one of the coolest things we&amp;rsquo;ve done with ACS so far.&lt;/p&gt;
&lt;p&gt;And now, for something completely different:&lt;/p&gt;
&lt;h2&gt;The Release&lt;/h2&gt;
&lt;p&gt;As usual, you&amp;rsquo;ll find everything in DPE&amp;rsquo;s GitHub repository: &lt;a title="https://github.com/microsoft-dpe" href="https://github.com/microsoft-dpe"&gt;https://github.com/microsoft-dpe&lt;/a&gt; &lt;br /&gt;There will be four main entries you&amp;rsquo;ll want to pay attention to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft-dpe/watoolkitios-lib"&gt;watoolkitios-lib&lt;/a&gt; &lt;br /&gt; &lt;br /&gt;This is a library of Objective-C snippets which can help you to perform a number of common tasks when using WIndows Azure. For the specific ACS case, you&amp;rsquo;ll find code for listing identity providers, acquire and handle tokens, invoke the ACS management APIs, and so on.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft-dpe/watoolkitios-doc"&gt;watoolkitios-doc&lt;/a&gt; &lt;br /&gt; &lt;br /&gt;As expected, some documentation &lt;img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0028.wlEmoticon_2D00_smile_5F00_3DB5B577.png" /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft-dpe/watoolkitios-samples"&gt;watoolkitios-samples&lt;/a&gt; &lt;br /&gt; &lt;br /&gt;A sample application which demonstrates how to put the various snippets together&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft-dpe/cloudreadypackages"&gt;cloudreadypackages&lt;/a&gt; &lt;br /&gt; &lt;br /&gt;Those are a set of ready-to-go packages that can be directly uploaded and launched in Windows Azure, without requiring you to have access to Visual Studio or the Windows Azure SDK: all you need is to deploy them via the portal (which works on Mac, too). The packages can be used as test backend for your iOS applications. &lt;br /&gt;The packages take advantage of &lt;a href="http://blogs.msdn.com/b/vbertocci/archive/2011/05/31/edit-and-apply-new-wif-s-config-settings-in-your-windows-azure-webrole-without-redeploying.aspx"&gt;the technique described here&lt;/a&gt; to allow changes in the config settings even after deploy time. Which is a great segue for&amp;hellip;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft-dpe/watoolkitios-configutility"&gt;&lt;strong&gt;The ACS config tool for IOs &lt;/strong&gt; &lt;/a&gt;&lt;br /&gt; &lt;br /&gt;In the Windows Azure Toolkit for Windows Phone 7 we included some Visual Studio templates which contain all the necessary logic for wiring up a phone application to ACS and configure ACS to issue tokens for that app. In iOS/xCode there&amp;rsquo;s no direct equivalent of those templates, but we still wanted to shield the developer from many of the low level details of using Windows Azure. To that end, we created a tool which can automatically configure the application, ACS and Windows Azure.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Using the ACS Configuration Tool for iOS in the Toolkit&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0116.image_5F00_4B87FB72.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2502.image_5F00_thumb_5F00_0EEFFCD5.png" width="400" height="215" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you want to see the tool in action, check out &lt;a href="http://bit.ly/nAixFi"&gt;the webcast&lt;/a&gt;; here I will give you few glimpses, just to whet your appetite.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5710.image_5F00_0E1796EB.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1104.image_5F00_thumb_5F00_2230B374.png" width="400" height="265" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a classic wizard, and it opens with a classic welcome page. We don&amp;rsquo;t like surprises, hence we announce what the tool is going to do &lt;img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0028.wlEmoticon_2D00_smile_5F00_3DB5B577.png" /&gt; let&amp;rsquo;s click next.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0435.image_5F00_736AFAD1.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2570.image_5F00_thumb_5F00_0717E466.png" width="400" height="264" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The first screen gathers info about the Windows Azure storage account you want to use; nothing to do with ACS yet. Next.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4130.image_5F00_063F7E7C.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4718.image_5F00_thumb_5F00_5779C5D9.png" width="400" height="265" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The next screen gathers the certificate used for doing SSL with the cloud package. Again, no ACS yet. Next.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8030.image_5F00_56352CFA.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3644.image_5F00_thumb_5F00_276F7458.png" width="400" height="262" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ahh, NOW we are talking business. Just like in the toolkit for Windows Phone 7 we offered the possibility of using the membership provider or ACS, here we do the same: depending on which option you pick, the way in which the user will be prompted for credentials and how calls will be secured will differ accordingly. Here we go the ACS way, or course &lt;img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0028.wlEmoticon_2D00_smile_5F00_3DB5B577.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5126.image_5F00_3B8890E1.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0083.image_5F00_thumb_5F00_05A39BC7.png" width="400" height="264" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I would say this is the key screen in the entire process. Here we prompt the developer to provide the ACS namespace theyw ant to use with their iOS application, and the management key we need to modify the namespace settings accordingly. If you are unsure about how to obtain those values, a helpful link points to a document which will briefly explain how to navigate the ACS portal to get those.&lt;/p&gt;
&lt;p&gt;In this wizard we try to strike a balance between showing you the power of the services we use and keeping the experience simple. As we did for the WP7 toolkit, here we apply some defaults (Google, yahoo and live id as identity providers, pass-through rules for all) that will show how ACS works without offering too many knobs and levers to operate. If you are unhappy with the defaults, you can always go directly to the portal and modify the settings accordingly. For example you may add a Facebook app as identity provider, and that will show up automatically in the phone application without any changes to the code.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6763.image_5F00_19BCB850.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4606.image_5F00_thumb_5F00_1F975BE9.png" width="400" height="264" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The final screen of the wizard informs you that it has enough info to start the automatic configuration process. First it will generate a ServiceConfiguration.cscfg file, which you&amp;rsquo;ll use for configuring the Windows Azure backend (your cloudready package) via the portal. Then the wizard will reach out directly to the ACS management endpoint, and will add all the settings as specified.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7532.image_5F00_70657051.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1565.image_5F00_thumb_5F00_48BEF427.png" width="400" height="264" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As soon as you hit Save the wizard will ask you for amlocation for the cscfg file, then it will contact ACS and show you a bar as it progresses thru the configuration. Pretty neat! &lt;img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0028.wlEmoticon_2D00_smile_5F00_3DB5B577.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0167.image_5F00_40C751C5.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8004.image_5F00_thumb_5F00_54080864.png" width="500" height="371" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Above you can see the generated ServiceConfiguration.cscfg. Of course the entire point of generating the file is so that you don&amp;rsquo;t have to worry about the details, but if you are curious you can poke around. You&amp;rsquo;ll mainly find the connection strings for the Windows Azure storage and the settings for driving the interaction with ACS.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2664.image_5F00_0E7C7A7E.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2260.image_5F00_thumb_5F00_5F4A8EE6.png" width="500" height="312" /&gt;&lt;/a&gt; &lt;br /&gt;All you need to do is to navigate (via the Windows Azure management portal) to the hosted service you are using for your backend, hit Configure and paste in the autogenerated ServiceConfiguration.cscfg.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0508.image_5F00_3018A34F.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2260.image_5F00_thumb_5F00_43C58CE3.png" width="500" height="312" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The next step in the screencast shows how to run the sample application, already properly configured, in Xcode. If you hit the play button, you&amp;rsquo;ll be greeted by the screen which which I opened the post.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1425.image_5F00_00E133A5.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1513.image_5F00_thumb_5F00_6D53D403.png" width="500" height="312" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The rest is business as usual: the application follows the same pattern as the ACS phone sample and labs: an initial selection driven by browser based sign in protocols to obtain and cache the token from ACS (a SWT) and subsequent web service calls secured via OAuth. Below a Windows Live ID prompt, followed by the first screen of the app upon successful authentication.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2677.image_5F00_2265E747.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8468.image_5F00_thumb_5F00_28408AE0.png" width="500" height="312" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7888.image_5F00_78A26C53.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0028.image_5F00_thumb_5F00_698B8D79.png" width="500" height="312" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Well, that&amp;rsquo;s it folks! I know that &lt;a href="http://www.wadewegner.com"&gt;Wade&lt;/a&gt; and the gang will keep an eye on the GitHub repository: play with the code, let them know what you like and what you don&amp;rsquo;t like, branch the code and add the improvements you want, go crazy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10189334" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/WIF/">WIF</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Azure/">Windows Azure</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Access+Control+Service/">Access Control Service</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ACS/">ACS</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/iOS/">iOS</category></item><item><title>New in ACS: Portal in Multiple Languages, a New Rule Type… and Wave Bye-Bye to Quotas</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/07/25/new-in-acs-portal-in-multiple-languages-a-new-rule-type-and-wave-bye-bye-to-quotas.aspx</link><pubDate>Mon, 25 Jul 2011 16:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10189316</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10189316</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/07/25/new-in-acs-portal-in-multiple-languages-a-new-rule-type-and-wave-bye-bye-to-quotas.aspx#comments</comments><description>&lt;p&gt;Big news in ACSland today! There few new key features that - I am sure &amp;ndash; many of you will welcome with a big smile. &lt;br /&gt;As usual, for the full scoop take a look at &lt;a href="http:// http//blogs.msdn.com/b/appfabric/archive/2011/07/25/announcing-the-windows-azure-appfabric-july-release.aspx"&gt;the announcement&lt;/a&gt; and the &lt;a href="http://msdn.microsoft.com/en-us/library/gg429787.aspx"&gt;release notes&lt;/a&gt;; here I&amp;rsquo;ll just give you few highlights &amp;amp; customarily lighthearted commentary.&lt;/p&gt;
&lt;h1&gt;The Portal Comes in 11 Languages&lt;/h1&gt;
&lt;p&gt;Riding the wave of the general localization effort sweeping the Windows Azure portal, the ACS portal can now entertain users in 10 extra languages, such as Japanese, Chinese (simplified and traditional), Korean, Russian, Portuguese, Spanish, German, French and even Italian &lt;img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1452.wlEmoticon_2D00_smile_5F00_01A5162E.png" /&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0550.image_5F00_59FE9A03.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2133.image_5F00_thumb_5F00_2DE19D12.png" width="500" height="337" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Switching it is pretty trivial, to the point that I am daring to switch to Chinese without (too much) fear of not being able to revert to English &lt;img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1452.wlEmoticon_2D00_smile_5F00_01A5162E.png" /&gt;. Just pick the language you want in the dropdown on the top right corner, and the UI will switch immediately. Also note the URL (in my case it moved to &lt;a title="https://windows.azure.com/Default.aspx?lang=zh-Hans" href="https://windows.azure.com/Default.aspx?lang=zh-Hans"&gt;https://windows.azure.com/Default.aspx?lang=zh-Hans&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;From that moment on, everything will be localized accordingly: for example if I invoke the management portal for one namespace, I get the HRD page localized accordingly:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1452.image_5F00_2D093728.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2133.image_5F00_thumb_5F00_375A5B88.png" width="300" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And of course, the portal itself is now fully localized:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0878.image_5F00_7DD74B90.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4572.image_5F00_thumb_5F00_4EA55FF9.png" width="500" height="337" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Note that I can override the language settings directly from the ACS portal, as highlighted in the image above. &lt;br /&gt;Biographic note: I always have a lot of fun checking out the Italian versions of the software I use. The reason is that everybody have a different threshold about what should be translated and what should remain in their original formulation (why translating IP to &amp;ldquo;provider di identita&amp;rsquo;&amp;rdquo; but leaving RP as &amp;ldquo;relying party&amp;rdquo;? (or even why keeping &amp;ldquo;provider&amp;rdquo; but translating &amp;ldquo;identity&amp;rdquo;?)), and for expats like myself that threshold is often 0 (as in &amp;ldquo;do not translate at all&amp;rdquo;). Mismatches in expectations lead to those &lt;a href="http://en.wikipedia.org/wiki/Theories_of_humor#Benign_Violation_Theory"&gt;"benign violations&amp;rdquo;&lt;/a&gt; that McGraw claims constituting the basis of humor &lt;img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1452.wlEmoticon_2D00_smile_5F00_01A5162E.png" /&gt; but I digress: ignore my pet peeves, I am sure that having the portal available in multiple languages will be of enormous help for making ACS even easier to use. Good job guys!&lt;/p&gt;
&lt;h1&gt;Quotas Are No More&lt;/h1&gt;
&lt;p&gt;Ah, this one is as simple as it will be appreciated, I have not the slightest doubt about it. &lt;br /&gt;Some of you occasionally stumbled on quotas: deliberate restrictions which capped the maximum number of entities (rules, trusted IPs, RPs, etc etc)&amp;nbsp; that could be created within a given namespace. Well, rejoice: &lt;strong&gt;&lt;em&gt;those restrictions are now all gone&lt;/em&gt;&lt;/strong&gt;. Have fun!&lt;/p&gt;
&lt;h1&gt;Rules Accept Up To 2 Input Claims&lt;/h1&gt;
&lt;p&gt;Here I risk throwing myself in a somewhat lengthy explanation, which I know many of my colleagues will deem unnecessary (as in &amp;ldquo;why does he always take hours to get to the point?!&amp;rdquo;). In order to preempt their complaints, here there are the sheer facts about the new rules:&lt;/p&gt;
&lt;p&gt;From this release on, you have the option of specifying up to two claims as input for claims transformation rules. If claims triggering both input conditions are present (logical AND), then the rule will trigger. The input claims must both be from the same identity provider, as there is no flow that would allow ACS to gather claims from multiple sources at once; alternatively, they can mix one identity provider and ACS itself.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8715.image_5F00_62BE7C82.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1440.image_5F00_thumb_5F00_338C90EB.png" width="400" height="313" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s all very straightforward. When you create your rule, specify your input claim conditions as usual; you&amp;rsquo;ll have the chance of adding a second input claim, by clicking on &amp;ldquo;Add a second input claim&amp;rdquo; as shown above.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6811.image_5F00_40F2A3F1.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7801.image_5F00_thumb_5F00_526304C9.png" width="400" height="564" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That opens up a new area in the UI, where you can specify the details of the second input claim. It&amp;rsquo;s that easy! Note that only newly created rules will allow a second input claim, and that rules created via the Generate command won&amp;rsquo;t have the second input claim either.&lt;/p&gt;
&lt;p&gt;One application of this new rule type is pretty obvious: you can express logic which depends from more than one factor (two, in fact) in the input token. As in &amp;ldquo;you get to be in the &amp;lsquo;Gold&amp;rsquo; role only if you are in the group &amp;lsquo;Managers&amp;rsquo; AND in the group &amp;lsquo;Partners&amp;rsquo;&amp;rdquo;, which was impossible to express before introducing the new rule type. Unless you enlist in the process the administrator of the IP and you convince them to add the rule in THEIR system directly at the origin, but that would be cheating.&lt;/p&gt;
&lt;p&gt;Another application is slightly less obvious: it is the chance of composing the current input with decisions taken in former iterations. I know, that&amp;rsquo;s not especially clear &lt;img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1452.wlEmoticon_2D00_smile_5F00_01A5162E.png" /&gt; that&amp;rsquo;s why I am throwing myself in &lt;a href="http://bit.ly/r6E3wX"&gt;the lengthy explanation in this other post&lt;/a&gt;, which is &lt;em&gt;totally optional&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s it folks! Once again, don&amp;rsquo;t rely on this unreliable blog and read for yourself about the news in &lt;a href="http:// http//blogs.msdn.com/b/appfabric/archive/2011/07/25/announcing-the-windows-azure-appfabric-july-release.aspx"&gt;the announcement&lt;/a&gt; and the &lt;a href="http://msdn.microsoft.com/en-us/library/gg429787.aspx"&gt;release notes&lt;/a&gt;. I am sure you&amp;rsquo;ll surprise us with real creative uses of those new features now at your disposal!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10189316" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Identity/">Identity</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Access+Control+Service/">Access Control Service</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ACS/">ACS</category></item><item><title>Updated Windows Azure Access Control Service Cmdlets: Modules, Continuation and Backup/Restore!</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/07/12/updated-windows-azure-access-control-service-cmdlets-modules-continuation-and-backup-restore.aspx</link><pubDate>Tue, 12 Jul 2011 08:00:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10185452</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10185452</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/07/12/updated-windows-azure-access-control-service-cmdlets-modules-continuation-and-backup-restore.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3051.powershell_5F00_554C330C.png"&gt;&lt;img title="powershell" border="0" alt="powershell" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4520.powershell_5F00_thumb_5F00_56ECD913.png" width="300" height="150" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As promised yesterday, here there’s one of the deliverables I mentioned. About one month ago we published the first release of &lt;a href="http://bit.ly/kF9ksY"&gt;a set of PowerShell cmdlets for ACS&lt;/a&gt;: wrappers for the ACS management APIs, which allow you to easily script tasks such as wiping a namespace, &lt;a href="http://bit.ly/j28pYy"&gt;adding an OpenID provider&lt;/a&gt;, automating often-used provisioning flows and much more.     &lt;br /&gt;The cmdlets were sample quality, but that didn’t prevent you from jumping on it with enthusiasm and give us a lot of great feedback: I credit especially the hosts and the audience of the &lt;a href="http://bit.ly/kZPqcu"&gt;Powerscripting podcast&lt;/a&gt;, who were so kind to have me on one episode and provide passionate commentary on what we had to improve.&lt;/p&gt;  &lt;p&gt;Well, I am happy to announce that many of the requested improvements are here! If you head to &lt;a title="http://wappowershell.codeplex.com/" href="http://bit.ly/nvcW0b"&gt;http://wappowershell.codeplex.com/&lt;/a&gt;, you’ll find &lt;a href="http://bit.ly/llnWl7"&gt;a new drop of the ACS cmdlets waiting for you&lt;/a&gt;. It’s the file &lt;a href="http://bit.ly/llnWl7"&gt;ACSCmdlets20110711.exe&lt;/a&gt;, for good measure I took down the old one.&lt;/p&gt;  &lt;p&gt;Make no mistake: this is still sample quality, but we added some features which will make those even more useful. Here there’s a list:&lt;/p&gt;  &lt;h3&gt;Snap-ins are out of fashion? Try our Modules &lt;/h3&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0334.image_5F00_0B030BCD.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3652.image_5F00_thumb_5F00_350309F5.png" width="400" height="164" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Hal and Jonathan had no doubt: our choice of delivering the cmdlets via snap-in was anachronistic, and we absolutely had to move things in a module.    &lt;br /&gt;We decided to offer that as an option at install time: now when you unpack the sample you will be prompted to choose if you want to use a module or a snap-in, perhaps if you are running an older version of PowerShell.&lt;/p&gt;  &lt;h3&gt;No more “plurals” &lt;/h3&gt;  &lt;p&gt;Another thing the &lt;a href="http://bit.ly/kZPqcu"&gt;Powerscripting&lt;/a&gt; crew was adamant about was the presence of one “singular” and one “plural” commands for every entity (ie Get-Rule and Get-Rule&lt;strong&gt;&lt;u&gt;&lt;em&gt;s&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt;). As it turns out, the common practice in PowerShell is to have just the “singular” version and cleverly use the parameters (or lack thereof) to let PowerShell figure out the multiplicity of the result. That’s exactly what we’ve done! In our case, it’s the presence of the –Name parameter which determines if we are interested in one specific entity or a collection. The snippet below, helpfully provided by Lito from our friends at Southworks, hopefully gets the point across:&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="929"&gt;         &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;# retrieve the full list of Identity Providers&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;&amp;gt; Get-IdentityProvider –Namespace $yourNamespace –ManagementKey $yourManagementKey&lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;# retrieve a single Identity Provider&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;&amp;gt; Get-IdentityProvider –Namespace $yourNamespace –ManagementKey $yourManagementKey &lt;strong&gt;–Name “Windows Live ID”&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;Your list exceeds the 100 entries? Try our new Get API&lt;/h3&gt;  &lt;p&gt;The feedback for this feature came from a colleague, who was very happy of the cmdlets until he discovered that he never managed to get result sets with more than 100 elements (he had the need to get MANY MORE). The ACS management API indeed cap their result to 100 elements, but as good OData citizens they also support continuation tokens. In the first release we didn’t handle those hence you were limited to what you get in the first shot to the API. This release does handle continuation tokens. It does so transparently, without surfacing the continuation token itself and forcing you to make multiple calls: we retrieve all the results for you, and if you want to break things down you can use the tools that PowerShell offers (like the classic &lt;font face="Courier New"&gt;| more&lt;/font&gt;).&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="929"&gt;         &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;# retrieve the full list of rules from a RuleGroup&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;&amp;gt; Get-Rule -GroupName $ruleGroup -Namespace $namespace -ManagementKey $managementKey | more&lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&lt;/font&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;h3&gt;Add-, Get- and Remove- cmdlets for SeviceIdentities and ServiceIdentityKeys&lt;/h3&gt;  &lt;p&gt;You asked to be able to handle ServiceIdentity and associated keys: we obliged. Just make sure that you don’t fall in the fallacy of misusing them to use ACS as an identity provider, instead of unleashing its true federation provider potential. &lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="929"&gt;         &lt;p&gt;&lt;font face="Courier New"&gt;&amp;gt; Add-ServiceIdentity -ServiceIdentity &amp;lt;ServiceIdentity&amp;gt;&lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;&amp;gt; Add-ServiceIdentity –Name &amp;lt;String&amp;gt; –Description &amp;lt;string&amp;gt;&lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;&amp;gt; Get-ServiceIdentity [-Name &amp;lt;string&amp;gt;]&lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;&amp;gt; Remove-ServiceIdentity -Name &amp;lt;string&amp;gt;&lt;/font&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;   &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="929"&gt;           &lt;p&gt;&lt;font face="Courier New"&gt;&amp;gt; Add-ServiceIdentityKey -ServiceIdentityKey &amp;lt;ServiceIdentityKey&amp;gt; -ServiceIdentityName &amp;lt;String&amp;gt; &lt;/font&gt;&lt;/p&gt;            &lt;p&gt;&lt;font face="Courier New"&gt;&amp;gt; Add-ServiceIdentityKey -Key &amp;lt;String&amp;gt; [-EffectiveDate &amp;lt;DateTime&amp;gt;] [-ExpirationDate &amp;lt;DateTime&amp;gt;] -ServiceIdentityName &amp;lt;String&amp;gt; [-Name &amp;lt;String&amp;gt;]&lt;/font&gt;&lt;/p&gt;            &lt;p&gt;&lt;font face="Courier New"&gt;&amp;gt; Add-ServiceIdentityKey -Password &amp;lt;String&amp;gt; [-EffectiveDate &amp;lt;DateTime&amp;gt;] [-ExpirationDate &amp;lt;DateTime&amp;gt;] -ServiceIdentityName &amp;lt;String&amp;gt; [-Name &amp;lt;String&amp;gt;]&lt;/font&gt;&lt;/p&gt;            &lt;p&gt;&lt;font face="Courier New"&gt;&amp;gt; Add-ServiceIdentityKey -Certificate &amp;lt;X509Certificate2&amp;gt; -ServiceIdentityName &amp;lt;String&amp;gt; [-Name &amp;lt;String&amp;gt;]&lt;/font&gt;&lt;/p&gt;            &lt;p&gt;&lt;font face="Courier New"&gt;&amp;gt; Get-ServiceIdentityKey [-Id &amp;lt;Int64&amp;gt;] [-ServiceIdentityName &amp;lt;String&amp;gt;]&lt;/font&gt;&lt;/p&gt;            &lt;p&gt;&lt;font face="Courier New"&gt;&amp;gt; Remove-ServiceIdentityKey -Id &amp;lt;Int64&amp;gt;&lt;/font&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;h3&gt;Add- cmdlets now can take an entire object as a parameter&lt;/h3&gt;  &lt;p&gt;We are getting closer to the entrée of this release, and the update discussed here is what makes it at all possible.&lt;/p&gt;  &lt;p&gt;In the former release every Add- cmdlets took the attributes constituting the entity to be created as individual parameters. That worked, especially thanks to the fact that we picked meaningful defaults should the cmdlet be called with some omitted parameter. However it made especially hard to concatenate Add- with other commands, like a Get-, without adding complicated parsing logic that would break down the object coming from Get- in the individual parameters that Add- required. Well, get this: now all the Add- cmdlets accept also entire objects as parameters, making possible some interesting tricks like the one below:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;# retrieve an Identity Provider from one namespace and add it to another one&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;gt; $RP = Get-RelyingParty -Name “Name Here” -MgmtToken $sourceNamespaceToken&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;gt; Add-RelyingParty -RelyingParty $RP -MgmtToken $targetNamespaceToken&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;You see where I am getting at here, right?&lt;/p&gt;  &lt;h3&gt;Backup and restore an ACS namespace&lt;/h3&gt;  &lt;p&gt;Enabling backup and restore was one of the main reasons for which we thought of creating a PowerShell cmdlets sample in the first place: with this release we are finally able to demonstrate that in a reasonably short and easy to read script. &lt;/p&gt;  &lt;p&gt;In the cmdlets installation folder, sub-folder sampleScript/, you’ll find a series of sample scripts which can be used for save, restore or even transfer an entire namespace at once. Let’s play!&amp;#160; Open a PowerShell prompt and navigate to the sampleScript folder. Pick an ACS namespace you like, retrieve the management key and enter something to the effect of&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;.\ExportNamespace.ps1 &amp;quot;myNamespace&amp;quot; &amp;quot;8m+1[.key.]mUE=&amp;quot; &amp;quot;c:\temp\myNamespace.acsns&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;You’ll get the following output:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;Importing AcsManagement Module...     &lt;br /&gt;Getting all the Identity Providers from myNamespace namespace...      &lt;br /&gt;Getting all the Relying Parties from myNamespace namespace...      &lt;br /&gt;Getting all the Rule Groups from myNamespace namespace...      &lt;br /&gt;Getting all the Service Keys from myNamespace namespace...      &lt;br /&gt;Getting all the Service Identities from myNamespace namespace...      &lt;br /&gt;Serializing all the information in myNamespace namespace to the c:\temp\myNamespace.acsns file...&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;Done&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Looks pretty simple! Let’s see what have we got in myNamespace.acsns. The namespace I used is pretty rich, resulting in a 32K file, hence dumping it here would not make a lot of sense. However take a look of the screenshot of the file as shown by XML Notepad:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2475.image_5F00_70566FB3.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5611.image_5F00_thumb_5F00_4190B711.png" width="400" height="544" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Yessirs, that is an XML representation of your namespace! The script that generated this file is surprisingly simple and readable:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;Param($sourceNamespace = &amp;quot;[your namespace]&amp;quot;,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $sourceManagementKey = &amp;quot;[your namespace management key]&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [string]$fileToExport = &amp;quot;[path to output file]&amp;quot;)&amp;#160; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;function Get-ScriptDirectory     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $Invocation = (Get-Variable MyInvocation -Scope 1).Value      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Split-Path $Invocation.MyCommand.Path      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;$scriptDirectory = Get-ScriptDirectory     &lt;br /&gt;Set-Location $scriptDirectory&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;.\AddSnapInAndModule.ps1&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;$sourceToken = Get-AcsManagementToken -Namespace $sourceNamespace -ManagementKey $sourceManagementKey     &lt;br /&gt;$acsNamespaceInfo = New-Object Microsoft.Samples.DPE.ACS.ServiceManagementTools.PowerShell.Model.ServiceNamespace&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;quot;Getting all the Identity Providers from $sourceNamespace namespace...&amp;quot;     &lt;br /&gt;$acsNamespaceInfo.IdentityProviders = Get-IdentityProvider -MgmtToken $sourceToken&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;quot;Getting all the Relying Parties from $sourceNamespace namespace...&amp;quot;     &lt;br /&gt;$acsNamespaceInfo.RelyingParties = @()      &lt;br /&gt;foreach ($s in Get-RelyingParty -MgmtToken $sourceToken)      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $acsNamespaceInfo.RelyingParties += @(Get-RelyingParty -MgmtToken $sourceToken -Name $s.Name)      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;quot;Getting all the Rule Groups from $sourceNamespace namespace...&amp;quot;     &lt;br /&gt;$acsNamespaceInfo.RuleGroups = @()      &lt;br /&gt;foreach ($s in Get-RuleGroup -MgmtToken $sourceToken)      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $acsNamespaceInfo.RuleGroups += @(Get-RuleGroup -MgmtToken $sourceToken -Name $s.Name)      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;quot;Getting all the Service Keys from $sourceNamespace namespace...&amp;quot;     &lt;br /&gt;$acsNamespaceInfo.ServiceKeys = Get-ServiceKey -MgmtToken $sourceToken&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;quot;Getting all the Service Identities from $sourceNamespace namespace...&amp;quot;     &lt;br /&gt;$acsNamespaceInfo.ServiceIdentities = Get-ServiceIdentity -MgmtToken $sourceToken&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;quot;Serializing all the information in $sourceNamespace namespace to the $fileToExport file...&amp;quot;     &lt;br /&gt;if (! [System.IO.Path]::IsPathRooted(&amp;quot;$fileToExport&amp;quot;))      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $fileToExport = Join-Path &amp;quot;$scriptDirectory&amp;quot; &amp;quot;$fileToExport&amp;quot;      &lt;br /&gt;}      &lt;br /&gt;$acsNamespaceInfo.Serialize($fileToExport)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;quot;&amp;quot;     &lt;br /&gt;&amp;quot;Done&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;In fact, there is nothing difficult about the above script: it’s more or less the same foreach applied in turn to IPs, RPs, rule groups &amp;amp; rules, service identities and keys.   &lt;br /&gt;Now that you have all your namespace in file you can restore it in its entirety via ImportNamespace.ps1. In fact, nothing prevents you from applying those settings even to a different ACS namespace! The CloneNamespace.ps1 demonstrates exactly that scenario.&lt;/p&gt;    &lt;p&gt;Well, that’s it! &lt;a href="http://bit.ly/llnWl7"&gt;Play with the cmdlets&lt;/a&gt; and let us know what you like, what you dislike and what you’d like to see: I’ll make sure to pass the feedback appropriately. As you know by now, I moved to the product team I won’t be driving the next release of the ACS cmdlets; in fact, without the kind help of &lt;a href="http://www.wadewegner.com/"&gt;Wade&lt;/a&gt; who took care of some last minute logistic details even this release would not have been in your hands now: thanks &lt;a href="http://www.wadewegner.com/"&gt;Wade&lt;/a&gt;!&lt;/p&gt;  &lt;p&gt;&lt;em&gt;And since we are on the thanks section, I wanted to take this chance to express my gratitude to the good folks at &lt;a href="http://www.southworks.net/"&gt;Southworks&lt;/a&gt;, with whom I worked very closely for the last few years, and to whom I owe my current caramel addiction (dulche de leche, to be precise). From the first identity training kits to the monumental work in FabrikamShipping SaaS, going through the identity labs in the windows azure platform training kit, keynote demos and occasional projects, the partnership with &lt;strong&gt;Tim, Matias, Lito, Johnny, PC, Iaco (signor Iacomuzzi!), Ariel, Nahuel, Diego, Fernando, Mariano, Nicholas, the “other Matias”&lt;/strong&gt; and many others (sorry guys for not remembering all the names!) has been invaluable. You are probably not going to miss my OCS-grade nitpicking and inflexible quasi-religious ideas about how claims based identity should be messaged, but I will miss your professionalism, flexibility, exceptional work ethic, will to burn the midnight oil (remember that night in which the fire alarm rang in B18 (or was B24?) and when we came out we were practically the only ones in the place?) and especially all the common ground we built over the years. Best of luck you guys! &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5618.wlEmoticon_2D00_smile_5F00_404C1E32.png" /&gt;&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10185452" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Personal/">Personal</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/WIF/">WIF</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ACS/">ACS</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/PowerShell/">PowerShell</category></item><item><title>Ch-ch-ch-changes</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/07/10/ch-ch-ch-changes.aspx</link><pubDate>Mon, 11 Jul 2011 06:55:52 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10185093</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10185093</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/07/10/ch-ch-ch-changes.aspx#comments</comments><description>&lt;p&gt;[&lt;a href="http://blogs.kuppingercole.com/kearns/"&gt;Dave&lt;/a&gt;, forgive me for lifting &lt;a href="http://www.networkworld.com/newsletters/dir/2011/053011id2.html"&gt;your headline&lt;/a&gt; &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5852.wlEmoticon_2D00_smile_5F00_264A84F1.png" /&gt; it’s just too good a fit for the occasion]&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2816.chchchanges_5F00_7A99BAF4.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="chchchanges" border="0" alt="chchchanges" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2235.chchchanges_5F00_thumb_5F00_79C1550A.png" width="300" height="292" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As anticipated during a &lt;a href="http://bit.ly/iMovxN"&gt;recent CloudCover episode&lt;/a&gt;, &lt;strong&gt;tomorrow it’s going to be my first day as Principal Program Manager in the identity product team&lt;/strong&gt;. I’ll be looking after the developer experience for our identity products on premises and in the cloud. My office is being moved from Building 24 to the Redwest campus, I won’t have a place to put stuff down until Tuesday, and yet I am excited as a kid the day before school.&lt;/p&gt;  &lt;p&gt;Claims based identity has been my passion for the last few years, or at least the one passion I have I could talk about in public: and talked about it I have, at literally hundreds of events big and small, in form of samples, hands-on labs, whitepapers, articles, videos, books; to customers, partners, students, colleagues, journalists and anybody who would care (or pretend) to listen. In the years in which I have been the identity evangelist, claims-based identity has gone from arcane code samples that few brave would would dare picking up to a fully mainstream technology, recognized by everybody and used by many, with the shift to the cloud providing even further acceleration. I am not taking any credit for it, mind you &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5852.wlEmoticon_2D00_smile_5F00_264A84F1.png" /&gt; just stating some facts. &lt;/p&gt;  &lt;p&gt;The point is that I believe we are now at the stage in which &lt;strong&gt;the claims-based identity meme is self-sustaining&lt;/strong&gt;, we’ve been there for some time already. There is still the need to evangelize it, but in my opinion that is largely due to the fact that claims-based identity has not sank deep enough yet in the iso-osi stack or in our dev tools to be simply used without conscious effort. Joining the engineering team is my best chance to contribute to that transition. The identity team overflows with incredibly talented people, many of whom I already had the pleasure to work with through the years: joining them is an honor and a privilege I’ll work hard to deserve.&lt;/p&gt;  &lt;p&gt;As much as I’m excited to jump on this new adventure, I cannot help but feel a sting of sadness in leading the Evangelism group. Through the 6 years I’ve been working there, I’ve received nothing but trust in me and my ideas, and empowerment to put them in practice. I have learned a ton and grew really a lot: who would have thought that I went from being incomprehensible to nearly everyone to get #2 spot among the PDC10 speakers, #6 at TechEd EU 10, deliver keynotes in fronts of thousands, and many other great personal satisfactions I would have never thought within my reach? If you would have told me back in 2005, when I moved to the US, I would have told you you are nuts &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5852.wlEmoticon_2D00_smile_5F00_264A84F1.png" /&gt;&amp;#160; &lt;br /&gt;I am convinced this is largely thanks to my immediate team: I’ve been lucky to share meeting room and backstages with a long series of peers and leaders, many of whom I now call friends. Thank you guys, I have learned so much from all of you!&lt;/p&gt;  &lt;p&gt;What does this change mean to you, my loyal reader? At least at first, not much. I was focused on identity, developers and the cloud, and that’s what I will be keep focusing on. I’ll keep showing up at events, albeit considerably less often (goodbye, Diamond status with Delta!).&amp;#160; &lt;br /&gt;There is a pipeline of deliverables I contributed to, which will progressively surface during the next few weeks as part of the output of the Windows Azure Evangelism Team: I’ll blog about it, as usual.     &lt;br /&gt;After that, you’ll likely no longer see posts on big samples (a’ la FabrikamShipping or Umbraco integration). Most of my energies will go directly in the product (tools, SDK samples, etc), hence that’s what I’ll talk about (when the time is right, of course). I will also come back to some of the more abstract posts I was used to write few years back, and I will ask much more often for your input!&lt;/p&gt;  &lt;p&gt;In fact, I want to start RIGHT NOW. &lt;a href="http://bit.ly/pShYhP"&gt;Here there’s a short survey on WIF and ACS&lt;/a&gt;, which I’ve been circulating with some MVPs and would like to open to everyone now. This is your chance to let us know what we need to improve: take advantage of it, while my enthusiasm for new challenges is at its peak! &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5852.wlEmoticon_2D00_smile_5F00_264A84F1.png" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10185093" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Personal/">Personal</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Identity/">Identity</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/WIF/">WIF</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ACS/">ACS</category></item><item><title>Cloud Identity Summit: Come to Our Workshop!</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/06/27/cloud-identity-summit-come-to-our-workshop.aspx</link><pubDate>Mon, 27 Jun 2011 08:24:34 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10179303</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10179303</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/06/27/cloud-identity-summit-come-to-our-workshop.aspx#comments</comments><description>&lt;a title="Rocky Mountains by Skinned Mink, on Flickr" href="http://www.flickr.com/photos/21148821@N02/3398180641/"&gt;&lt;img style="background-image: none; 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="Rocky Mountains" src="http://farm4.static.flickr.com/3540/3398180641_d143e5592a.jpg" width="240" height="160" /&gt;     &lt;br /&gt;&lt;em&gt;&lt;font size="1"&gt;Photo: &lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;a href="http://www.flickr.com/photos/21148821@N02/"&gt;&lt;em&gt;&lt;font size="1"&gt;Skinned Mink&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;/a&gt;   &lt;p&gt;In just about three weeks the who’s who of identity in the cloud is going to converge to &lt;a href="http://www.cloudidentitysummit.com/travel/Overview.cfm"&gt;Keystone, in the beautiful Rocky Mountains&lt;/a&gt;, to talk each other into identity-induced stupor. The &lt;a href="http://www.cloudidentitysummit.com/"&gt;Cloud Identity Summit&lt;/a&gt;, hosted by our friends at &lt;a href="http://pingidentity.com/"&gt;Ping Identity&lt;/a&gt;, is an event that I greatly enjoyed last year: and judging from the speakers lineup, this year holds great promises as well! &lt;/p&gt;  &lt;p&gt;For the occasion, the egregious&lt;sup&gt;1&lt;/sup&gt; &lt;a href="http://imav8n.wordpress.com/"&gt;Brian Puhl&lt;/a&gt;, the formidable &lt;a href="http://www.shutuplaura.com/"&gt;Laura Hunter&lt;/a&gt; and (the …hairy?) &lt;a href="http://bit.ly/lYWZBR"&gt;yours truly&lt;/a&gt; will fight (for three full hours!) that mysterious force that seems to keep IT administrators and developers apart, and will share a stage to tell you about identity in Windows Azure and Office 365. Here there’s the abstract:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Tuesday, July 19, 2011 - &lt;/strong&gt;&lt;strong&gt;9am to 12pm&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;h4&gt;&lt;strong&gt;Identity in the Microsoft Cloud - Windows Azure, Office 365, and More!&lt;/strong&gt;&lt;/h4&gt;    &lt;p&gt;&lt;em&gt;In this unique workshop, come and hear about adopting and implementing the Microsoft Cloud from seasoned identity professionals who have been working with these technologies first-hand from Day One. We’ll begin with an overview and description of the technologies that allow an Identity Management professional to interact with both Windows Azure and Office 365. We’ll then walk through a real-life example of integrating Microsoft Cloud technologies from the perspective of both the application developer and the infrastructure architect. Along the way, we’ll share best practices and tales from the trenches from customers, partners, and Microsoft’s own Evangelists and internal Identity Management Architects.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now, let me tell you for a moment about Brian and Laura’s work on this. Microsoft IT has been using ADFS2.0 not from Day One, but like from Day –360 &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6574.wlEmoticon_2D00_smile_5F00_430E4737.png" /&gt; Our Corp STS has been a critical service for our worldwide organization for a pretty long time, and is quite a spectacular deployment across geographies (for a snapshot from more than 1 year ago check out &lt;a href="http://bit.ly/m6PyyY"&gt;this video&lt;/a&gt;). Among other things, this was a fantastic enabler for us to take advantage of cloud services in our LoB applications at a spectacular pace: but this also meant really a lot of work for Brian’s team, who had to experiment with different policies/practices and really see what works. Brian and Laura are going to share some gems you won’t hear from anyone else.&lt;/p&gt;  &lt;p&gt;About the developer’s portion of the workshop… well, I’ll refrain from chest-beating (at my shape/age, that would not be a good sight anyway). Let’s just say that I’ve been talking &amp;amp; writing about identity for developers for &lt;a href="http://bit.ly/dMD6DJ"&gt;quite some time&lt;/a&gt;, and I hope you’ll find at least some insights in my logorrhea.&lt;/p&gt;  &lt;p&gt;If the above was not enough to convince you to come, I don’t know what else to do… oh wait, I do!    &lt;br /&gt;&lt;font color="#ff0000"&gt;For the first 15 people that will register using the code &lt;b&gt;&lt;u&gt;MSFT719%15&lt;/u&gt;&lt;/b&gt;, our workshop is free.&lt;/font&gt; Pretty neat trick.&lt;/p&gt;  &lt;p&gt;Well, &lt;a href="http://bit.ly/msocMf"&gt;I registered&lt;/a&gt; and booked the flights &amp;amp; the hotel, I just have to rent the car at this point. If you want to partake to the intellectual feast of sharing a table with the likes of Gunnar Peterson, John Shewchuk, Bob Blakley, Eric Sachs, Andrew Nash and many others… &lt;a href="http://bit.ly/msocMf"&gt;you know what to do&lt;/a&gt; &lt;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.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5001.wlEmoticon_2D00_winkingsmile_5F00_6250EE0A.png" /&gt; - see you there!&lt;/p&gt;  &lt;p&gt;-----------------------   &lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;In Italian the term “egregio” means “excellent”. I am told that in English “egregious” can mean that as well, but the default meaning is less flattering. Of course I meant it in its “excellent” meaning &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6574.wlEmoticon_2D00_smile_5F00_430E4737.png" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10179303" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Identity/">Identity</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/the+Cloud/">the Cloud</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Events/">Events</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Identity+Foundation/">Windows Identity Foundation</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/WIF/">WIF</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ADFS/">ADFS</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Azure/">Windows Azure</category></item><item><title>Powerscripting Podcast: ACS, Windows Azure and… PowerShell</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/06/13/powerscripting-podcast-acs-windows-azure-and-powershell.aspx</link><pubDate>Tue, 14 Jun 2011 06:27:33 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10174200</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10174200</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/06/13/powerscripting-podcast-acs-windows-azure-and-powershell.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1777.powerscripting_5F00_243A0242.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="powerscripting" border="0" alt="powerscripting" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8117.powerscripting_5F00_thumb_5F00_43107620.png" width="240" height="209" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Last week I had the pleasure of being guest on &lt;a href="http://bit.ly/kK4Jqk"&gt;the PowerScripting podcast&lt;/a&gt;, THE show about PowerShell. That’s actually pretty uncharacteristic for me, considering that at every session I deliver at TechEd I spend the first few minutes on colorful disclaimers about the session being for developers, as opposed to IT administrator… however both the hosts (&lt;a href="http://halr9000.com/"&gt;Hal&lt;/a&gt; &amp;amp; &lt;a href="http://twitter.com/jonwalz"&gt;Jonathan&lt;/a&gt;) and the guys in chat were simply awesome and made me feel perfectly at home!&lt;/p&gt;  &lt;p&gt;You can find the recording &lt;a href="http://bit.ly/kK4Jqk"&gt;here&lt;/a&gt;. What did we chat about? Well, when I finally managed to stop speaking about myself we went through Windows Azure &amp;amp; PaaS, the idea of claims based identity, WIF &amp;amp; ACS, and finally on &lt;a href="http://bit.ly/kF9ksY"&gt;the Windows Azure and ACS cmdlets we released on Codeplex&lt;/a&gt;. I got a lot of encouragement, you guys seem to like those really a lot, and I also got a ton of useful feedback (“plurals? really? Snapins instead of modules? REALLY?” - Guys, what do I know, I am a dev &lt;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.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8130.wlEmoticon_2D00_winkingsmile_5F00_29A872E6.png" /&gt;) that we are already working into the planning.&lt;/p&gt;  &lt;p&gt;If you are an IT administrator, &lt;a href="http://bit.ly/acssurvey"&gt;I would be super grateful if you could take a quick look at a simple 4-questions survey&lt;/a&gt;: that will be of immense help for prioritizing our next wave of releases, and will give you the chance to be heard &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2766.wlEmoticon_2D00_smile_5F00_3B8506B3.png" /&gt;&lt;/p&gt;  &lt;p&gt;Thanks &lt;a href="http://halr9000.com/"&gt;Hal&lt;/a&gt; &amp;amp; &lt;a href="http://twitter.com/jonwalz"&gt;Jonathan&lt;/a&gt; for having me on your great show!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10174200" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Identity/">Identity</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/WIF/">WIF</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Azure/">Windows Azure</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Access+Control+Service/">Access Control Service</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ACS/">ACS</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/PowerShell/">PowerShell</category></item><item><title>Edit and Apply New WIF’s Config Settings in Your Windows Azure WebRole… Without Redeploying!</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/05/31/edit-and-apply-new-wif-s-config-settings-in-your-windows-azure-webrole-without-redeploying.aspx</link><pubDate>Tue, 31 May 2011 08:30:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10169814</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10169814</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/05/31/edit-and-apply-new-wif-s-config-settings-in-your-windows-azure-webrole-without-redeploying.aspx#comments</comments><description>&lt;p&gt;In short: in this post I will show you how you can leverage the OnStart event of a WebRole to enable changing the WIF config settings even after deployment.&lt;/p&gt;  &lt;p&gt;Since the very first time &lt;a href="http://dynamic-cast.com/"&gt;Hervey&lt;/a&gt; and I made &lt;a href="http://bit.ly/iwVN6Q"&gt;the first foray&lt;/a&gt; in Windows Azure with WIF, all the way to the latest &lt;a href="http://msdn.microsoft.com/en-us/identitytrainingcourse_identityandazure_unit"&gt;hands-on labs&lt;/a&gt;, &lt;a href="http://www.amazon.com/gp/product/0735627185?ie=UTF8&amp;amp;tag=wwwcloudident-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0735627185"&gt;books&lt;/a&gt; and &lt;a href="http://bit.ly/eKDgsf"&gt;whitepapers&lt;/a&gt;, one of the main challenges of using WIF in a WebRole has always been the impossibility of updating the settings in &lt;font face="Courier New"&gt;&lt;strong&gt;&amp;lt;microsoft.identityModel&amp;gt;&lt;/strong&gt;&lt;/font&gt; without redeploying (or preparing in advance for a pool of alternative &lt;strong&gt;&lt;font face="Courier New"&gt;&amp;lt;service&amp;gt;&lt;/font&gt;&lt;/strong&gt; elements fully known at deployment time).&lt;/p&gt;  &lt;p&gt;Last Friday I was chatting with &lt;a href="http://www.wadewegner.com/"&gt;Wade&lt;/a&gt; about how to solve this very problem for some future deliverables in the &lt;a href="http://watoolkitwp7.codeplex.com/documentation"&gt;toolkit&lt;/a&gt;, and it just came to me: why don’t we just leverage the WebRole lifecycle and use &lt;font face="Courier New"&gt;&lt;strong&gt;OnStart&lt;/strong&gt;&lt;/font&gt; for setting the values we want &lt;em&gt;even before WIF reads the web.config&lt;/em&gt;? All we need to do is create suitable &amp;lt;setting&amp;gt; entries in the ServiceConfiguration.cfg file, which can be modified without the need to redeploy, and use the events in WebRole.cs to ensure that our apps picks up the new values. Simple!&lt;/p&gt;  &lt;p&gt;I created a new WebRole, hooked it to a local &lt;a href="http://bit.ly/b79GSz"&gt;SelfSTS&lt;/a&gt;, and started playing with &lt;strong&gt;ServiceDefinition.csdef&lt;/strong&gt;, &lt;strong&gt;ServiceConfiguration.cscfg &lt;/strong&gt;and &lt;strong&gt;WebRole.cs&lt;/strong&gt;. I just wanted to make sure the idea works, hence I didn’t pour much care in writing clean (or exhausting) code. Also, I totally ignored all the considerations about HTTPS, NLB session management and all those other things you learned you need to do in WIndows Azure. None of those really interferes with the approach, hence for the sake of simplicity I left them all out.&lt;/p&gt;  &lt;p&gt;First, I created &amp;lt;Setting&amp;gt; entries&amp;#160; in the .csdef for every WIF config parameter generated by the Add STS Reference you’d likely want to control:&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; height: 268px; max-height: 300px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #800000"&gt;xml&lt;/span&gt; &lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;encoding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt;?&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ServiceDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;WindowsAzureProject5&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;WebRole&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;WebRole1&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Runtime&lt;/span&gt; &lt;span style="color: #ff0000"&gt;executionContext&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;elevated&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #008000"&gt;&amp;lt;!--... stuff--&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ConfigurationSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;audienceUri&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;issuer&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;realm&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;trustedIssuersThumbprint&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;trustedIssuerName&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ConfigurationSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;WebRole&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ServiceDefinition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Yes, yes, having settings just for one issuer in the trusted issuers registry is not especially elegant; and adding a homeRealm would probably be useful. Some other time. 
  &lt;br /&gt;The important thing to notice here is the &lt;strong&gt;&lt;font face="Courier New"&gt;&amp;lt;Runtime executionContext=elevated” /&amp;gt;&lt;/font&gt;&lt;/strong&gt;. Without that, you won’t be able to save the modifications to the Web.Config.&lt;/p&gt;

&lt;p&gt;Then I added the same settings in the .cscfg, leaving all the values empty (for now).&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 300px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #800000"&gt;xml&lt;/span&gt; &lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;encoding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt;?&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ServiceConfiguration&lt;/span&gt; &lt;span style="color: #ff0000"&gt;serviceName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;WindowsAzureProject5&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;osFamily&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;osVersion&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Role&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;WebRole1&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Instances&lt;/span&gt; &lt;span style="color: #ff0000"&gt;count&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ConfigurationSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;UseDevelopmentStorage=true&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;audienceUri&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;issuer&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;realm&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;trustedIssuersThumbprint&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;trustedIssuerName&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;&amp;lt;!--...stuff--&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ConfigurationSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #008000"&gt;&amp;lt;!--...stuff--&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Role&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ServiceConfiguration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Very straightforward. Then I went ahead and added to WebRole.cs&amp;#160; the code below: &lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 700px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; WebRole1&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; WebRole : RoleEntryPoint&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; OnStart()&lt;br /&gt;        {&lt;br /&gt;            RoleEnvironment.Changing += RoleEnvironmentChanging;&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (var server = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ServerManager())&lt;br /&gt;                {&lt;br /&gt;                    var siteNameFromServiceModel = &lt;span style="color: #006080"&gt;&amp;quot;Web&amp;quot;&lt;/span&gt;;&lt;br /&gt;                    var siteName =&lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;&amp;quot;{0}_{1}&amp;quot;&lt;/span&gt;, RoleEnvironment.CurrentRoleInstance.Id, siteNameFromServiceModel);&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; configFilePath = server.Sites[siteName].Applications[0].VirtualDirectories[0].PhysicalPath + &lt;span style="color: #006080"&gt;&amp;quot;\\Web.config&amp;quot;&lt;/span&gt;;&lt;br /&gt;                    XElement element = XElement.Load(configFilePath);&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; strSetting;&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!(String.IsNullOrEmpty(strSetting = RoleEnvironment.GetConfigurationSettingValue(&lt;span style="color: #006080"&gt;&amp;quot;audienceUri&amp;quot;&lt;/span&gt;))))&lt;br /&gt;                        element.Element(&lt;span style="color: #006080"&gt;&amp;quot;microsoft.identityModel&amp;quot;&lt;/span&gt;).Element(&lt;span style="color: #006080"&gt;&amp;quot;service&amp;quot;&lt;/span&gt;).Element(&lt;span style="color: #006080"&gt;&amp;quot;audienceUris&amp;quot;&lt;/span&gt;).Element(&lt;span style="color: #006080"&gt;&amp;quot;add&amp;quot;&lt;/span&gt;).Attribute(&lt;span style="color: #006080"&gt;&amp;quot;value&amp;quot;&lt;/span&gt;).Value = strSetting;&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!(String.IsNullOrEmpty(strSetting = RoleEnvironment.GetConfigurationSettingValue(&lt;span style="color: #006080"&gt;&amp;quot;issuer&amp;quot;&lt;/span&gt;))))&lt;br /&gt;                        element.Element(&lt;span style="color: #006080"&gt;&amp;quot;microsoft.identityModel&amp;quot;&lt;/span&gt;).Element(&lt;span style="color: #006080"&gt;&amp;quot;service&amp;quot;&lt;/span&gt;).Element(&lt;span style="color: #006080"&gt;&amp;quot;federatedAuthentication&amp;quot;&lt;/span&gt;).Element(&lt;span style="color: #006080"&gt;&amp;quot;wsFederation&amp;quot;&lt;/span&gt;).Attribute(&lt;span style="color: #006080"&gt;&amp;quot;issuer&amp;quot;&lt;/span&gt;).Value = strSetting;&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!(String.IsNullOrEmpty(strSetting = RoleEnvironment.GetConfigurationSettingValue(&lt;span style="color: #006080"&gt;&amp;quot;realm&amp;quot;&lt;/span&gt;))))&lt;br /&gt;                        element.Element(&lt;span style="color: #006080"&gt;&amp;quot;microsoft.identityModel&amp;quot;&lt;/span&gt;).Element(&lt;span style="color: #006080"&gt;&amp;quot;service&amp;quot;&lt;/span&gt;).Element(&lt;span style="color: #006080"&gt;&amp;quot;federatedAuthentication&amp;quot;&lt;/span&gt;).Element(&lt;span style="color: #006080"&gt;&amp;quot;wsFederation&amp;quot;&lt;/span&gt;).Attribute(&lt;span style="color: #006080"&gt;&amp;quot;realm&amp;quot;&lt;/span&gt;).Value = strSetting;&lt;br /&gt;                   &lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!(String.IsNullOrEmpty(strSetting = RoleEnvironment.GetConfigurationSettingValue(&lt;span style="color: #006080"&gt;&amp;quot;trustedIssuersThumbprint&amp;quot;&lt;/span&gt;))))&lt;br /&gt;                        element.Element(&lt;span style="color: #006080"&gt;&amp;quot;microsoft.identityModel&amp;quot;&lt;/span&gt;).Element(&lt;span style="color: #006080"&gt;&amp;quot;service&amp;quot;&lt;/span&gt;).Element(&lt;span style="color: #006080"&gt;&amp;quot;issuerNameRegistry&amp;quot;&lt;/span&gt;).Element(&lt;span style="color: #006080"&gt;&amp;quot;trustedIssuers&amp;quot;&lt;/span&gt;).Element(&lt;span style="color: #006080"&gt;&amp;quot;add&amp;quot;&lt;/span&gt;).Attribute(&lt;span style="color: #006080"&gt;&amp;quot;thumbprint&amp;quot;&lt;/span&gt;).Value = strSetting;&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!(String.IsNullOrEmpty(strSetting = RoleEnvironment.GetConfigurationSettingValue(&lt;span style="color: #006080"&gt;&amp;quot;trustedIssuerName&amp;quot;&lt;/span&gt;))))&lt;br /&gt;                        element.Element(&lt;span style="color: #006080"&gt;&amp;quot;microsoft.identityModel&amp;quot;&lt;/span&gt;).Element(&lt;span style="color: #006080"&gt;&amp;quot;service&amp;quot;&lt;/span&gt;).Element(&lt;span style="color: #006080"&gt;&amp;quot;issuerNameRegistry&amp;quot;&lt;/span&gt;).Element(&lt;span style="color: #006080"&gt;&amp;quot;trustedIssuers&amp;quot;&lt;/span&gt;).Element(&lt;span style="color: #006080"&gt;&amp;quot;add&amp;quot;&lt;/span&gt;).Attribute(&lt;span style="color: #006080"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;).Value = strSetting;&lt;br /&gt;&lt;br /&gt;                    element.Save(configFilePath);&lt;br /&gt;                }&lt;br /&gt;           &lt;br /&gt;                            &lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.OnStart();&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; RoleEnvironmentChanging(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, RoleEnvironmentChangingEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            e.Cancel = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Let’s look at what happens in the using block first. If you want to read good writeups on this technique I suggest &lt;a href="http://msdn.microsoft.com/en-us/library/gg494983.aspx"&gt;this msdn entry&lt;/a&gt; or &lt;a href="http://blog.bareweb.eu/2011/05/azure-howto-programmatically-modify-web-config-on-webrole-startup/"&gt;this really nice entry from Andy Cross&lt;/a&gt;.

  &lt;br /&gt;When OnStart runs, the WebRole application itself didn’t have a chance to do anything yet. What I want to do here is getting my hands on the web.config file, override the WIF settings with all the non-empty values I find in ServiceConfiguration.cscfg and save back the file even before WIF gets to read &amp;lt;microsoft.identityModel&amp;gt;.

  &lt;br /&gt;What I do above with Linq to XML for modifying the WIF settings is pretty dirty, very brittle and definitely tied to the assumption that the config we’ll be working with is the one that comes out from a typical Add STS Reference run. I tried to use ConfigurationManager at first, but it complained that &amp;lt;microsoft.identityModel&amp;gt; has no schema hence I just went the quicker, easier, more seductive “let’s just see if it works”. But remember, for the one among you who caught the reference: the dark side is not stronger. No no no.

  &lt;br /&gt;Aaanyway. The &lt;font face="Courier New"&gt;&lt;strong&gt;element.Save(configFilePath) &lt;/strong&gt;&lt;/font&gt;is the line that will fail if you forgot to add the elevated directive in the csdef, you’re warned.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;RoleEnvironmentChanging&lt;/strong&gt; handler hookup at the beginning of OnStart, and the handler itself, are meant to ensure that when you change the values in ServiceConfiguration.cscfg Windows Azure will properly restart the role. If you don’t add that, just changing the config will not drive changes in the WebRole behavior until a stop &amp;amp; restart occurs. Technically there are few things you may try to do to get WIF to pick up the new settings at mid flight, but all those would entail changing the application code and that’s exactly what I am trying to avoid with all this brouhaha.

  &lt;br /&gt;BTW, you can thank &lt;a href="http://www.nickharris.net/"&gt;Nick Harris&lt;/a&gt; for the &lt;font face="Courier New"&gt;&lt;strong&gt;RoleEnvironment.Changing&lt;/strong&gt;&lt;/font&gt; trick&lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3817.wlEmoticon_2D00_smile_5F00_400ADCAE.png" /&gt;

  &lt;br /&gt;Nick just joined the Windows Azure Evangelism team and he is already doing an awesome job.&lt;/p&gt;

&lt;p&gt;That should be all. Now, try to ignore the impulse that would make you change the config before deploying, and publish the project in Windows Azure staging “as is”.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3731.image_5F00_0A921A89.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7522.image_5F00_thumb_5F00_70BDE459.png" width="404" height="223" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In few mins the instance is up and running, listening at a nice (and totally unpredictable) URL &lt;a href="http://eddb883659d04d0bbbb570f17c52ea01.cloudapp.net"&gt;http://eddb883659d04d0bbbb570f17c52ea01.cloudapp.net&lt;/a&gt;. What do you think will happen if I just navigate there?&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8524.image_5F00_693274EC.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4810.image_5F00_thumb_5F00_2FAF64F5.png" width="400" height="319" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s right. WIF is still configured for the address the application had in the environment formerly known as devfabric (now Windows Azure simulation environment), as described in the realm entry, hence SelfSTS (which behaves like the WIF STS template if there’s no wreply in the signin message) sends the token back there instead of &lt;a href="http://eddb883659d04d0bbbb570f17c52ea01.cloudapp.net"&gt;http://eddb883659d04d0bbbb570f17c52ea01.cloudapp.net&lt;/a&gt;. Normally we’d be pretty stuck at this point, but thanks to the modification we made we can fix the situation.&lt;/p&gt;

&lt;p&gt;All you need to do is navigating to the Windows Azure portal, select the deployment and hit the Configure button.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4478.image_5F00_762C54FD.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6471.image_5F00_thumb_5F00_27B7C293.png" width="400" height="261" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here you can pick the Edit current configuration option to update the values inline. In this case, all you need to do is pasting &lt;a href="http://eddb883659d04d0bbbb570f17c52ea01.cloudapp.net"&gt;http://eddb883659d04d0bbbb570f17c52ea01.cloudapp.net&lt;/a&gt; in the audienceUri and realm settings, and hit OK.&lt;/p&gt;





&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4885.image_5F00_0326350F.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8524.image_5F00_thumb_5F00_66A9432E.png" width="400" height="316" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You’ll see the portal updating the instance for few moments. As soon as it reports the role as ready, navigate to its URL and, surprise surprise, this time the authentication flow ends up in the right place! In the screenshot below you can see (thanks to the SecurityTokenVisualizerControl, which you can find in all the latest ACS labs in the &lt;a href="http://go.microsoft.com/fwlink/?LinkId=148795"&gt;identity training kit&lt;/a&gt;) that the audienceURI has been changed as well.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4403.image_5F00_01E19C30.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2251.image_5F00_thumb_5F00_0C32C090.png" width="400" height="359" /&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;I think that’s pretty cool &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3817.wlEmoticon_2D00_smile_5F00_400ADCAE.png" /&gt;&lt;/p&gt;

&lt;p&gt;Now, you may argue that this scenario is an artifact of how the WIF STS template handles things, and if you would have ben dealing with an STS (like ACS) which keeps realm and return URLs well separated you could have solved the matter at the STS side. All true, but beside the point.
  &lt;br /&gt;Here I used the staging &amp;amp; realm example because with its unknowable-until-it’s-too-late GUID in the URL it is (was?) the paradigmatic example of what can be challenging when using WIF with Windows Azure; but of course you can use the technique you saw here for pushing out &lt;em&gt;any&lt;/em&gt; post-deployment changes, including pointing the WebRole to a different STS, updating certificate thumbprints as keys rollover takes place or any other setting you may want to modify.&lt;/p&gt;

&lt;p&gt;Please use this technique with caution. I haven’t used extensively yet hence I am not 100% sure if there are gotchas just waiting to be found, but so far it seems to be solving the problem pretty nicely &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3817.wlEmoticon_2D00_smile_5F00_400ADCAE.png" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10169814" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Identity+Foundation/">Windows Identity Foundation</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/WIF/">WIF</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Azure/">Windows Azure</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Access+Control+Service/">Access Control Service</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ACS/">ACS</category></item><item><title>Storing Encrypted Tokens with the Windows Phone Developer Tools 7.1</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/05/25/storing-encrypted-tokens-with-the-windows-phone-developer-tools-7-1.aspx</link><pubDate>Wed, 25 May 2011 23:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10168447</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10168447</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/05/25/storing-encrypted-tokens-with-the-windows-phone-developer-tools-7-1.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7827.MangoTokens_5F00_183CEA4F.png"&gt;&lt;img height="193" width="240" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5344.MangoTokens_5F00_thumb_5F00_40F84F98.png" alt="MangoTokens" border="0" title="MangoTokens" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you went through &lt;a href="http://msdn.microsoft.com/en-us/identitytrainingcourse_acsandwindowsphone7_topic2#_Toc290300273"&gt;the hands on lab for using ACS on your Windows Phone 7 application&lt;/a&gt;, you already know that saving the user the hassle to re-authenticate all the times entails a security tradeoff. Here there&amp;rsquo;s what I wrote in the lab&amp;rsquo;s instructions:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Saving a token on the phone&amp;rsquo;s storage is not very secure. The isolated storage may prevent other applications from stealing the persisted token, but it does not prevent somebody with physical access to the device to eventually get to it. Any form of encryption would not solve the issue if the decryption key resides on the phone, no matter how well it is hidden. You could require the user to enter a PIN at every application run, and use the PIN to decrypt the token, however the approach presents obvious usability and user acceptance challenges. &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;While we wait for a better solution to emerge, it may be of some consolation considering that saving token is much better than saving direct credentials such as a username/password pair. A token is typically scoped to be used just with a specific service, and it has an expiration time: this somewhat limits what an attacker can do with a token, whereas no such restrictions would be present should somebody acquire username and password.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Well, guess what: a better solution &lt;em&gt;is &lt;/em&gt;emerging, and as of yesterday you can get a sneak peek of it with the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=77586864-ab15-40e1-bc38-713a95a56a05"&gt;Windows Phone Developer Tools 7.1&lt;/a&gt; &lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3201.wlEmoticon_2D00_smile_5F00_2EAF88D6.png" alt="Smile" class="wlEmoticon wlEmoticon-smile" style="border-style: none;" /&gt;&lt;/p&gt;
&lt;p&gt;The solutions happens to be very simple, too: in a nutshell, it consists in making DPAPI available on the device. &lt;br /&gt;In &amp;ldquo;Mango&amp;rdquo; you have access to &lt;span style="font-family: Courier New;"&gt;&lt;strong&gt;ProtectedData&lt;/strong&gt;&lt;/span&gt;, which you may recognize as the class that provides you access to DPAPI for encrypting and decrypting data via static methods &lt;span style="font-family: Courier New;"&gt;&lt;strong&gt;Protect&lt;/strong&gt;&lt;/span&gt; and &lt;span style="font-family: Courier New;"&gt;&lt;strong&gt;Unprotect&lt;/strong&gt;&lt;/span&gt;. &lt;br /&gt;The &lt;strong&gt;&lt;span style="font-family: Courier New;"&gt;ProtectedData&lt;/span&gt;&lt;/strong&gt; class available on the device differs from the one in &amp;ldquo;big .NET&amp;rdquo; in the way in which it handles the scope.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In .NET you can choose to encrypt your data with the machine key or with the current user key. See &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata.aspx"&gt;MSDN&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;On the device &lt;em&gt;every application gets its own key, which is created on first use&lt;/em&gt;. Calls to &lt;span style="font-family: Courier New;"&gt;&lt;strong&gt;Protect&lt;/strong&gt;&lt;/span&gt; and &lt;span style="font-family: Courier New;"&gt;&lt;strong&gt;Unprotect&lt;/strong&gt;&lt;/span&gt; from the application code will implicitly use the application key, ensuring that all data remain private to the app itself: in fact, the &lt;strong&gt;&lt;span style="font-family: Courier New;"&gt;scope &lt;/span&gt;&lt;/strong&gt;parameter is not even present in the &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata(VS.96).aspx"&gt;method&amp;rsquo;s signature&lt;/a&gt;. For what I understand, the key will survive subsequent application updates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Back to the problem of saving tokens on the device: how do we modify the flow in the current samples in order to take advantage of this new feature?&lt;/p&gt;
&lt;p&gt;Very straightforward. In step 12 of task 5 of &lt;a href="http://msdn.microsoft.com/en-us/identitytrainingcourse_acsandwindowsphone7_topic2#_Toc290300273"&gt;the ACS+WP7 lab&lt;/a&gt; you hook up your app to a store fa&amp;ccedil;ade, &lt;strong&gt;&lt;span style="font-family: Courier New;"&gt;RequestSecurityTokenResponseStore&lt;/span&gt;&lt;/strong&gt;, which is responsible for persisting in isolated storage the RSTR messages received from ACS (you can find it in SL.Phone.Federation/RequestSecurityTokenResponseStore). All you need to do is ensuring that you use &lt;span style="font-family: Courier New;"&gt;&lt;strong&gt;Protect&lt;/strong&gt;&lt;/span&gt; and &lt;span style="font-family: Courier New;"&gt;&lt;strong&gt;Unprotect w&lt;/strong&gt;&lt;/span&gt;hen putting stuff in and out of isolated storage.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;:&amp;nbsp; Why the entire RSTR instead of just the token? Mainly because we can extract the expiration from directly from there, whereas the token itself may be encrypted for the destination service hence opaque to the client. We use that info just as an optimization &amp;ndash; we can save a roundtrip to the service if we already know that the token expired &amp;ndash; but the service is still on point for validating incoming tokens hence errors on this are not too costly.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As we progressively refresh our ACS+WP7 content to take advantage of the new Mango features (with its occasional &lt;a href="http://bit.ly/lfUeTK"&gt;road bumps&lt;/a&gt;) we&amp;rsquo;ll incorporate those new features, but I wanted to make sure that you know ASAP how to mitigate the token-persistence-on-the-device problem. Don&amp;rsquo;t you feel better already? &lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0552.wlEmoticon_2D00_winkingsmile_5F00_3C81CED1.png" alt="Winking smile" class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10168447" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Identity+Foundation/">Windows Identity Foundation</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/WIF/">WIF</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Access+Control+Service/">Access Control Service</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ACS/">ACS</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/wi/">wi</category></item><item><title>“Mango” and the ACS+Phone Samples</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/05/25/mango-and-the-acs-phone-samples.aspx</link><pubDate>Wed, 25 May 2011 20:33:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10168404</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10168404</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/05/25/mango-and-the-acs-phone-samples.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0447.normaltomobile_5F00_62432421.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="normaltomobile" border="0" alt="normaltomobile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0435.normaltomobile_5F00_thumb_5F00_0E137811.png" width="300" height="233" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Yesterday we released the Beta of the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=77586864-ab15-40e1-bc38-713a95a56a05"&gt;Windows Phone Developer Tools 7.1&lt;/a&gt;, with a boatload of new awesome features (I’ll write about one of those in the next post).&lt;/p&gt;  &lt;p&gt;Beta versions are likely to have some known issues, and this one is no exception. In fact, there is a bug that you are likely to encounter if you go through &lt;a href="http://msdn.microsoft.com/en-us/IdentityTrainingCourse_ACSAndWindowsPhone7"&gt;the ACS+WP7 hands-on lab&lt;/a&gt;, the &lt;a href="http://watoolkitwp7.codeplex.com/"&gt;Windows Azure Toolkit for Windows Phone 7&lt;/a&gt; (which still targets Windows Phone 7.0, &lt;a href="http://www.wadewegner.com/2011/05/wpdt-for-mango-support-added-to-the-windows-azure-toolkit-for-windows-phone-7/"&gt;see Wade’s post here&lt;/a&gt;) and &lt;a href="http://acs.codeplex.com/wikipage?title=ACS%20Windows%20Phone%20Sample"&gt;the phone sample on the ACS site&lt;/a&gt;.     &lt;br /&gt;The &lt;strong&gt;WebBrowser&lt;/strong&gt; control in the emulator periodically resets the scale and position of the page being rendered, making it challenging to enter your credentials on IP authentication pages that are not designed for mobile. It is still definitely possible, but you may need to do a bit of chasing of the username and password fields on the screen (or type without having the fields into view, using the page up combination for entering values in the emulator via the PC’s keyboard).&lt;/p&gt;  &lt;p&gt;While we wait for a release of the tools in which the bug has been fixed, here there are a couple of workarounds you may want to consider if your Windows Phone app scenario requires ACS:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Use the mobile version of the IP authentication pages.&lt;/strong&gt; Many providers offer mobile-friendly versions of their authentication pages, that will render well on the phone’s screen without requiring you to zoom in and pan through the page. In that case the bug will just make the page flicker a bit, but you’ll be able to enter your data without issues.      &lt;br /&gt;This entails taking control of the home realm discovery experience, as the default pages used by ACS for contacting the preconfigured IPs are not the mobile-ready versions. For ideas on how to do it I suggest taking a look at the code of the phone client generated by the template in the latest Windows Azure Toolkit for Windows Phone 7&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Keep the Windows Phone Tools 7.0 on some of your machines.&lt;/strong&gt; I am keeping a couple of my machines on 7.0: not only because of this specific issue, but also because AFAIK with 7.1 Beta you cannot publish apps to the marketplace and I need to be able to do so (if I’ll finally find the time to update my poor neglected Chinese &amp;amp; Japanese dictionary apps) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;If neither of the above works for you, let me stress that entering your credentials is still perfectly possible: it just requires you a bit more effort. Those are the joys of prerelease software &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3162.wlEmoticon_2D00_smile_5F00_46BE221E.png" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10168404" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Identity+Foundation/">Windows Identity Foundation</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/WIF/">WIF</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ACS/">ACS</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/windows+phone7/">windows phone7</category></item><item><title>Adding a Custom OpenID Provider to ACS… with JUST ONE LINE of PowerShell Code</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/05/19/adding-a-custom-openid-provider-to-acs-with-just-one-line-of-powershell-code.aspx</link><pubDate>Fri, 20 May 2011 05:49:37 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10166562</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10166562</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/05/19/adding-a-custom-openid-provider-to-acs-with-just-one-line-of-powershell-code.aspx#comments</comments><description>&lt;p&gt;ACS offers you a variety of identity provider you can integrate with. Many of you will be familiar with the list shown by the management portal at the beginning of the add new identity provider wizard.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3513.image_5F00_5A0D9415.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1832.image_5F00_thumb_5F00_7391CEEA.png" width="488" height="265" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Some of you may also know that ACS integrates with Yahoo! and Google using OpenID, however from your point of view that doesn’t matter much: the details are abstracted away by ACS.&lt;/p&gt;  &lt;p&gt;A less-known factlet is that ACS also supports integration with other OpenId providers: however that capability is not exposed via portal, you can only set it up via management APIs. We do have a tutorial which shows you how to do that step by step using &lt;a href="https://www.myopenid.com/"&gt;myOpenID&lt;/a&gt;, you can find it &lt;a href="http://msdn.microsoft.com/en-us/library/gg185935.aspx"&gt;here&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;It’s not hard, that’s just OData after all, but it is still&lt;em&gt; 6 printed pages&lt;/em&gt;. Now, how would you feel if I’d tell you that if you use &lt;a href="http://bit.ly/kF9ksY"&gt;the ACS cmdlets&lt;/a&gt; &lt;strong&gt;&lt;em&gt;&lt;u&gt;you can do exactly the same in ONE line of PowerShell code&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;? Mind == blown, right? &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7215.wlEmoticon_2D00_smile_5F00_39A28BFE.png" /&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Here we go: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;PS C:\Users\vittorio\Desktop&amp;gt; &lt;strong&gt;Add-IdentityProvider&lt;/strong&gt; –Namespace “myacsnamespace” –ManagementKey “XXXXXXXX” -Type &amp;quot;Manual&amp;quot; -Name &amp;quot;myOpenID&amp;quot; -Protocol OpenId –SignInAddress “&lt;/font&gt;&lt;a href="http://www.myopenid.com/server"&gt;&lt;font face="Courier New"&gt;http://www.myopenid.com/server&lt;/font&gt;&lt;/a&gt;”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That’s it! With the –Manual switch I can explicitly create any IP type. In order to maintain my boast that one line of code is enough, I used the inlined syntax for passing the namespace and the management key directly. In the &lt;a href="http://bit.ly/kF9ksY"&gt;announcement post&lt;/a&gt; I first obtained a management token with &lt;strong&gt;&lt;font face="Courier New"&gt;Get-AcsManagementToken&lt;/font&gt;&lt;/strong&gt;, assigned it to a variable and passed it along for all subsequent commands, which is more appropriate for longer scripts (hence from now on I’ll use it instead).&lt;/p&gt;  &lt;p&gt;That did the equivalent of the tutorial: however, that’ not enough to use myOpenID with the application yet. We still need to create rules that will add some claims or ACS won’t even send a token back. Luckily, that’s just another line of PowerShell code:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;PS C:\Users\vittorio\Desktop&amp;gt; &lt;font color="#333333"&gt;&lt;strong&gt;Add-Rule&lt;/strong&gt;&lt;/font&gt; -MgmtToken $mgmtToken -GroupName &amp;quot;Default Rule Group for myRP&amp;quot; -IdentityProviderName &amp;quot;myOpenID&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Here I didn’t specify any input or output claim, which substantially ends up in a pass-through rule. NOW we’re ready! Let’s see what happens if I hit F5 on a plain vanilla Windows Azure webrole project where I added the SecurityTokenDisplayControl (you can find the VS2010 version in the &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?displaylang=en&amp;amp;FamilyID=c3e315fa-94e2-4028-99cb-904369f177c0"&gt;identity training kit&lt;/a&gt; labs about ACS).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5557.image_5F00_595165C6.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7215.image_5F00_thumb_5F00_31AAE99C.png" width="383" height="429" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Oh hello myOpenID option! I’s there, good sign. Let’s hit it.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8765.image_5F00_37F1C02A.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6153.image_5F00_thumb_5F00_44EBA03B.png" width="400" height="276" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As expected, we end up on the auth page of openID. Once successfully authenticated, we get to the consent page:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5732.image_5F00_3CF3FDD9.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6644.image_5F00_thumb_5F00_34FC5B77.png" width="400" height="230" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Note that the consent does not mention any attributes, this fact will become relevant in a moment. Let’s click continue and…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4578.image_5F00_41F63B88.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2402.image_5F00_thumb_5F00_59AD72EE.png" width="500" height="225" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;congratulations! You just added an arbitrary OpenID provider, and all it took was just 2 lines of PowerShell (without even touching your application or opening the ACS management portal).&lt;/p&gt;  &lt;p&gt;Now, you may notice one thing about this transaction: we got an awfully low amount of information about the user, just the OpenID handle in fact. I am not very deep in OpenID, I’ll readily admit. Luckily Oren, Chao and Andrew from the ACS team came to the rescue (thank you guys) and explained that ACS gets claims in OpenID via Attribute Exchange, which myOpenID does not support (they use &lt;a href="http://egistration http://openid.net/specs/openid-simple-registration-extension-1_1-01.html"&gt;Simple Registration&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Bummer! I really wanted to show passing name and email. Luckily adding another OpenID provider which supports AX is just a matter of hitting the up arrow a couple of times in the PowerShell ISE and change the name and signin address accordingly. In the end I settled with &lt;a href="http://hyves.net"&gt;http://hyves.net&lt;/a&gt;, since &lt;a href="http://bit.ly/mHCnRp"&gt;I was just recently in the Netherlands&lt;/a&gt; &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7215.wlEmoticon_2D00_smile_5F00_39A28BFE.png" /&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;Add-IdentityProvider&lt;/strong&gt; -MgmtToken $mgmtToken -Type &amp;quot;Manual&amp;quot; -Name &amp;quot;hyves.net OpenID&amp;quot; -Protocol OpenId -SignInAddress &lt;/font&gt;&lt;a href="https://openid.hyves-api.nl/"&gt;&lt;font face="Courier New"&gt;https://openid.hyves-api.nl/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;Add-Rule&lt;/strong&gt; -MgmtToken $mgmtToken -GroupName &amp;quot;Default Rule Group for myRP&amp;quot; -IdentityProviderName &amp;quot;hyves.net OpenID&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Another F5…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8206.image_5F00_7164AA54.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4578.image_5F00_thumb_5F00_77AB80E2.png" width="386" height="422" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;…and the new option for hyves.net shows up. Good! Let’s hit it.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4075.image_5F00_500504B8.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0777.image_5F00_thumb_5F00_6AD12AC4.png" width="400" height="300" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;We get to their auth page. Let’s log in, we’ll get to the consent page.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6622.image_5F00_29C2AB60.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5732.image_5F00_thumb_5F00_20F2A314.png" width="500" height="342" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now this looks more promising. Hyves.net asks permission to share the email address with the ACS endpoint, as expected. Let’s grant it and see what happens.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1732.image_5F00_460FED80.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0755.image_5F00_thumb_5F00_04953B27.png" width="550" height="243" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Bingo! This time ACS (hence the RP) got the name and email claims, just like I wanted.&lt;/p&gt;  &lt;p&gt;Soo, let me recap. I just enabled users from two arbitrary OpenID providers to authenticate with my application; and all it took was writing two commands in the window below to provision the first provider, then modifying those two commands for provisioning the second. We are talking minutes here, and just because I am not a very good typist nor an expert in PowerShell.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1423.image_5F00_673FE35C.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0434.image_5F00_thumb_5F00_3A4A8081.png" width="400" height="334" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I know it’s bad form that I am the one saying it: but isn’t this really awesome? &lt;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.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8688.wlEmoticon_2D00_winkingsmile_5F00_317A7835.png" /&gt; Come on, do something with the cmdlets too! I am super-curious to see what you guys will be able to accomplish &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7215.wlEmoticon_2D00_smile_5F00_39A28BFE.png" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10166562" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Access+Control+Service/">Access Control Service</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ACS/">ACS</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/OpenID/">OpenID</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/PowerShell/">PowerShell</category></item><item><title>Announcing: Sample ACS Cmdlets for the Windows Azure AppFabric Access Control Service</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/05/17/announcing-sample-acs-cmdlets-for-the-windows-azure-appfabric-access-control-service.aspx</link><pubDate>Wed, 18 May 2011 06:06:45 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10165686</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10165686</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/05/17/announcing-sample-acs-cmdlets-for-the-windows-azure-appfabric-access-control-service.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3051.powershell_5F00_554C330C.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="powershell" border="0" alt="powershell" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4520.powershell_5F00_thumb_5F00_56ECD913.png" width="300" height="150" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Long story short: &lt;strong&gt;we are releasing &lt;a href="http://bit.ly/ACScmdlets"&gt;on Codeplex&lt;/a&gt; &lt;a href="http://bit.ly/llnWl7"&gt;a set of PowerShell cmdlets which wrap the management API of the Windows Azure AppFabric Access Control Service.&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This is hopefully for the joy of our IT admin friends who want to add ACS to their arsenal, but I bet that this will make many developers happy as well. I’ve never really used PowerShell before, and I’m using those cmdlets like crazy since the very first internal drop!&lt;/p&gt;  &lt;p&gt;You can use those new cmdlets to &lt;strong&gt;save repetitive provisioning processes in form of PowerShell scripts&lt;/strong&gt;, and consistently reuse them just by passing as parameters the targeted namespace and corresponding management key. You can use them for &lt;strong&gt;backing up your namespace settings on file and restore them at a later time&lt;/strong&gt;, or &lt;strong&gt;copy settings from one namespace to the other&lt;/strong&gt;. You can easily &lt;strong&gt;integrate ACS management in your existing scripts&lt;/strong&gt;, or even &lt;strong&gt;just use the cmdlets to perform quick queries and adjustments &lt;/strong&gt;to your namespace directly &lt;strong&gt;from PowerShell ISE or the command line&lt;/strong&gt;. In fact, you can do whatever you are used to do with PowerShell cmdlets &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0003.wlEmoticon_2D00_smile_5F00_2E6DF6FF.png" /&gt;. &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5706.image_5F00_4E1CD0C7.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0728.image_5F00_thumb_5F00_322B9BCF.png" width="500" height="386" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The initial set we are releasing today is not 100% exhaustive, for example we don’t touch the service identities yet, but it already enables most of the scenarios we encountered. The command names are self-explanatory:&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;         &lt;p&gt;&lt;strong&gt;IPs&lt;/strong&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;Add-IdentityProvider              &lt;br /&gt;Get-IdentityProvider               &lt;br /&gt;Get-IdentityProviders               &lt;br /&gt;Remove-IdentityProvider&lt;/font&gt;             &lt;br /&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="200"&gt;         &lt;p&gt;&lt;strong&gt;RPs&lt;/strong&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;Add-RelyingParty              &lt;br /&gt;Get-RelyingParties               &lt;br /&gt;Get-RelyingParty               &lt;br /&gt;Remove-RelyingParty&lt;/font&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;         &lt;p&gt;&lt;strong&gt;Rules&lt;/strong&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;Add-DefaultPassThroughRules              &lt;br /&gt;Add-Rule               &lt;br /&gt;Get-Rule               &lt;br /&gt;Get-Rules               &lt;br /&gt;Remove-Rule&lt;/font&gt;             &lt;br /&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="200"&gt;         &lt;p&gt;&lt;strong&gt;Rule Groups&lt;/strong&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;Add-RuleGroup              &lt;br /&gt;Get-RuleGroup               &lt;br /&gt;Get-RuleGroups               &lt;br /&gt;Remove-RuleGroup&lt;/font&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;         &lt;p&gt;&lt;strong&gt;Crypto&lt;/strong&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;Add-TokenEncryptionKey              &lt;br /&gt;Add-TokenSigningKey               &lt;br /&gt;Get-ServiceKey               &lt;br /&gt;Get-ServiceKeys               &lt;br /&gt;Remove-ServiceKey&lt;/font&gt;             &lt;br /&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="200"&gt;         &lt;p&gt;&lt;strong&gt;Utils&lt;/strong&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;Get-AcsManagementToken&lt;/font&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;There’s just 23 of them, and we might shrink them further in the future. For example: do we really need an Add-DefaultPassThroughRules cmdlet or can we just rely on Add-Rule? You tell us!    &lt;br /&gt;All cmdlets support get-help including the –Full option, although things are not too verbose at the moment: in subsequent releases we’ll tidy things up, but we wanted to put this in your hands ASAP.&lt;/p&gt;  &lt;p&gt;Now for the usual &lt;strong&gt;disclaimer&lt;/strong&gt;:&amp;#160; Those cmdlets are distributed in source code form and are not part of the product. you should consider them a code sample, even if we provide you with a setup that will automatically compile and install them so that you can use them without ever opening the project in visual studio if you don’t want to. Of course we are happy to take your feedback, especially now that the package is still a bit rough on the edges, but you should always remember that those cmdlets are unsupported.     &lt;br /&gt;Other disclaimer: this release have been thoroughly tested only on Windows 7 x64 SP1, and quickly tested on Windows 7 x86 SP1 and Windows 2008 R2 x64 SP1. There are known problems on older platforms, which we’ll iron out moving forward. Think of this release as one preview.&lt;/p&gt;  &lt;p&gt;That said, I am sure you’ll have a lot of fun using the cmdlets for exploring the features that ACS offers.&lt;/p&gt;  &lt;h2&gt;Some More Background, and One Example&lt;/h2&gt;  &lt;p&gt;If you want to manage your ACS namespaces, there’s no shortage of options: you can take advantage of the management portal (new in 2.0) or you can use the OData API exposed via management service.&lt;/p&gt;  &lt;p&gt;In my team we make pretty heavy use of ACS, both for our internal tooling (for example managing content and events) and for the samples, demos and hands on lab we produce.    &lt;br /&gt;In order to enable the scenario we want to implement, at setup time all of those deliverables require us to go through fixed sets of configuration steps in ACS. For example, when you use the template in the &lt;a href="http://watoolkitwp7.codeplex.com/"&gt;Windows Azure Toolkit for Windows Phone 7&lt;/a&gt; to generate an ACS-ready project, the initialization code needs to:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Add Google as an IP &lt;/li&gt;    &lt;li&gt;Add Yahoo! as an IP &lt;/li&gt;    &lt;li&gt;Remove any RP which may collide with the new one &lt;/li&gt;    &lt;li&gt;Create the new RP &lt;/li&gt;    &lt;li&gt;Get rid of all the rules which may already be in the rule group we are targeting &lt;/li&gt;    &lt;li&gt;Generate all the pass-through rules for the various IPs &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This is a relatively simple sequence of operations; other setups we have to do, like the enterprise subscription provisioning flow we follow when we handle a new FabrikamShipping subscriber, are WAY more complicated.    &lt;br /&gt;In order to automate those processes, we progressively populated a class library of C# wrappers for the ACS management APIs. Then we started including that library in the Setup folder of various projects, together with a console app which calls those wrappers in the sequence that the specific sample being set up dictates; for example, the sequence described above for the Windo&lt;a href="http://watoolkitwp7.codeplex.com/"&gt;ws Azure toolkit for Windows Phone 7&lt;/a&gt;.&amp;#160; &lt;br /&gt;In that specific case, the setup solution (it’s &lt;em&gt;C:\WAZToolkitForWP7\Setup\acs\AcsSetup.sln&lt;/em&gt; if you have the toolkit and you are curious) is almost&lt;strong&gt; 580 lines of code&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Now, multiply that for all the projects we have (for the newest ones see &lt;a href="http://blogs.msdn.com/b/vbertocci/archive/2011/04/11/the-new-acs-ships.aspx"&gt;this post&lt;/a&gt;) and the number starts to look significant. Add it to the frequent requests we get from customers to extend the cmdlets we created for Windows Azure to other services in the Windows Azure platform, and you’ll see why we decided to create a set of cmdlets for ACS.     &lt;br /&gt;Quite frankly, it was also because it was a low hanging fruit for us. We already had our wrapper library for the ACS management API, and we had the cmdlets wrapper solution we used for generating the Windows Azure cmdlets; putting the two together was pretty straightforward.&lt;/p&gt;  &lt;p&gt;Once we had the right set of cmdlets we went ahead and re-created the sequence above in for of PowerShell script, and the improvement in respect to the AcsSetup.sln approach is impressive. Check it out:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;# Coordinates of your namespace&lt;/strong&gt;       &lt;br /&gt;$acsNamespace = &amp;quot;&amp;lt;yourNamespace&amp;gt;&amp;quot;;       &lt;br /&gt;$mgmtKey = &amp;quot;&amp;lt;yourManagementKey&amp;gt;&amp;quot;;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;# Constants&lt;/strong&gt;       &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;$rpName = &amp;quot;WazMobileToolkit&amp;quot;;      &lt;br /&gt;$groupName = &amp;quot;Default Rule Group for $rpName&amp;quot;;       &lt;br /&gt;$signingSymmetricKey = &amp;quot;2RGYmQiFT9uslnxTTUn9MFr/nU+HeVwkmMJ6MwBNGuQ=&amp;quot;;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;$allowedIdentityProviders = @(&amp;quot;Windows Live ID&amp;quot;,&amp;quot;Yahoo!&amp;quot;, &amp;quot;Google”);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;# Include ACS Management SnapIn &lt;/strong&gt;      &lt;br /&gt;Add-PSSnapin ACSManagementToolsSnapIn;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;# Get the ACS management token for securing all subsequent API calls&lt;/strong&gt;       &lt;br /&gt;$mgmtToken = Get-AcsManagementToken -namespace $acsNamespace -managementKey $mgmtKey;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;# Configure Preconfigured Identity Providers &lt;/strong&gt;      &lt;br /&gt;Write-Output &amp;quot;Add PreConfigured Identity Providers (Google and Yahoo!)...&amp;quot;;       &lt;br /&gt;$googleIp = Add-IdentityProvider -mgmtToken $mgmtToken -type &amp;quot;Preconfigured&amp;quot; –preconfiguredIPType &amp;quot;Google&amp;quot;;       &lt;br /&gt;$yahooIp = Add-IdentityProvider -mgmtToken $mgmtToken -type &amp;quot;Preconfigured&amp;quot; –preconfiguredIPType &amp;quot;Yahoo!&amp;quot;;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;# Remove RP (if it already exists) &lt;/strong&gt;      &lt;br /&gt;Write-Output &amp;quot;Remove Relying Party ($rpName) if exists...&amp;quot;;       &lt;br /&gt;Remove-RelyingParty -mgmtToken $mgmtToken -name $rpName;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;# Remove All Rules In Group (if they already exist) &lt;/strong&gt;      &lt;br /&gt;Write-Output &amp;quot;Remove All Rules In Group ($groupName) if exists...&amp;quot;;       &lt;br /&gt;Get-Rules -mgmtToken $mgmtToken -groupName $groupName | ForEach-Object { Remove-Rule -mgmtToken $mgmtToken -rule $_ };&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;# Create Relying Party &lt;/strong&gt;      &lt;br /&gt;Write-Output &amp;quot;Create Relying Party ($rpName)...&amp;quot;;       &lt;br /&gt;$rp = Add-RelyingParty -mgmtToken $mgmtToken -name $rpName -realm &amp;quot;uri:wazmobiletoolkittest&amp;quot; -tokenFormat &amp;quot;SWT&amp;quot; -allowedIdentityProviders $allowedIdentityProviders -ruleGroup $groupName -signingSymmetricKey $signingSymmetricKey;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;# Generate default pass-through rules &lt;/strong&gt;      &lt;br /&gt;Write-Output &amp;quot;Create Default Passthrough Rules for the configured IPs ($allowedIdentityProviders)...&amp;quot;;       &lt;br /&gt;$rp.IdentityProviders | ForEach-Object { Add-DefaultPassthroughRules -mgmtToken $mgmtToken -groupName $groupName -identityProviderName $_.Name }&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;Write-Output &amp;quot;Done&amp;quot;;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Excluding the comments (but counting the Write-Output) those are 20 lines of very understandable code, which you can modify in notepad (typically just for the namespace and namespace key) and run with a simple double-click; or, if you are fancy, you can open it up in PowerShell ISE and execute it line by line if you want to. Does it show that I am excited about this? &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-openmouthedsmile" alt="Open-mouthed smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1563.wlEmoticon_2D00_openmouthedsmile_5F00_1A44B4A9.png" /&gt;&lt;/p&gt;  &lt;p&gt;Let’s play a bit more. Let’s say that you now want to add Facebook as an identity provider. First you’ll need to add some config values at the beginning of the script:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;$fbAppIPName = &amp;quot;Facebook IP&amp;quot;;     &lt;br /&gt;$fbAppId = &amp;quot;XXXXXXXXXXXXX&amp;quot;;      &lt;br /&gt;$fbAppSecret = &amp;quot;XXXXXXXXXXXXX&amp;quot;;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;We can even be fancy and subordinate the Facebook setup to the existance of non-empty facebook app coordinates in the script:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;$facebookEnabled = (($fbAppId -ne &amp;quot;&amp;quot;) -and ($fbAppSecret -ne &amp;quot;&amp;quot;));&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Then we just add those few lines right where we create the preconfigured IPs:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;# Configure Facebook App Identity Provider&lt;/strong&gt;      &lt;br /&gt;if ($facebookEnabled)      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Write-Output &amp;quot;Add Facebook App Identity Provider ($fbAppIPName)...&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; # Remove FB App IP (if exists)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Remove-IdentityProvider -mgmtToken $mgmtToken -name $fbAppIPName;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; # Add FB App IP      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $fbIp = Add-IdentityProvider -mgmtToken $mgmtToken -type &amp;quot;FacebookApp&amp;quot; -name $fbAppIPName -fbAppId $fbAppId -fbAppSecret $fbAppSecret;      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Super straightforward; and the part that I love is that you can just test those commands one by one and see the results immediately, saving them in the script only when you are certain they do what you want them to do. For management tasks, it definitely beats fiddling with the debugger and the immediate window.&lt;/p&gt;  &lt;p&gt;Want to play a bit more? Sure. One thing I often need to do is wiping a namespace clean after I did a demo during a session. Sometimes I have many sessions in a day, from time to time even back to back: as you can imagine, clicking around the portal for deleting entities is not fun nor very fast. But now I can just double click on the following script and I am done!&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;$acsNamespace = &amp;quot;holacsfederation&amp;quot;;     &lt;br /&gt;$mgmtKey = &amp;quot;XXXXXXXXXXXXXXXXXXXX&amp;quot;;      &lt;br /&gt;&lt;strong&gt;# Include ACS Management SnapIn&lt;/strong&gt;      &lt;br /&gt;Add-PSSnapin ACSManagementToolsSnapIn;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;$mgmtToken = Get-AcsManagementToken -namespace $acsNamespace -managementKey $mgmtKey;     &lt;br /&gt;Write-Output &amp;quot;Wiping IPs (and associated rules)&amp;quot;;      &lt;br /&gt;Get-IdentityProviders -mgmtToken $mgmtToken | where {$_.SystemReserved -eq $false} | ForEach-Object { Remove-IdentityProvider -mgmtToken $mgmtToken -name $_.Name };      &lt;br /&gt;Write-Output &amp;quot;Wiping RPs (and associated rules)&amp;quot;;      &lt;br /&gt;Get-RelyingParties -mgmtToken $mgmtToken | where {$_.SystemReserved -eq $false} | ForEach-Object { Remove-RelyingParty -mgmtToken $mgmtToken -name $_.Name };      &lt;br /&gt;Write-Output &amp;quot;Wiping Rule Groups&amp;quot;;      &lt;br /&gt;Get-RuleGroups -mgmtToken $mgmtToken | where {$_.SystemReserved -eq $false} | ForEach-Object { Remove-RuleGroup -mgmtToken $mgmtToken -name $_.Name };&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Here I delete all IPs (which will delete the associated rules), all RPs and all rule groups. All three commands have the same structure. Let’s pick the IP one:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;Get-IdentityProviders -mgmtToken $mgmtToken      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; | where {$_.SystemReserved -eq $false}       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; | ForEach-Object { Remove-IdentityProvider -mgmtToken $mgmtToken -name $_.Name };&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Get-IdentityProviders returns all IPs in the namespace; the where clause excludes the system reserved ones (Windows Live ID) which we’d be unable to delete anyway, then the ForEach-Object cycles through all the IPs and removes them. You’ve got to love PowerShell piping.&lt;/p&gt;  &lt;p&gt;Well, this barely scratches the surface of what you can do with the ACS cmdlets. &lt;a href="http://bit.ly/ACScmdlets"&gt;Please do check them out!&lt;/a&gt; We look forward for your feedback, and for once not just from developers! &lt;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.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0728.wlEmoticon_2D00_winkingsmile_5F00_403A64FF.png" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10165686" width="1" height="1"&gt;</description></item><item><title>At TechEd Atlanta? Come Over to the Federated Identity Booth!</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/05/17/at-teched-atlanta-come-over-to-the-federated-identity-booth.aspx</link><pubDate>Tue, 17 May 2011 16:34:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10165453</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10165453</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/05/17/at-teched-atlanta-come-over-to-the-federated-identity-booth.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5873.DSCF0933_5F00_5C3CC000.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="DSCF0933" border="0" alt="DSCF0933" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5270.DSCF0933_5F00_thumb_5F00_0F98835D.jpg" width="640" height="360" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Friendly faces everywhere / Humble folks without temptation &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-note" alt="Note" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3632.wlEmoticon_2D00_note_5F00_66AD6E53.png" /&gt;.&lt;/p&gt;  &lt;p&gt;More seriously, this is one of those rare occasions where you could meet with the guy who wrote (or spec’ed) the exact feature you are interested into… and they are all here for answering your questions. Don’t miss the opportunity! &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10165453" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Identity/">Identity</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/TechEd/">TechEd</category></item><item><title>Attention ASP.NET Developers: SAML-P Comes to WIF</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/05/16/attention-asp-net-developers-saml-p-comes-to-wif.aspx</link><pubDate>Mon, 16 May 2011 14:21:52 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10164899</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10164899</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/05/16/attention-asp-net-developers-saml-p-comes-to-wif.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8321.image_5F00_2E045D2C.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8308.image_5F00_thumb_5F00_25A087D5.png" width="567" height="217" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If I’d have a dollar for every time a customer or partner asked me if they could use WIF for consuming the SAML2.0 protocol… ok, I would not exactly buy a villa a Portofino, but let’s just say that this is one of the most requested features since WIF came out.&lt;/p&gt;  &lt;p&gt;Well, dear .NET developers, rejoice:&amp;#160; you no longer need to envy your friend the ADFS2 administrator. From now on you are gifted &lt;strong&gt;the ability to use ASP.NET for writing SAML-P SP-Lite compliant relying parties&lt;/strong&gt;, which in fact I should probably call service providers just to add some local color.&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://blogs.msdn.com/b/card/archive/2011/05/16/announcing-the-wif-extension-for-saml-2-0-protocol-community-technology-preview.aspx"&gt;WIF team just released&lt;/a&gt;,and here I quote verbatim, the &lt;a href="http://go.microsoft.com/fwlink/?LinkId=219043"&gt;CTP of the WIF Extensions for SAML 2.0 Protocol&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;At its core, what makes those extensions tick is the &lt;strong&gt;Saml2AuthenticationModule&lt;/strong&gt;, which looks very similar (i.e. raises ~the same events, etc.) to the WSFederationAuthenticationModule and is in fact inserted in the pipeline more or less in the same way. The module lives in the assembly &lt;strong&gt;Microsoft.IdentityModel.Protocols.dll&lt;/strong&gt;, together with the (lots of) classes it needs to implement the details of the SAML protocol.&lt;/p&gt;  &lt;p&gt;The programming model may be similar, as one would expect, but of course the extensions implement features that are paradigmatically SAMLP. Examples? &lt;strong&gt;POST, Redirect and Artifact bindings; SP initiated and &lt;/strong&gt;(can you believe that?) &lt;strong&gt;IP initiated SSO and SLO (single log out)&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;The package contains various other goodies: a good set of cassini-based samples, documentation that will get you started and that will help you to use ADFS2 as IP instead of the sample IP provided in the package. But my favourite is definitely the &lt;strong&gt;SamlConfigTool&lt;/strong&gt;: it is a slightly more raw counterpart of fedutil/add STS reference, which can consume metadata from one IP and generate the corresponding SP config settings. And just like fedutil, it can generate the SP metadata so that the IP can easily consume it for automating the SP provisioning as well.&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://go.microsoft.com/fwlink/?LinkId=219043"&gt;WIF Extensions for SAML.20 Protocol&lt;/a&gt; unlock some new, interesting scenario: and of course, being this a CTP the WIF team really wants your feedback. If you’ll play with the extensions, please take a moment to chime in and let us know what you think!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10164899" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Identity/">Identity</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/SAML/">SAML</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Identity+Foundation/">Windows Identity Foundation</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/WIF/">WIF</category></item><item><title>Live from TechEd Atlanta: Drew Shows Windows Azure, Windows Phone 7–Uses Identity to Glue Them</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/05/16/live-from-teched-atlanta-drew-shows-windows-azure-windows-phone-7-uses-identity-to-glue-them.aspx</link><pubDate>Mon, 16 May 2011 14:11:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10164893</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10164893</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/05/16/live-from-teched-atlanta-drew-shows-windows-azure-windows-phone-7-uses-identity-to-glue-them.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6082.WP_5F00_000332_5F00_3ED41F8F.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="WP_000332" border="0" alt="WP_000332" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0333.WP_5F00_000332_5F00_thumb_5F00_2A02270F.jpg" width="400" height="239" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Just few hours ago &lt;a href="http://www.wadewegner.com/2011/05/now-available-windows-azure-toolkit-for-windows-phone-7-v1-2/"&gt;Wade announced the new release of the Windows Azure Toolkit for Windows Phone&lt;/a&gt;, with &lt;a href="http://bit.ly/kumqLU"&gt;support for ACS&lt;/a&gt;. You can already see the bits in action &lt;a href="http://northamerica.msteched.com"&gt;from the stage of the TechEd keynote&lt;/a&gt; – nonetheless – from where a very elegant &lt;strong&gt;Drew Robbins&lt;/strong&gt; is demonstrating Fabrikam Fiber, a really cool scenario scenario which integrates &lt;strong&gt;Windows Azure&lt;/strong&gt; (&lt;strong&gt;storage, compute, Windows Azure Connect, Traffic Manager&lt;/strong&gt;), &lt;strong&gt;Windows Phone 7 &lt;/strong&gt;(featuring a lot of dev tools features coming in &lt;strong&gt;Mango&lt;/strong&gt;!) and, or course, the &lt;strong&gt;Windows Azure AppFabric Access Control Service&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;The scenario demonstrated uses the next evolution of the toolkit, where the integration with &lt;strong&gt;ADFS2 &lt;/strong&gt;will make user provisioning no longer necessary (see notes in &lt;a href="http://bit.ly/ipCL7B"&gt;this post&lt;/a&gt;). That’s cool stuff, folks! Tune in to the &lt;a href="http://northamerica.msteched.com"&gt;keynote live streaming&lt;/a&gt;, or check out the recordings afterwards: highly recommended.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6518.fabfiber_2D00_phone_2D00_login_5F00_741D31F4.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="fabfiber phone login" border="0" alt="fabfiber phone login" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2308.fabfiber_2D00_phone_2D00_login_5F00_thumb_5F00_00AADF11.png" width="200" height="364" /&gt;&lt;/a&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3056.adfs_2D00_homescreen_5F00_5F4B3974.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="adfs homescreen" border="0" alt="adfs homescreen" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2476.adfs_2D00_homescreen_5F00_thumb_5F00_5E06A095.png" width="200" height="364" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10164893" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/TechEd/">TechEd</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Identity+Foundation/">Windows Identity Foundation</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ADFS/">ADFS</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Azure/">Windows Azure</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Access+Control+Service/">Access Control Service</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ACS/">ACS</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/windows+phone7/">windows phone7</category></item><item><title>Bring Your Active Directory in Your Pockets with ACS, OAuth 2.0 and the New Windows Azure Toolkit for Windows Phone 7</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/05/15/bring-your-active-directory-in-your-pockets-with-acs-oauth-2-0-and-the-new-windows-azure-toolkit-for-windows-phone-7.aspx</link><pubDate>Sun, 15 May 2011 23:11:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10164683</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10164683</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/05/15/bring-your-active-directory-in-your-pockets-with-acs-oauth-2-0-and-the-new-windows-azure-toolkit-for-windows-phone-7.aspx#comments</comments><description>&lt;p&gt;&lt;img height="269" width="400" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6661.PhoneTokens_5F00_19CAE1BC.png" /&gt;&lt;/p&gt;
&lt;p&gt;As &lt;a href="http://bit.ly/iGOscu"&gt;promised last week&lt;/a&gt;, today &lt;a href="http://www.wadewegner.com/2011/05/now-available-windows-azure-toolkit-for-windows-phone-7-v1-2/"&gt;Wade released the 1.2 version of the Windows Azure Toolkit for Windows Phone 7&lt;/a&gt;. And again &lt;a href="http://bit.ly/iGOscu"&gt;as promised,&lt;/a&gt; this version has full support for ACS!&lt;/p&gt;
&lt;p&gt;Using the new feature is super straightforward: &lt;a href="http://bit.ly/kumqLU"&gt;you can see that by yourself in the quickstart video&lt;/a&gt; in which I walk through the simplest ACS configuration.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://bit.ly/kumqLU"&gt;&lt;img height="287" width="513" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8883.image_5F00_0CDC2FFC.png" alt="image" border="0" title="image" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As mentioned in the &lt;a href="http://bit.ly/iGOscu"&gt;teaser post&lt;/a&gt; last week, we purposefully kept the VS template very simple. As a result, the initial setup ends up with one application which supports Windows Live ID, Yahoo! and Google, the identity providers which are pre-configured within ACS.&lt;/p&gt;
&lt;p&gt;However, once the project has been created nothing prevents you from working directly on you ACS namespace for adding new identity providers, such as Facebook or even your own Active Directory; those identity providers will automagically show up in the list of IPs in the login screen without he need of changing a single line of code. Want proof? Read on!&lt;/p&gt;
&lt;h2&gt;Adding a New WS-Federation Provider (like ADFS2)&lt;/h2&gt;
&lt;p&gt;Here I&amp;rsquo;ll assume that you went through the steps I show in the quickstart video and you ended up with the basic ACS application as created by the toolkit.&lt;/p&gt;
&lt;p&gt;If you want to enable your users to sign in the application using their Active Directory accounts, you can go directly to the ACS namespace you are using and add you AD (assuming you have ADFS2 deployed) as an identity provider. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: Right now the toolkit bits are still handling access at the account level, which means that your users will need to go through the same sign-up step you have for users coming from social providers; however this does not subtract anything to the joy of being able to reuse your domain credentials on a device, instead of having to memorize yet another password. In the future the integration will be even more seamless: think claim mapping rules, along the lines of &lt;a href="http://blogs.msdn.com/b/vbertocci/archive/2011/04/19/acs-extensions-for-umbraco-part-iii-integration-with-adfs-and-or-any-ws-federation-provider.aspx"&gt;what we&amp;rsquo;ve done for integrating ADFS2 with Umbraco&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Well, let&amp;rsquo;s do it then: it will only take a minute!&lt;/p&gt;
&lt;p&gt;As usual I don&amp;rsquo;t have an ADFS2 instance on my laptop, hence I&amp;rsquo;ll simulate it using &lt;a href="http://blogs.msdn.com/b/vbertocci/archive/2010/08/23/selfsts-when-you-need-a-saml-token-now-right-now.aspx"&gt;SelfSTS&lt;/a&gt;. This time I picked the&amp;nbsp; SelfSTS1 folder from the assets of the &lt;a href="http://msdn.microsoft.com/en-us/IdentityTrainingCourse_ACSLabsV2Federation"&gt;ACS and Federation lab&lt;/a&gt;, copied it under c:\temp and modified it a bit to emit a different set of claims:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8883.image_5F00_124AA0A0.png"&gt;&lt;img height="318" width="480" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2046.image_5F00_thumb_5F00_7EBD40FE.png" alt="image" border="0" title="image" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I also changed its port from the config, generated a new certificate, hit Start and refreshed the federationmatadata.xml file (hint: use the URL from the metadata field to open the file in Notepad, then save it over the old metadata file). Those may not be strictly necessary, but I always do that for avoiding collisions.&lt;/p&gt;
&lt;p&gt;Now that you have your ADFS2 simulation up &amp;amp; running, go to your namespace in the ACS portal at &lt;a href="https://YOURNAMESPACE.accesscontrol.windows.net/v2/mgmt/web"&gt;https://YOURNAMESPACE.accesscontrol.windows.net/v2/mgmt/web&lt;/a&gt;. From there go to Identity providers, hit Add, keep the default ws-federation and hit Next.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5861.image_5F00_0FC16EE2.png"&gt;&lt;img height="332" width="400" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7024.image_5F00_thumb_5F00_5565F900.png" alt="image" border="0" title="image" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;From here you can add your SelfSTS instance. Remember, it simulates your AD! If you have an ADFS2 instance, use that instead. Enter whatever name you want in the display name and login text link fields, upload the metadata file from your SelfSTS, scroll to the bottom of the page and hit Save.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6431.image_5F00_26340D69.png"&gt;&lt;img height="303" width="400" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/8004.image_5F00_thumb_5F00_41003375.png" alt="image" border="0" title="image" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now click Rule groups form the left-hand menu, click on Default Rule Group for WazMobileToolkit, hit the Generate link, accept the defaults and click the Generate button. You can also hit Save for good measure, if you are superstitious &lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0167.wlEmoticon_2D00_smile_5F00_46DAD70E.png" alt="Smile" class="wlEmoticon wlEmoticon-smile" style="border-style: none;" /&gt;.&lt;/p&gt;
&lt;p&gt;And you&amp;rsquo;re done! Go back to Visual Studio and start the portal/service and the phone client as shown in the quickstart. Here there&amp;rsquo;s what you&amp;rsquo;ll see on the phone app:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5873.image_5F00_389C5E1E.png"&gt;&lt;img height="545" width="300" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2234.image_5F00_thumb_5F00_1E5BF4FA.png" alt="image" border="0" title="image" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s right! Just like that, now your AD appears as one of the options. Neat. If you pick that option, ACS will contact SelfSTS for authenticating you. If you would be using a real ADFS2 instance at this point you would be prompted for your credentials: but SelfSTS is a test utility which automatically authenticates you, hence you&amp;rsquo;ll go straight to the next screen:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/3730.image_5F00_6EBDD66D.png"&gt;&lt;img height="552" width="300" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/5873.image_5F00_thumb_5F00_0D944A4C.png" alt="image" border="0" title="image" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;hellip;and from now on everything is exactly as for the social providers: the user gets an entry in the system, which will be used for handling authorization. You can see it in the Users table in the management portal.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6763.image_5F00_7353E127.png"&gt;&lt;img height="228" width="400" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/7455.image_5F00_thumb_5F00_24731BC8.png" alt="image" border="0" title="image" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let me reiterate: in addition to being able to use credentials from Windows Live ID, Yahoo and Google, the user can now reuse his domain credentials to sign in from one Windows Phone client to one application whose backend is in the cloud (Windows Azure). And enabling all that took just few clicks on the ACS management portal, no code changes required.&lt;/p&gt;
&lt;p&gt;Now, do you want to hear a funny story? &lt;em&gt;We did not plan for this.&lt;/em&gt; I am not kidding. I am not saying that we are surprised, I totally expected this, what I mean is that this scenario didn&amp;rsquo;t take any specific effort to implement, it came out &amp;ldquo;for free&amp;rdquo; while implementing support for ACS and social providers.&amp;nbsp; &lt;br /&gt;When you admit users from social providers in your application, you don&amp;rsquo;t receive very detailed (or verifiable, excluding email) information about the users; hence the usual practice is to create an account for the user and mainly outsource credential management to the external identity providers. &lt;br /&gt;In the walkthrough above I treated my simulated ADFS2 exactly in the same way, and everything worked thanks to the fact that we are relying on standards and ACS isolates the phone application and the backend from the differences between identity providers.&amp;nbsp; It&amp;rsquo;s the usual federation provider pattern, with the twist demonstrated in the &lt;a href="http://bit.ly/hf6oF1"&gt;ACS + WP7 lab&lt;/a&gt;; in a future blog post I&amp;rsquo;ll go a bit deeper in the architecture of this specific solution.&lt;/p&gt;
&lt;p&gt;What could we accomplish if we&amp;rsquo;d explicitly plan for an identity provider like ADFS2? Well, for one: provision-less access, one of the holy grails of identity and access control &lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0167.wlEmoticon_2D00_smile_5F00_46DAD70E.png" alt="Smile" class="wlEmoticon wlEmoticon-smile" style="border-style: none;" /&gt; &lt;br /&gt;ADFS2 sources data from AD, hence can provide valuable information about its users (roles, job functions, spending limits, etc) which carries the reputation of the business running that AD instance. This means that we could greatly simplify the authorization flow, skipping the user registration step and authorizing directly according to the attributes in input. As mentioned above, we already have a good example of that in the &lt;a href="http://blogs.msdn.com/b/vbertocci/archive/2011/04/19/acs-extensions-for-umbraco-part-iii-integration-with-adfs-and-or-any-ws-federation-provider.aspx"&gt;ACS Extensions for Umbraco&lt;/a&gt;; that&amp;rsquo;s a feature that is very likely to make its way in the toolkit, too &lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/0167.wlEmoticon_2D00_smile_5F00_46DAD70E.png" alt="Smile" class="wlEmoticon wlEmoticon-smile" style="border-style: none;" /&gt;&lt;/p&gt;
&lt;p&gt;There you have it. The bits are in your hands now, and we can&amp;rsquo;t wait to find out what you&amp;rsquo;ll accomplish with them! If you have feedback, please do not hesitate to visit the discussion section in &lt;a href="http://watoolkitwp7.codeplex.com/"&gt;http://watoolkitwp7.codeplex.com/&lt;/a&gt;. Happy coding!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10164683" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Identity/">Identity</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Azure/">Windows Azure</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ACS/">ACS</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Phone+7/">Windows Phone 7</category></item><item><title>25 Free Copies of “Programming Windows Identity Foundation” at Teched</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/05/14/25-free-copies-of-programming-windows-identity-foundation-at-teched.aspx</link><pubDate>Sat, 14 May 2011 07:42:37 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10164459</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10164459</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/05/14/25-free-copies-of-programming-windows-identity-foundation-at-teched.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/0735627185?ie=UTF8&amp;amp;tag=wwwcloudident-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0735627185"&gt;&lt;img border="0" alt="" src="http://www.maseghepensu.it/4136wZUo01L._SL160_.jpg" /&gt;&lt;/a&gt;&lt;img border="0" alt="" src="http://www.assoc-amazon.com/e/ir?t=wwwcloudident-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0735627185" width="1" height="1" /&gt;&lt;/p&gt;  &lt;p&gt;Yesterday &lt;a href="http://blogs.msdn.com/b/vbertocci/archive/2011/05/13/teched-usa-2010-identity-identity-identity-and-book-signing.aspx"&gt;I posted about my sessions at TechEd and the book signing event&lt;/a&gt;. My friends at O’Reilly, though, graciously pointed out that I didn’t mention the juiciest fact: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;&lt;u&gt;The first 25 people who will show up at the book signing will receive a free copy of &lt;a href="http://www.amazon.com/gp/product/0735627185?ie=UTF8&amp;amp;tag=wwwcloudident-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0735627185"&gt;Programming Windows Identity Foundation&lt;/a&gt;!&lt;/u&gt;&lt;/strong&gt; That is really super-nice of them.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Make sure you come &lt;strong&gt;at 11:00am on Tuesday the 17th at the O’Reilly booth (or is it the bookstore?) &lt;/strong&gt;and we’ll get you something to read on your flight back! &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6366.wlEmoticon_2D00_smile_5F00_463E2A9D.png" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10164459" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Identity/">Identity</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Book/">Book</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/TechEd/">TechEd</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Identity+Foundation/">Windows Identity Foundation</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/WIF/">WIF</category></item><item><title>TechEd USA 2010: Identity, Identity, Identity and Book Signing</title><link>http://blogs.msdn.com/b/vbertocci/archive/2011/05/13/teched-usa-2010-identity-identity-identity-and-book-signing.aspx</link><pubDate>Fri, 13 May 2011 07:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10164102</guid><dc:creator>Vittorio Bertocci - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/vbertocci/rsscomments.aspx?WeblogPostID=10164102</wfw:commentRss><comments>http://blogs.msdn.com/b/vbertocci/archive/2011/05/13/teched-usa-2010-identity-identity-identity-and-book-signing.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/1638.image_5F00_0F01FFB6.png"&gt;&lt;img height="115" width="494" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/4606.image_5F00_thumb_5F00_069E2A5F.png" alt="image" border="0" title="image" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;These days practically everybody I meet on campus is preparing to fly to Atlanta for TechEd, with the notable exception of Steve Marx (it seems I may be losing our bet after all).&lt;/p&gt;
&lt;p&gt;Atlanta holds a special meaning for me. Back in 2004 I won the Circle of Excellence award, which (among various awesome things) included a 1-hour long meeting with Bill Gates. You can of course imagine how many times that episode got told and retold, to the point that the memory is now a memory of a memory(^n) and entered the Myth; and with it the entire Atlanta city experience, with its raging thunderstorms and the weird-flavored sodas at the Coke Museum. &lt;/p&gt;
&lt;p&gt;Well, this Sunday I am scheduled to fly down to Atlanta again, where I&amp;rsquo;ll be presenting three sessions and hold &lt;a href="http://www.amazon.com/gp/product/0735627185?ie=UTF8&amp;amp;tag=wwwcloudident-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0735627185a book signing session"&gt;a book signing session&lt;/a&gt;. &lt;br /&gt;Book signing session, I say? Why would somebody want to get their &lt;a href="http://www.amazon.com/gp/product/0735627185?ie=UTF8&amp;amp;tag=wwwcloudident-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0735627185"&gt;copy of the book &lt;/a&gt;written all over, which is very likely to lower the price it could command on eBay, is beyond me&amp;hellip; but I&amp;rsquo;ll be happy to oblige! &lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/2543.wlEmoticon_2D00_smile_5F00_6D362724.png" alt="Smile" class="wlEmoticon wlEmoticon-smile" style="border-style: none;" /&gt; It will be &lt;strong&gt;Tuesday the&amp;nbsp; 17th, at 11:00 AM &lt;/strong&gt;at the &lt;strong&gt;O&amp;rsquo;Reilly booth (#1817)&lt;/strong&gt;. Or the bookstore?&lt;/p&gt;
&lt;p&gt;For the sessions, we&amp;rsquo;ll have a couple of new entries. Let&amp;rsquo;s go in order:&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4&gt;&lt;a href="http://northamerica.msteched.com/topic/details/SIM324#showdetails"&gt;SIM324 Using Windows Azure Access Control Service 2.0 with Your Cloud Application&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Tuesday, May 17 | 8:30 AM - 9:45 AM | &lt;a href="http://northamerica.msteched.com/p/tena2011/resources/TENA11_Floorplan.pdf"&gt;Room: C302&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Level: 300 - Advanced&lt;/p&gt;
&lt;p&gt;Track: Security, Identity &amp;amp; Management&lt;/p&gt;
&lt;p&gt;The Windows Azure Access Control Service 2.0 provides comprehensive federation and authorization services for cloud applications, so that you don't have to build identity infrastructure yourself. Come to this session to learn how your application can take advantage of your user's existing Active Directory, Windows Live ID, Google, Yahoo, and Facebook accounts when they access your cloud application. This session is aimed at developers building cloud applications. &lt;/p&gt;
&lt;p&gt;Product/Technology:&lt;/p&gt;
&lt;p&gt;Cloud Power: Delivered, Windows Azure&amp;trade;, Windows&amp;reg; Identity Foundation&lt;/p&gt;
&lt;p&gt;Audience:&lt;/p&gt;
&lt;p&gt;Architect, Developer, Security Administrator, Solutions Architect, Strategic IT Manager, Systems Administrator, Systems Engineer, Tactical IT Manager, Web Administrator/Webmaster, Web Developer/Designer&lt;/p&gt;
&lt;p&gt;Key Learning:&lt;/p&gt;
&lt;p&gt;Understand how to simplify authorization in your applications using ACS 2.0 in Windows Azure&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Finally, a session all about ACS. Although all ACS features appear in the generic claims in the cloud talk (see below), I never have the time to linger a bit on the how of the service: also, in this session I&amp;rsquo;ll try to touch on features a rarely have the time to show off. &lt;br /&gt;Now, some extra comments here. Putting together a behemoth conference like TechEd is a monumental task, which is spread through multiple people. For example, I wrote the abstract for the sessions but not the Audience and Key Learning entries there, and they both contain some imperfection that may mislead you.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the audience for this talk is people in development roles. System Administrator types are NOT a target. I went to great lengths to be super clear in the title and the abstract about the audience, but something probably fell through the cracks. &lt;/li&gt;
&lt;li&gt;About the key learning. ACS can do some authorization, but that is far from being its only (or even primary) feature. Don&amp;rsquo;t come with the wrong expectations! &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Neeext!&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4&gt;&lt;a href="http://northamerica.msteched.com/topic/details/SIM322#showdetails"&gt;SIM322 Developer's View on Single Sign-On for Applications Using Windows Azure&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Tuesday, May 17 | 3:15 PM - 4:30 PM | &lt;a href="http://northamerica.msteched.com/p/tena2011/resources/TENA11_Floorplan.pdf"&gt;Room: B312&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Level: 300 - Advanced&lt;/p&gt;
&lt;p&gt;Track: Security, Identity &amp;amp; Management&lt;/p&gt;
Signing users in and granting them access is a core function of almost every cloud-based application. In this session we show you how to simplify your user experience by enabling users to sign in with an existing account such as a Windows Live ID, Google, Yahoo, Facebook or on-premises Active Directory account, implement access control and make secure connections between applications. Learn how the AppFabric Access Control Service, Windows Identity Foundation, and Active Directory Federation Services use a cloud-based identity architecture to help you to take advantage of the shift toward the cloud while still fully leveraging your on-premises investments.
&lt;p&gt;Product/Technology:&lt;/p&gt;
&lt;p&gt;Cloud Power: Delivered, Windows Azure&amp;trade;, Windows&amp;reg; Identity Foundation&lt;/p&gt;
&lt;p&gt;Audience:&lt;/p&gt;
&lt;p&gt;Architect, Infrastructure Architect, Solutions Architect, Strategic IT Manager, Systems Administrator, Systems Engineer, Tactical IT Manager, Web Administrator/Webmaster, Web Developer/Designer&lt;/p&gt;
&lt;p&gt;Key Learning:&lt;/p&gt;
&lt;p&gt;How to simplify your approach enabling access to applications across on-premises and cloud&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nothing to say on this one. This is the usual scenarios enumeration talk which I&amp;rsquo;ve been giving around since PDC. COme only if you don&amp;rsquo;t know much about claims or our offering in that space for developers.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4&gt;&lt;a href="http://northamerica.msteched.com/topic/details/SIM325#showdetails"&gt;SIM325 Deep Dive: Windows Identity Foundation for Developers&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Thursday, May 19 | 1:00 PM - 2:15 PM | &lt;a href="http://northamerica.msteched.com/p/tena2011/resources/TENA11_Floorplan.pdf"&gt;Room: B313&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Level: 300 - Advanced&lt;/p&gt;
&lt;p&gt;Track: Security, Identity &amp;amp; Management&lt;/p&gt;
Hear how Windows Identity Foundation makes advanced identity capabilities and open standards first-class citizens in the Microsoft .NET Framework. Learn how the Claims-Based access model integrates seamlessly with the traditional .NET identity object model while also giving developers complete control over every aspect of authentication, authorization and identity-driven application behavior. See examples of the point and click tooling with tight Microsoft Visual Studio integration, advanced STS capabilities, and much more that Windows Identity Foundation consistently provides across on-premise, service-based, Microsoft ASP.NET and Windows Communication Foundation (WCF) applications.
&lt;p&gt;Product/Technology:&lt;/p&gt;
&lt;p&gt;Windows&amp;reg; Identity Foundation&lt;/p&gt;
&lt;p&gt;Audience:&lt;/p&gt;
&lt;p&gt;Architect, Developer, Security Administrator, Solutions Architect, Strategic IT Manager, Systems Administrator, Systems Engineer, Tactical IT Manager, Web Administrator/Webmaster, Web Developer/Designer&lt;/p&gt;
&lt;p&gt;Key Learning:&lt;/p&gt;
&lt;p&gt;Learn how to use WIF to externalize authentication and authorization from your application.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now this one is interesting. This session was supposed to be a 400, but yesterday I discovered that the catalog lists it as 300. Well, it&amp;rsquo;s a deep dive: hence it may end up being fairly 400ish, depending on the vibe I'll find the the room.&lt;/p&gt;
&lt;p&gt;The key learning is good here, but unfortunately the audience is pretty off. Here &amp;ldquo;developers&amp;rdquo; is in the title, hence I won&amp;rsquo;t even start&amp;hellip; &lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-26-94-metablogapi/6431.wlEmoticon_2D00_winkingsmile_5F00_14043D65.png" alt="Winking smile" class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" /&gt;&lt;/p&gt;
&lt;p&gt;Well, that&amp;rsquo;s it. As usual, I am super happy to meet you guys at conferences: please do not hesitate to come and chat. Apart from the talk and book signing, you&amp;rsquo;ll see me hanging around the Identity and Windows Azure booths. See you next week!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10164102" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Identity/">Identity</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Book/">Book</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/TechEd/">TechEd</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Windows+Identity+Foundation/">Windows Identity Foundation</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/WIF/">WIF</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/Access+Control+Service/">Access Control Service</category><category domain="http://blogs.msdn.com/b/vbertocci/archive/tags/ACS/">ACS</category></item></channel></rss>
