<?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>Justin Smith's Blog</title><link>http://blogs.msdn.com/justinjsmith/default.aspx</link><description /><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Web Resource Authorization Protocol (WRAP) and Simple Web Token (SWT) on google groups</title><link>http://blogs.msdn.com/justinjsmith/archive/2009/11/05/web-resource-authorization-protocol-wrap-and-simple-web-token-swt-on-google-groups.aspx</link><pubDate>Fri, 06 Nov 2009 00:17:05 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9918315</guid><dc:creator>justinjsmith</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/9918315.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=9918315</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=9918315</wfw:comment><description>&lt;p&gt;The Access Control Service uses a new community protocol and format that are now posted on google groups: &lt;a title="http://groups.google.com/group/wrap-wg" href="http://groups.google.com/group/wrap-wg"&gt;http://groups.google.com/group/wrap-wg&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Check em out. If you are a security geek, it’s worth the read.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9918315" width="1" height="1"&gt;</description></item><item><title>Access Control Service (M7) released today!</title><link>http://blogs.msdn.com/justinjsmith/archive/2009/11/05/access-control-service-m7-released-today.aspx</link><pubDate>Thu, 05 Nov 2009 23:58:40 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9918307</guid><dc:creator>justinjsmith</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/9918307.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=9918307</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=9918307</wfw:comment><description>&lt;p&gt;Today is a big day for the Access Control Service team. M7 is now live. There are a few huge changes: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;It is running on top of Azure (fabric and storage)&lt;/li&gt;    &lt;li&gt;We incorporated a new community driven protocol and token format (Web Resource Authorization Protocol (WRAP) and Simple Web Tokens (SWT))&lt;/li&gt;    &lt;li&gt;Relying Parties and Requestors can use ACS from any platform that is capable of HMACSHA256 calculations and HTTPs FORM POSTs&lt;/li&gt;    &lt;li&gt;It integrates with AD FS v2 (strictly speaking this isn’t a change, but it is definitely worth mentioning&lt;/li&gt;    &lt;li&gt;It also enables what I like to call Simple Delegation. In a nutshell, this allows requestors to grant others access to a relying party on their behalf.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;To access the new services go to &lt;a href="https://netservices.azure.com"&gt;https://netservices.azure.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The team worked unbelievably hard on this release. Special shout out to Cyrus Harvsef, Afshin Sepehri, Blaine Dockter, Dan Smiley, Ankit Patel, Arnab Ghosh, Hristina Popova,&amp;#160; Maciej Skierkowski, Yaron Golan, and many others for bringing this together.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9918307" width="1" height="1"&gt;</description></item><item><title>Access Control Service and ADFS v2 demo</title><link>http://blogs.msdn.com/justinjsmith/archive/2009/10/07/access-control-service-and-adfs-v2-demo.aspx</link><pubDate>Wed, 07 Oct 2009 14:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9904300</guid><dc:creator>justinjsmith</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/9904300.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=9904300</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=9904300</wfw:comment><description>&lt;P&gt;In my last post I outlined the changes that were coming in the Access Control Service. Since that post, I’ve received many questions about how ACS will integrate with ADFS v2. Below is a link to a simple demo I put together to highlight this very cool integration point (video on Channel 9).&lt;/P&gt;
&lt;P&gt;&lt;A href="http://channel9.msdn.com/posts/justinjsmith/Access-Control-Service-and-ADFS-v2-Integration/"&gt;http://channel9.msdn.com/posts/justinjsmith/Access-Control-Service-and-ADFS-v2-Integration/&lt;/A&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9904300" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Access+Control+Service/default.aspx">Access Control Service</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/.NET+Services/default.aspx">.NET Services</category></item><item><title>Access Control Service – Roadmap for PDC and Beyond</title><link>http://blogs.msdn.com/justinjsmith/archive/2009/09/28/access-control-service-roadmap-for-pdc-and-beyond.aspx</link><pubDate>Mon, 28 Sep 2009 18:48:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9900306</guid><dc:creator>justinjsmith</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/9900306.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=9900306</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=9900306</wfw:comment><description>&lt;p&gt;We are in the process of making some key design changes to the Access Control Service (ACS) for our PDC release this fall. I think these changes will bring tremendous benefits to ACS customers in the near-term, but the changes break all ACS-related code that exists today. &lt;/p&gt;  &lt;p&gt;This post summarizes the planned changes and provides some guidance for early ACS adopters.&lt;/p&gt;  &lt;p&gt;It expands on (and is a bit more unvarnished than) the announcement made here: &lt;a title="http://blogs.msdn.com/netservices/archive/2009/09/18/update-on-the-next-microsoft-net-services-ctp.aspx" href="http://blogs.msdn.com/netservices/archive/2009/09/18/update-on-the-next-microsoft-net-services-ctp.aspx"&gt;http://blogs.msdn.com/netservices/archive/2009/09/18/update-on-the-next-microsoft-net-services-ctp.aspx&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;Summary of Changes&lt;/h5&gt;  &lt;p&gt;We have decided to focus our efforts on addressing the large, unmet need around access control for REST web services. In concrete terms, this means that the WS-* integration features we support today will be temporarily unavailable while we focus on delivering a robust infrastructure for REST web service authorization. Once this infrastructure is in place, we will work to bring back features like website single sign on and rich WS-* support.&lt;/p&gt;  &lt;h5&gt;Motivation and Scope&lt;/h5&gt;  &lt;p&gt;There’s no doubt that Microsoft has made significant, long-term investments in security and identity management using the WS-* protocols: WS-Trust, WS-Federation, WS-Security and others. These protocols are proven and secure, widely adopted by enterprises, and will continue to be a central focus for ACS and other Microsoft groups working on enterprise security and identity management.&lt;/p&gt;  &lt;p&gt;At the same time, as REST web services have become very popular with both web and enterprise developers, a gap has emerged in the market place for identity and access control technology. Today, developers of REST web services lack an easy, accessible means to secure their services. They face a lack of consistency and common patterns for managing identity and access control in a way that is compatible with the REST focus on simplicity. As REST developers move towards the enterprise, they will have an increasing need for robust security. They will be required to address the more systematic security concerns of enterprise customers as well as the more complex identity management scenarios that enterprises present. They will need a way to address these requirements that is simple and that integrates well with REST.&lt;/p&gt;  &lt;p&gt;Taking this problem as an opportunity to differentiate the ACS offering and serve an even broader range of developers, we have experimented over the past several months with a simplified approach to the way that ACS packages and transits security tokens. Although this simplified approach has been designed to meet the needs of REST web service developers, it will appeal to all developers that want an easy way to take advantage of our services or that wish to use the .NET Services from non-Microsoft platforms.&lt;/p&gt;  &lt;p&gt;At MIX09 we exposed some of our thinking about this new approach as a way to gauge customer interest (&lt;a href="http://videos.visitmix.com/MIX09/T01F"&gt;See JohnShew’s presentation&lt;/a&gt;). In addition to talking about our goals for simplicity and broad interoperability, we demonstrated the ability to control access to SaaS web sites using a variety of different consumer identities. Consistent with our theme, we showed that this approach can radically simplify the REST developer experience. Response to the MIX09 presentations was overwhelmingly positive and confirmed our sense that we were on the right track.&lt;/p&gt;  &lt;p&gt;From this and other customer feedback, we have come to the conclusion that the lack of tools for controlling access to REST web services is one of the major pain points faced by service developers today. We believe that ACS is well-positioned to address this need in a way that compliments other MSFT offerings in the security and identity management space. The combination of simplicity and support for key enterprise integration scenarios will ensure that ACS appeals to our enterprise customers, while simultaneously meeting the needs of an even broader developer audience. In future releases, we will reinstate full support for the WS-* protocols, web Single Sign On, and round out the ACS offering in a way that spans the REST/SOAP spectrum.&lt;/p&gt;  &lt;h5&gt;Roadmap&lt;/h5&gt;  &lt;p&gt;In light of these considerations, we have made significant changes to our product roadmap. The following is a summary of the current ACS roadmap that reflects these changes:&lt;/p&gt;  &lt;h5&gt;&amp;#160;&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;PDC 2009: Simple Web Trust – Authorization for REST Web Services and the Azure Service Bus&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;ul&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/ul&gt;    &lt;li&gt;     &lt;p&gt;Two token exchange endpoints: REST with symmetric key and REST with SAML Extension&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;REST with symmetric key makes it trivially easy for developers on any platform to package claims for ACS &lt;/li&gt;    &lt;li&gt;REST with SAML Extension will work with tokens issued by ADFS V2 &lt;/li&gt;    &lt;li&gt;Both endpoints will be addressable using standard HTTPs POST requests &lt;/li&gt;    &lt;li&gt;ACS will transform input claims to output claims using configurable rules &lt;/li&gt;    &lt;li&gt;ACS will package and transit output claims using REST tokens &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;The Road ahead: Authorization for Web Sites and WS-* Support&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;New feature development post-PDC will be organized into two streams.&lt;b&gt;      &lt;br /&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Single Sign On and Authorization for Web Sites&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Web sites can automatically redirect users to ACS for authentication and authorization &lt;/li&gt;    &lt;li&gt;ACS will broker the authentication process with external identity providers, process resulting claims and return the user to the originating web site with the claims issued by ACS &lt;/li&gt;    &lt;li&gt;Web sites can allow users to login using a broad range of existing consumer or corporate identities &lt;/li&gt;    &lt;li&gt;Integrates with ADFS V2 and other directories that support WS-Federation Passive or OpenID &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;   &lt;br /&gt;&lt;strong&gt;WS-* Support&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Web services and web sites can take advantage of enhanced security and integration capabilities offered by WS-Trust and WS-Federation &lt;/li&gt;    &lt;li&gt;Support CardSpace &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;To align with this roadmap and make it possible to efficiently support and extend our release, we have invested in extending the foundations of the ACS platform. As a consequence, we have had to constrain the features that are in scope for PDC and carefully identify the scenarios that we are targeting. The following section describes the two core scenarios that will be supported at PDC.&lt;/p&gt;  &lt;h5&gt;Target Application Scenarios&lt;/h5&gt;  &lt;p&gt;Both of our target application scenarios involve a SaaS web service that uses ACS to manage access to its on-line resources. In the following scenario descriptions, we will use Northwind Traders (NWT) as the emblematic ACS customer, and Fabrikam Flower Shop and Contoso Auto Corp as emblematic NWT customers. Fabrikam Flowers and Contoso Auto Corp have different needs and capabilities when it comes to integration with NWT’s access control architecture. ACS will enable NWT to serve them both.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Northwind Traders&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Northwind Traders (NWT) is an ISV currently working on porting their on-premise software offering to a SaaS offering. Their SaaS offering consists of a REST programmatic endpoint and a website. NWT has decided to use ACS to protect their programmatic endpoint. Concretely, this means that a NWT customer application must first acquire a token from ACS before using the NWT REST service.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/AccessControlServiceRoadmapforPDCandBeyo_7BDF/NWT1_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="NWT1" border="0" alt="NWT1" src="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/AccessControlServiceRoadmapforPDCandBeyo_7BDF/NWT1_thumb_1.png" width="289" height="86" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Fabrikam Flower Shop &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Fabrikam Flowers is a micro-company that sells and delivers flowers. They have four employees and no IT department. They have, however, hired a local person to help them with their local network and to build their basic e-commerce website. Fabrikam Flowers has recently realized that they need to more closely track orders. JBM hears about NWT and their SaaS offering and decides to buy. After reading the NWT documentation, the website developer realizes that the integration is very simple.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/AccessControlServiceRoadmapforPDCandBeyo_7BDF/NWT2_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="NWT2" border="0" alt="NWT2" src="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/AccessControlServiceRoadmapforPDCandBeyo_7BDF/NWT2_thumb.png" width="626" height="97" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Contoso Auto Corp&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Contoso Auto Corp designs, builds, distributes, and sells automobiles. They have tens of thousands of employees and a sophisticated IT department. Contoso Auto Corp is in the processs of revamping their selling process. As a result, they need to acquire new sales software. NWT’s new SaaS offering happens to meet Contoso Auto Corp’s requirements, so Contoso Auto Corp decides to proceed with a proof of concept with NWT. Contoso Auto Corp requires that the NWT programmatic endpoint can work with an identity that Contoso Auto Corp owns. Since Contoso Auto Corp uses Active Directory, the Contoso Auto Corp application that integrates with NWT must be able to gain access to NWT using a SAML token generated by ADFS V2. Contoso Auto Corp has developers that understand ADFS and SAML technologies. In order for the NWT proof of concept to succeed, Contoso Auto Corp developers will need to quickly integrate NWT into the Contoso Auto Corp application.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/AccessControlServiceRoadmapforPDCandBeyo_7BDF/contoso_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="contoso" border="0" alt="contoso" src="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/AccessControlServiceRoadmapforPDCandBeyo_7BDF/contoso_thumb.png" width="626" height="226" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h5&gt;ACS Value Propositions&lt;/h5&gt;  &lt;p&gt;1. By writing a small amount of code in whatever language it wishes to use, NWT can offload to ACS the cost and complexity of integrating with various customer identity models and technologies.&lt;/p&gt;  &lt;p&gt;2. NWT’s customers will benefit from ACS documentation, samples and developer community in integrating their applications with NWT – thus further lowering NWT’s support costs for customer on-boarding.&lt;/p&gt;  &lt;p&gt;3. By adopting ACS, NWT will gain access to a number of advanced features, including:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;a. Role-based access control&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;b. Simple delegation&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;c. Increased protection from denial-of-service attacks&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;4. NWT can take advantage of ACS’s scale-out capacity to meet growth in demand or unexpected spikes in load.&lt;/p&gt;  &lt;p&gt;5. With little or no change to its code, NWT can stay abreast of the rapid evolution in access control standards and technologies and benefit from new features and capabilities as they are added to ACS.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;h5&gt;Generic ACS Interaction Model&lt;/h5&gt;  &lt;p&gt;In its most generic form, the interaction model for ACS involves three participants: the Requesting Application (Fabrikam Flowers App or Contoso Auto Corp App), the Relying Party (NWT) and ACS. The core pattern among these participants is as follows:&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;1. The Requesting Application (Fabrikam Flowers App or Contoso Auto Corp App) submits to ACS a security token containing input claims. This “inbound” token bears evidence—in the form of key material—that it was issued by a party (Fabrikam Flowers or Contoso Auto Corp) that the Relying Party (NWT) trusts.&lt;/p&gt;  &lt;p&gt;2. ACS processes these claims according to rules configured by NWT (via the ACS portal and/or management API) and resolves output claims.&lt;/p&gt;  &lt;p&gt;3. ACS packages these output claims into a new, ACS-issued security token and returns this token to the Requesting Application. We refer to this as the “outbound” token.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ACS Token-Exchange Endpoints&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In the PDC release, ACS will expose two endpoints where requesting applications can obtain an ACS-issued security token.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/AccessControlServiceRoadmapforPDCandBeyo_7BDF/nwt3_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nwt3" border="0" alt="nwt3" src="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/AccessControlServiceRoadmapforPDCandBeyo_7BDF/nwt3_thumb.png" width="370" height="114" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;ACS endpoints are optimized for REST and are designed to make it extremely easy for companies like Fabrikam Flowers to integrate with ACS. Companies like Contoso Auto Corp will also have a straight-forward integration path using our REST with SAML Extension, which will support inbound ADFS V2-generated SAML tokens. &lt;/p&gt;  &lt;p&gt;ACS will also use REST to transit outbound tokens to the Requesting Application. Customers will find it a trivial matter to work with the outbound tokens that ACS produces, whether that involves consuming them or transforming them into other formats for downstream processing.&lt;/p&gt;  &lt;h5&gt;PDC 2009 Integration with other MSFT Identity Technologies&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;Windows Identity Foundation (WIF) and ADFS V2&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;At PDC there will be community samples that demonstrate how to use WIF and ADFS V2 with ACS. WIF will be used to acquire a SAML token from ADFS V2 and to extract the claims from an ACS-issued token. Note that extracting claims from an ACS-issued token will require custom extensions to WIF. &lt;/p&gt;  &lt;p&gt;The WIF and ADFS teams are currently investigating native support for this type of REST token in the future versions of both WIF and ADFS.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Windows LiveID (WLID)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;At PDC there will also be a community sample that demonstrates how to use WLID with ACS.&lt;/p&gt;  &lt;h5&gt;Post-PDC Integration Scenarios&lt;/h5&gt;  &lt;p&gt;After PDC, ACS will extend to natively support many different identity providers both on the web (e.g. WLID, Google, Yahoo, Open ID, Facebook) and the enterprise (e.g. Forefront Identity Manager, ADFS V2, Tivoli, CA SiteMinder, Oracle Identity Manager, and other WS-* compliant servers). &lt;/p&gt;  &lt;h5&gt;Additional Comments&lt;/h5&gt;  &lt;p&gt;We plan on going live with ACS on or before the PDC conference in November 2009. While we know that the changes to our roadmap will cause some customer pain as well as internal retooling, we are confident that they will also set us on the right footing to have a very successful offering at PDC and beyond. &lt;/p&gt;  &lt;p&gt;If you have questions or comments about the changes we are making, please don’t hesitate to let me know.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9900306" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Services+in+the+Cloud/default.aspx">Services in the Cloud</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Access+Control+Service/default.aspx">Access Control Service</category></item><item><title>Client Certificate Credential Verification</title><link>http://blogs.msdn.com/justinjsmith/archive/2009/07/31/client-certificate-credential-verification.aspx</link><pubDate>Fri, 31 Jul 2009 19:36:29 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9854528</guid><dc:creator>justinjsmith</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/9854528.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=9854528</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=9854528</wfw:comment><description>&lt;p&gt;Over the past few months, several people have asked me how to accept client certificates on a service. The scenario is something like the following:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A web service owner wants to limit access to the service to authorized clients &lt;/li&gt;    &lt;li&gt;authorized clients identify themselves using a certificate &lt;/li&gt;    &lt;li&gt;the certificate may or may not be issued by a trusted root &lt;/li&gt;    &lt;li&gt;there may be lots and lots of client certificates&lt;/li&gt;    &lt;li&gt;clients and servers use WS-* compliant stack &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This discussion was happening enough that I thought it beneficial to have a quick sample to point to. Here’s my approach to the scenario:&lt;/p&gt; &lt;iframe style="border-bottom: #dde5e9 1px solid; border-left: #dde5e9 1px solid; padding-bottom: 0px; background-color: #ffffff; margin: 3px; padding-left: 0px; width: 240px; padding-right: 0px; height: 66px; border-top: #dde5e9 1px solid; border-right: #dde5e9 1px solid; padding-top: 0px" marginheight="0" src="http://cid-50fa692ec9deac1c.skydrive.live.com/embedrowdetail.aspx/Blog/CustomCertClientCredentials.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;p&gt;The trick is to check the certificate thumbprint in ServiceAuthorizationManager on the Service. This allows the service to trust a large number of certificates from lots of different issuers. You just lookup the certificate in your store (DB, Azure storage, etc.). &lt;/p&gt;  &lt;p&gt;This isn’t the only way to tackle the problem, but I think it gets the job done. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9854528" width="1" height="1"&gt;</description></item><item><title>Mix 09 Deck</title><link>http://blogs.msdn.com/justinjsmith/archive/2009/04/28/mix-09-deck.aspx</link><pubDate>Tue, 28 Apr 2009 17:53:14 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9573657</guid><dc:creator>justinjsmith</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/9573657.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=9573657</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=9573657</wfw:comment><description>&lt;p&gt;For some reason the slide deck I presented at Mix didn’t show up on the Mix 09 website. If you are interested in the deck, see the link below.&lt;/p&gt; &lt;iframe style="border-bottom: #dde5e9 1px solid; border-left: #dde5e9 1px solid; padding-bottom: 0px; background-color: #ffffff; margin: 3px; padding-left: 0px; width: 240px; padding-right: 0px; height: 66px; border-top: #dde5e9 1px solid; border-right: #dde5e9 1px solid; padding-top: 0px" marginheight="0" src="http://cid-50fa692ec9deac1c.skydrive.live.com/embedrowdetail.aspx/Blog/ACSMix-justinsm%20v9.pptx" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9573657" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Services+in+the+Cloud/default.aspx">Services in the Cloud</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Access+Control+Service/default.aspx">Access Control Service</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/.NET+Services/default.aspx">.NET Services</category></item><item><title>Interesting article on Azure Services</title><link>http://blogs.msdn.com/justinjsmith/archive/2009/03/26/interesting-article-on-azure-services.aspx</link><pubDate>Thu, 26 Mar 2009 11:20:16 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9510082</guid><dc:creator>justinjsmith</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/9510082.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=9510082</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=9510082</wfw:comment><description>&lt;p&gt;Today I caught up on some press material on Azure Services. For those that haven’t seen it, the picture version of Azure Services is below:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="azure" border="0" alt="azure" src="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/InterestingarticleonAzureServices_12CD/azure_3.jpg" width="485" height="229" /&gt;&lt;/p&gt;  &lt;p&gt;One article published in late February popped out at me: &lt;a href="http://blogs.zdnet.com/microsoft/?p=2173" target="_blank"&gt;http://blogs.zdnet.com/microsoft/?p=2173&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Among other things, this article brings good questions regarding how aligned and integrated the Azure Services platform is today. A quote from the article:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;“Our engineering efforts are fully aligned with Red Dog now,” said Shewchuk. “We expect them (Red Dog) to be available with a fully integrated developer experience” upon which CSD and its customers can count when working with .Net Services, SQL Data Services and other components.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;To be clear, the end results of this engineering alignment aren’t fully apparent yet. As John indicates, we are working on it.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9510082" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Access+Control+Service/default.aspx">Access Control Service</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/.NET+Services/default.aspx">.NET Services</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Azure/default.aspx">Azure</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Azure+Services/default.aspx">Azure Services</category></item><item><title>TokenClient (Mix) introduction</title><link>http://blogs.msdn.com/justinjsmith/archive/2009/03/24/tokenclient-mix-introduction.aspx</link><pubDate>Wed, 25 Mar 2009 08:53:31 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9506529</guid><dc:creator>justinjsmith</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/9506529.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=9506529</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=9506529</wfw:comment><description>&lt;p&gt;This week at Mix I demonstrated a new &lt;strong&gt;&lt;em&gt;experimental&lt;/em&gt;&lt;/strong&gt; client API (TokenClient) for interacting with the Access Control Service (ACS). The purpose of this API is to simplify the developer interaction with the ACS Security Token Service. It still uses WS-Trust on the wire, but restricts the WS-Trust options to what I believe to be the bare minimum.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;NOTE:&lt;/b&gt; this code requires the Geneva Fx (version released at PDC 08) in order to work. The assembly version # is 0.5.1.0.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;NOTE NOTE:&lt;/b&gt; This code is highly experimental – I’ve written it to demonstrate a core capability of ACS. As a result, it hasn’t been rigorously tested, and I am absolutely certain that there are bugs.&lt;/p&gt;  &lt;p&gt;Recalling earlier posts, remember that ACS simply accepts claims and uses access control rules to transform those input claims to output claims. Claims in, Claims out – all the live long day. The client API shown here reflects that simplicity.&lt;/p&gt;  &lt;p&gt;ACS receives “claims in” if those claims are wrapped in a token. As a result, the TokenClient type has a method that will package claims into a signed and encrypted token. There are other methods that send that token to ACS, and still other methods that return the ACS issued claims in a couple of different handy formats.&lt;/p&gt;  &lt;p&gt;First let’s discuss instantiation. In order to create a token, a TokenClient object needs to be able to sign and encrypt a token. This information is packaged in a TokenClientSettings object. The TokenClient type constructor accepts a TokenClientSettings object as shown 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: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;TokenClientSettings settings = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; TokenClientSettings() {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;  LocalIssuerAddress = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Uri(&lt;span style="color: #006080"&gt;&amp;quot;http://localhost/myissuer&amp;quot;&lt;/span&gt;),&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;  LocalIssuerSigningCertificate = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; X509Certificate2(&lt;span style="color: #006080"&gt;&amp;quot;sign.pfx&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;pwd&amp;quot;&lt;/span&gt;),&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;  Scope = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Uri(&lt;span style="color: #006080"&gt;&amp;quot;http://localhost/myservice&amp;quot;&lt;/span&gt;),&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;  ScopeEncryptingCertificate = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; X509Certificate2(“enc.cer&lt;span style="color: #006080"&gt;&amp;quot;, &amp;quot;&lt;/span&gt;pwd&lt;span style="color: #006080"&gt;&amp;quot;),&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;  SolutionName = &amp;quot;&lt;/span&gt;justindemoaccount&amp;quot;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;};&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;TokenClient client = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; TokenClient(settings);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td valign="top" width="157"&gt;
          &lt;p&gt;Property Name&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="481"&gt;
          &lt;p&gt;Description&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="157"&gt;
          &lt;p&gt;LocalIssuerAddress&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="481"&gt;
          &lt;p&gt;The value of the SAML issuer for the self-issued token. This address will need to be registered with ACS&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="157"&gt;
          &lt;p&gt;LocalIssuerSigningCertificate&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="481"&gt;
          &lt;p&gt;The X509Certificate2 object (with private key) that will be used to sign the self-issued token&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="157"&gt;
          &lt;p&gt;Scope&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="481"&gt;
          &lt;p&gt;The Scope URI that the token will be sent to (in an RST)&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="157"&gt;
          &lt;p&gt;ScopeEncryptingCertificate&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="481"&gt;
          &lt;p&gt;In cases where an ACS issued token will be decrypted, this certificate is used. &lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="157"&gt;
          &lt;p&gt;SolutionName&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="481"&gt;
          &lt;p&gt;Your solution name. This is needed to direct the RST to the correct address.&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/p&gt;

&lt;p&gt;Next, let’s instantiate an IEnumerable&amp;lt;Microsoft.IdentityModel.Claims.Claim&amp;gt; object. &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: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;Claim[] claims = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Claim[] { &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Claim(&lt;span style="color: #006080"&gt;@&amp;quot;http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;                                                     &lt;span style="color: #006080"&gt;&amp;quot;justin@calculatordemo.com&amp;quot;&lt;/span&gt;) };&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This claim value is completely made up. It’s just a value that I’ve decided to use. Similarly, the claim type is fairly arbitrary. I chose UPN out of convenience – you can choose any claim type you like (as long as you set that claim type up in your ACS scope).&lt;/p&gt;

&lt;p&gt;Next, let’s send those claims to ACS and see what claims we get back:&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: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;IEnumerable&amp;lt;Claim&amp;gt; acsIssuedClaims = client.TransformForClaims(claims);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Next, we can dump these claims to the console:&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: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (Claim claim &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; acsIssuedClaims) {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (claim.ClaimType != &lt;span style="color: #006080"&gt;&amp;quot;http://schemas.microsoft.com/ws/2008/06/identity/claims/confirmationkey&amp;quot;&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;{&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;     Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;===================================&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;     Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;Claim Value: {0}&amp;quot;&lt;/span&gt;, claim.Value);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;     Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;\tClaim Type: {0}&amp;quot;&lt;/span&gt;, claim.ClaimType);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;     Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;\tClaim Issuer: {0}&amp;quot;&lt;/span&gt;, claim.Issuer);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;     Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;===================================\n&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; 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; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Before we compile and run this sample, we need to setup ACS. The steps below roughly approximate what to do:&lt;/p&gt;

&lt;p&gt;1) Login to the &lt;a href="http://portal.ex.azure.microsoft.com"&gt;http://portal.ex.azure.microsoft.com&lt;/a&gt; and browse to the ACS management portal&lt;/p&gt;

&lt;p&gt;2) Create a new scope (&lt;a href="http://localhost/myservice"&gt;http://localhost/myservice&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;3) Setup a new Identity Issuer:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;a. Name: SimpleClaimIssuer&lt;/p&gt;

  &lt;p&gt;b. Uri: (&lt;a href="http://localhost/myissuer"&gt;http://localhost/myissuer&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;c. Certificate (the public key only version of sign.cer)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;4) Setup the encryption preferences:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;a. Certificate (the public key verision of enc.cer)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;5) Add a rule:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;a. Input: UPN &lt;a href="mailto:justin@calculatordemo.com"&gt;justin@calculatordemo.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;b. Output: Action: Read&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When you press F5 in the project, you will see the Action claim print to the console. In essence, the TokenClient will have created a token that contains a UPN claim, sent it to ACS for transformation, received the result, decrypted and verified the result, and printed the claims to the console.&lt;/p&gt;

&lt;p&gt;A link to download the code is below. Enjoy and please let me know as you find bugs… Again – this code is highly experimental…&lt;/p&gt;
&lt;iframe style="border-bottom: #dde5e9 1px solid; border-left: #dde5e9 1px solid; padding-bottom: 0px; background-color: #ffffff; margin: 3px; padding-left: 0px; width: 240px; padding-right: 0px; height: 66px; border-top: #dde5e9 1px solid; border-right: #dde5e9 1px solid; padding-top: 0px" marginheight="0" src="http://cid-50fa692ec9deac1c.skydrive.live.com/embedrowdetail.aspx/Blog/Microsoft.AccessControl.TokenClient.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9506529" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Services+in+the+Cloud/default.aspx">Services in the Cloud</category></item><item><title>Federated website sample</title><link>http://blogs.msdn.com/justinjsmith/archive/2009/02/12/federated-website-sample.aspx</link><pubDate>Fri, 13 Feb 2009 01:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9416046</guid><dc:creator>justinjsmith</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/9416046.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=9416046</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=9416046</wfw:comment><description>&lt;P&gt;The Geneva Framework FAM is the&amp;nbsp;simplest way to experience ACS and ASP.NET. My friends in platform evangelism wrote a cool app that uses ACS, LiveID, and the Geneva Framework. It's called issuetracker, and I recommend checking it out: &lt;A href="http://www.codeplex.com/azureissuetracker" mce_href="http://www.codeplex.com/azureissuetracker"&gt;http://www.codeplex.com/azureissuetracker&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9416046" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Access+Control+Service/default.aspx">Access Control Service</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/.NET+Services/default.aspx">.NET Services</category></item><item><title>Setting up a solution in .NET Services</title><link>http://blogs.msdn.com/justinjsmith/archive/2009/01/16/setting-up-a-solution-in-net-services.aspx</link><pubDate>Sat, 17 Jan 2009 01:35:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9331829</guid><dc:creator>justinjsmith</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/9331829.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=9331829</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=9331829</wfw:comment><description>&lt;p&gt;My co-worker Jenny Lo wrote a good post on how to get started with .NET Services. If you are wondering how to get started this should do the trick.&lt;/p&gt;  &lt;p&gt;&lt;a title="https://blogs.msdn.com/jennylo/archive/2008/11/04/a-step-by-step-guide-from-creating-a-net-services-solution-to-running-the-multicast-sample.aspx" href="https://blogs.msdn.com/jennylo/archive/2008/11/04/a-step-by-step-guide-from-creating-a-net-services-solution-to-running-the-multicast-sample.aspx"&gt;https://blogs.msdn.com/jennylo/archive/2008/11/04/a-step-by-step-guide-from-creating-a-net-services-solution-to-running-the-multicast-sample.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9331829" width="1" height="1"&gt;</description></item><item><title>Access Control Service - Common Interaction Model</title><link>http://blogs.msdn.com/justinjsmith/archive/2009/01/16/access-control-service-common-interaction-model.aspx</link><pubDate>Fri, 16 Jan 2009 20:32:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9329645</guid><dc:creator>justinjsmith</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/9329645.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=9329645</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=9329645</wfw:comment><description>&lt;p&gt;In my &lt;a href="http://blogs.msdn.com/justinjsmith/archive/2008/11/06/access-control-service-a-simple-scenario.aspx"&gt;previous post&lt;/a&gt; I described at a high level a simple scenario that leverages the Access Control Service. Now I'd like to describe the interactions between messaging participants and the .NET Access Control Service.&lt;/p&gt;  &lt;p&gt;Recall the scenario: a multi-tenant payroll application is running in the cloud - it uses the Access Control Service to simplify federation with enterprise identity providers and handle RBAC processing.&lt;/p&gt;  &lt;p&gt;The interaction pattern for this scenario is shown below.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/AccessControlServiceCommonInteractionMod_C5A4/image_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="405" alt="image" src="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/AccessControlServiceCommonInteractionMod_C5A4/image_thumb.png" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h5&gt;Step 0&lt;/h5&gt;  &lt;p&gt;Before using the ACS, the payroll app (called Relying Party in the diagram) must establish a trust with ACS. This is done via a public key certificate exchange. The Relying Party administrator or developer defines or obtains a certificate from the certificate authority of it's choosing, then uploads the public key certificate to ACS. &lt;/p&gt;  &lt;h5&gt;Step 1&lt;/h5&gt;  &lt;p&gt;Next, the Relying Party administrator or developer will define access control rules in ACS. As indicated in &lt;a href="http://blogs.msdn.com/justinjsmith/archive/2008/11/06/access-control-service-a-simple-scenario.aspx"&gt;my earlier post&lt;/a&gt;, the content of the rules is up to the administrator or developer. When this step is completed, ACS is setup and ready for use.&lt;/p&gt;  &lt;h5&gt;Step 2&lt;/h5&gt;  &lt;p&gt;The requestor sends a request for a token (Request for Security Token or RST) to ACS. An RST almost always contains claims (eg username / password, or another token issued from an identity provider). &lt;/p&gt;  &lt;h5&gt;Step 3&lt;/h5&gt;  &lt;p&gt;ACS then checks the claims in the RST. It then uses the input claims to determine the claims that will be sent in the RST response (called RSTR). Consider a simple rule: (Input) Username foo –&amp;gt; (Output) Role Administrator. If the input claim is Username foo, then the output claim is Role Administrator. ACS simply chains these rules together and calculates the output claim set.&lt;/p&gt;  &lt;h5&gt;Step 4&lt;/h5&gt;  &lt;p&gt;After the output claim set is determined, the claims are packaged into a SAML token and returned to the requestor. The token is signed with the ACS certificate and encrypted with the certificate used in step 0. There’s a little more to it than that, because the RP has to be able to differentiate its ACS STS from other ACS STSs. This will surely be a subsequent topic.&lt;/p&gt;  &lt;h5&gt;Step 5&lt;/h5&gt;  &lt;p&gt;The requestor then sends the token to the Relying Party along with a payload of its choosing.&lt;/p&gt;  &lt;h5&gt;Step 6&lt;/h5&gt;  &lt;p&gt;Upon receipt of the token + payload, the Relying Party verifies / validates the token, checks the claims in the token, then processes the payload accordingly. Concretely this means that the Relying Party verifies the token signature &amp;amp; decrypts the token. If the token signature / encryption keys are OK, the Relying Party then checks the claims in the token. If that endpoint or operation on the Relying Party requires Administrative privileges, then the token must contain an Administrator claim. Think of it like a simple toll gate. If the correct claim is present, the call proceeds. If not, then the call fails.&lt;/p&gt;  &lt;h5&gt;Claims Transformer&lt;/h5&gt;  &lt;p&gt;At a high level, ACS receives input claims and transforms them into output claims. We simplify these types of transformations into rules, and provide customers the ability to define these rules on a portal or through a simple API.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9329645" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Services+in+the+Cloud/default.aspx">Services in the Cloud</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Access+Control+Service/default.aspx">Access Control Service</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/.NET+Services/default.aspx">.NET Services</category></item><item><title>Access Control Service - A Simple Scenario</title><link>http://blogs.msdn.com/justinjsmith/archive/2008/11/06/access-control-service-a-simple-scenario.aspx</link><pubDate>Fri, 07 Nov 2008 10:42:56 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9051762</guid><dc:creator>justinjsmith</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/9051762.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=9051762</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=9051762</wfw:comment><description>&lt;p&gt;To the already initiated claims disciples, the Access Control Service is a multi-tenant Resource STS. The behavior of each STS is determined by simple rules - the rules control how each STS &lt;em&gt;&lt;strong&gt;transforms claims&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;To those not already initiated in the claims methodology, the previous definition may seem a bit obtuse. If that's the case, then consider a simple scenario:&lt;/p&gt;  &lt;h5&gt;Background&lt;/h5&gt;  &lt;p&gt;Let's say you work for a software vendor (Foo) that sells a web application (how about employee payroll management) to businesses. You have an existing on-premise offering and an existing install base. This version of your software integrates with customer identity providers (e.g. Active Directory, Tivoli, etc.). &lt;/p&gt;  &lt;p&gt;Customer administrators can allow other employees access to the payroll system - this is driven by group membership (e.g. Domain Users have access). Internally the application uses a set of pre-defined roles, and assigns permissions based on role membership. As an example, consider the following simple model:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Active Directory Group= HR Payroll --&amp;gt; Application Role = Administrator&lt;/p&gt;    &lt;p&gt;Application Role = Administrator --&amp;gt; Permission = CreatePayroll&lt;/p&gt;    &lt;p&gt;Application Role = Administrator --&amp;gt; Permission = PrintPayrollChecks&lt;/p&gt;    &lt;p&gt;... &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This approach is known as &lt;a href="http://en.wikipedia.org/wiki/Role-Based_Access_Control"&gt;Role Bases Access Control (RBAC)&lt;/a&gt;. It's very simple, powerful, and very common.&lt;/p&gt;  &lt;p&gt;Given that Foo's existing offering is on-premise it works well. Initial setup requires some basic plumbing with a &lt;strong&gt;&lt;em&gt;single&lt;/em&gt;&lt;/strong&gt; on-premise identity provider and a bit of configuration by the application administrator.&lt;/p&gt;  &lt;h5&gt;The Winds of Change&lt;/h5&gt;  &lt;p&gt;Some of your existing customers and many prospects are asking for a hosted / cloud version of your payroll application. As your team considers options, it becomes apparent that a good long term approach is to modify the existing on-premise application to be multi-tenant. Modifying a single tenant application to be multi-tenant isn't a joke, but customers are demanding it, so you proceed.&lt;/p&gt;  &lt;p&gt;One of the things your team realizes pretty quickly is that the RBAC model in the on-premise application has to change a bit. The core concept of mapping groups to roles to permissions appears to still be viable, but now there are multiple identity providers. Your application now has to be able to differentiate Bar Corporation Groups from Baz Corporation Groups.&lt;/p&gt;  &lt;p&gt;Luckily most of the software vendors that sell identity providers have built versions of their identity providers that will expose groups and other identity attributes outside of the corporate LAN. I believe that Microsoft's offering in this area is outstanding (Geneva Server, Geneva Framework, Microsoft Services Connector and the Federation Gateway - see &lt;a href="http://www.identityblog.com/"&gt;Kim Cameron's blog&lt;/a&gt; for fantastic details). Concretely, this means that the hosted, multi-tenant version of your application can federate with lots of different corporate identity providers.&lt;/p&gt;  &lt;h5&gt;The Access Control Service&lt;/h5&gt;  &lt;p&gt;There is still a problem, however. You'll have to add quite a bit of code to your application to accept and parse tokens from these identity providers. To top it off, you'll have to make it pretty flexible and configurable. This is where the Access Control Service shines. In a nutshell, it is a service that simplifies interactions with any standards based identity provider, and allows you to define rules that transform Groups to Application Roles to Application Permissions.&lt;/p&gt;  &lt;p&gt;To put it another way, your application won't have to directly interact with any identity providers. It can trust tokens from the Access Control Service. The Access Control Service will handle the gory details of decrypting, verifying and parsing tokens, extracting Groups (or other identity attributes) from tokens, and mapping Groups to Application Roles to Permissions. The end result is a single sign-on experience for your customers, and a simplified code base. &lt;/p&gt;  &lt;p&gt;Up next - the common interaction model of the Access Control Service &amp;amp; why claims disciples call it a &lt;em&gt;&lt;strong&gt;claims transformer&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9051762" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Access+Control+Service/default.aspx">Access Control Service</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/.NET+Services/default.aspx">.NET Services</category></item><item><title>.NET Services - Launch at PDC 08</title><link>http://blogs.msdn.com/justinjsmith/archive/2008/10/27/net-services-launch-at-pdc-08.aspx</link><pubDate>Mon, 27 Oct 2008 18:39:03 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9018394</guid><dc:creator>justinjsmith</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/9018394.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=9018394</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=9018394</wfw:comment><description>&lt;p&gt;Today we announced the CTP release of .NET Services! For quite a while now, I have been working on this project. It's great to see it announced and to have customers use our services. .NET Services consist of three services: the Service Bus, the Workflow Service, and my personal favorite: The Access Control Service. &lt;/p&gt;  &lt;p&gt;My focus has almost exclusively been on the Access Control Service, so expect it to be the main topic of this blog for quite a while. The Service Bus, Workflow Service, and the portals use the Access Control Service so I will likely spend some time on those as well.&lt;/p&gt;  &lt;p&gt;In a nutshell, the Access Control Service allows you factor access control code into a manageable collection of rules. Combined with Geneva Server and the Geneva Framework, you can do things like map groups to roles, and roles to permissions. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9018394" width="1" height="1"&gt;</description></item><item><title>Access Control rule changes in BizTalk Services R12</title><link>http://blogs.msdn.com/justinjsmith/archive/2008/07/16/access-control-rule-changes-in-biztalk-services-r12.aspx</link><pubDate>Wed, 16 Jul 2008 20:12:32 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8739328</guid><dc:creator>justinjsmith</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/8739328.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=8739328</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=8739328</wfw:comment><description>&lt;p&gt;Yesterday we released a new version of BizTalk Services (R12). Over the next few weeks I'll be updating my blog with descriptions of the identity related features we added in this release. For now I'd like to describe one of the most obvious changes to the way you create, view, and manage access control rules.&lt;/p&gt;  &lt;p&gt;To explain what these modes do, let me first describe the changes we made. Here are a few of the key concepts:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Every Identity Service account owns a Security Token Service (STS). &lt;/li&gt;    &lt;li&gt;An STS is composed of one or more scopes. &lt;/li&gt;    &lt;li&gt;A scope contains zero or more access control rules.&lt;/li&gt;    &lt;li&gt;An STS owner can grant another Identity Service account permission to edit the access control rules in a scope&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;2-4 are new. The messaging (also called relay) service uses these concepts. It has no Identity Service special privileges. It is using the same core features available to everyone else. The Messaging Service owns an STS and it defines a root scope of http://connect.biztalk.net/services/. When you create a new account (newaccount) in the Identity Service, the messaging service creates a new scope &lt;a href="http://connect.biztalk.net/services/newaccount"&gt;http://connect.biztalk.net/services/newaccount&lt;/a&gt;. The Messaging Service then grants (newaccount) the permission to edit access control rules in (and only in) that scope. This new account provisioning is done in a provisioning agent that uses our public API.&lt;/p&gt;  &lt;p&gt;Newaccount can also create a scope within that scope (like&amp;#160; &lt;a href="http://connect.biztalk.net/services/newaccount/newestscope"&gt;http://connect.biztalk.net/services/newaccount/newestscope&lt;/a&gt;). NewAccount can then grant another IdentityService account permission to edit access control rules within that scope.&lt;/p&gt;  &lt;p&gt;The behavior here is functionally similar to what an ISV might want (allow one of their customers to define access control rules for their &amp;#8220;chunk&amp;#8221; of the service).&lt;/p&gt;  &lt;p&gt;It is important to note that the access control rules that belong to the scope &lt;a href="http://connect.biztalk.net/services/newaccount"&gt;http://connect.biztalk.net/services/newaccount&lt;/a&gt; are &lt;b&gt;owned &lt;/b&gt;by the Messaging Service. NewAccount does not own the rules, it has just been granted permission to edit rules within that scope.&lt;/p&gt;  &lt;p&gt;When designing the UI we wanted the experience of editing access control rules in a scope owned by another account to be distinct from the experience of editing access control rules in scopes you own. Our first attempt at drawing this ownership boundary is to set the default UI mode to show only the scopes you own. We called the default mode &amp;#8220;Basic&amp;#8221;. The mode that provides visibility into scopes owned by other accounts is called &amp;#8220;Advanced&amp;#8221;. In short, if you want to work with the access control rules in the messaging service scope (or the workflow scope), you can switch the mode to &amp;#8220;Advanced&amp;#8221; (shown below).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/AccessControlrulechangesinBizTalkService_8F80/clip_image001_2.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="141" alt="clip_image001" src="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/AccessControlrulechangesinBizTalkService_8F80/clip_image001_thumb.jpg" width="170" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In keeping with the traditions of BizTalk Services, we love feedback &amp;#8211; let us know what you think&amp;#8230;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8739328" width="1" height="1"&gt;</description></item><item><title>BizTalk Services and "Add Service Reference"</title><link>http://blogs.msdn.com/justinjsmith/archive/2008/04/08/biztalk-services-and-add-service-reference.aspx</link><pubDate>Wed, 09 Apr 2008 00:34:07 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8370072</guid><dc:creator>justinjsmith</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/8370072.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=8370072</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=8370072</wfw:comment><description>&lt;p&gt;One of the little known features of BizTalk Services is it's support for metadata. There's a sample in the SDK (default path: C:\Program Files\Microsoft BizTalk Services SDK\Samples\Communication\ExploringFeatures\Metadata\MetadataExchange\CS30) that shows you how to listen for incoming metadata requests through the relay. It tracks with the WCF metadata story and is built on WCF extensibility points. In fact, if you open the machine.config file, you will see the policy importers and the WSDL extensions.&lt;/p&gt;  &lt;p&gt;The end user experience is quite simple. At some point, you setup the service behavior&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;behaviors&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;serviceBehaviors&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="rem"&gt;&amp;lt;!-- Application Behaviors --&amp;gt;&lt;/span&gt;
     &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;behavior&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;serviceMetadata&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
       &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;serviceMetadata&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
     &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;behavior&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;serviceBehaviors&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;behaviors&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;

&lt;p&gt;Next you define an endpoint - (Notice the binding is the RelayBinding and not the normal metadata binding.)&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;endpoint&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;MexEndpoint&amp;quot;&lt;/span&gt;
          &lt;span class="attr"&gt;contract&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;IMetadataExchange&amp;quot;&lt;/span&gt;
          &lt;span class="attr"&gt;binding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;relayBinding&amp;quot;&lt;/span&gt;
          &lt;span class="attr"&gt;bindingConfiguration&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;default&amp;quot;&lt;/span&gt; 
          &lt;span class="attr"&gt;address&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;mex&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;That's about all that's required to expose metadata.&lt;/p&gt;

&lt;p&gt;Consuming it is just as easy. From a new VS project, all you have to do is right click the project and select &amp;quot;Add Service Reference&amp;quot; (VS 2008).&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/BizTalkServicesandAddServiceReference_C1B0/image9.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="247" alt="image" src="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/BizTalkServicesandAddServiceReference_C1B0/image9_thumb.png" width="268" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;In the next window, enter the service bus URI (like sb://connect.biztalk.net/services/justinjsmith/Echo) and click Go:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/BizTalkServicesandAddServiceReference_C1B0/addref_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="287" alt="addref" src="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/BizTalkServicesandAddServiceReference_C1B0/addref_thumb_1.png" width="354" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;When you click OK, the tooling (think svcutil) will generate the proxy code and config for you. In an empty project, literally the only two lines of code you have to write are:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;EchoContractClient client = &lt;span class="kwrd"&gt;new&lt;/span&gt; EchoContractClient();
Console.WriteLine(client.Echo(&lt;span class="str"&gt;&amp;quot;hi there&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8370072" width="1" height="1"&gt;</description></item></channel></rss>