<?xml version="1.0" encoding="utf-8"?>
<feed xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom">
  <title>www.leastprivilege.com</title>
  <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/" />
  <link rel="self" href="http://www.leastprivilege.com/SyndicationService.asmx/GetAtom" />
  <logo>http://www.leastprivilege.com/favicon.ico</logo>
  <icon>favicon.ico</icon>
  <updated>2010-08-14T19:21:46.4567744+02:00</updated>
  <author>
    <name>Dominick Baier</name>
  </author>
  <subtitle>dominick baier on .net, security and other stuff</subtitle>
  <id>http://www.leastprivilege.com/</id>
  <generator uri="http://www.dasblog.net" version="2.0.7180.0">DasBlog</generator>
  <entry>
    <title>Access Control Service v2</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/AccessControlServiceV2.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=c7f5e610-2327-4ff3-8961-1086a48f2583</id>
    <published>2010-08-14T19:20:36.7072208+02:00</published>
    <updated>2010-08-14T19:21:46.4567744+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
A Resource-STS (others call it RP-STS or federation gateway) is a necessity for non-trivial
federated identity scenarios. ADFS v2 does an excellent job in fulfilling that role
– but (as of now) you have to run ADFS on-premise.
</p>
        <p>
The Azure Access Control Service is a Resource-STS in the cloud (with all the usual
scalability/availability) promises. Unfortunately a lot of (the more interesting)
features in ACS v1 had to be cut due to constrained time/resources.
</p>
        <p>
The good news is that ACS v2 is now in CTP and brings back a lot of the missing features
(like WS* support) and adds some really sweet new ones (out of the box federation
with Google, Facebook, LiveID – and OpenId in general). You can read about the details <a href="http://www.dynamic-cast.com/files/2010-08-05-01.php">here</a>.
</p>
        <p>
On a related note – ACS v2 works out of the box with StarterSTS – simply choose the
ADFS v2 option and point the management portal to the StarterSTS WS-Federation metadata
endpoint. Have fun ;)
</p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=c7f5e610-2327-4ff3-8961-1086a48f2583" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Moving StarterSTS to the (Azure) Cloud</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/MovingStarterSTSToTheAzureCloud.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=f0716a08-59c5-422b-8b82-4cd5a6fa2bfe</id>
    <published>2010-08-12T06:21:52.0284613+02:00</published>
    <updated>2010-08-12T06:21:52.0284613+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Quite some people asked me about an Azure version of StarterSTS. While I kinda knew
what I had to do to make the move, I couldn’t find the time. Until recently.<br /></p>
        <p>
This blog post briefly documents the necessary changes and design decisions for the
next version of StarterSTS which will work both on-premise and on Azure.
</p>
        <p>
          <strong>Provider<br /></strong>Fortunately StarterSTS is already based on the idea of “providers”. Authentication,
roles and claims generation is based on the standard ASP.NET provider infrastructure.
This makes the migration to different data stores less painful. In my case I simply
moved the ASP.NET provider database to SQL Azure and still use the standard SQL Server
based membership, roles and profile provider.<br />
In addition StarterSTS has its own providers to abstract resource access for certificates,
relying party registration, client certificate registration and delegation. So I only
had to provide new implementations. Signing and SSL keys now go in the Azure certificate
store and user mappings (client certificates and delegation settings) have been moved
to Azure table storage.<br />
The one thing I didn’t anticipate when I originally wrote StarterSTS was the need
to also encapsulate configuration. Currently configuration is “locked” to the standard
.NET configuration system. The new version will have a pluggable <em>SettingsProvider</em> with
versions for .NET configuration as well as Azure service configuration. If you want
to externalize these settings into e.g. a database, it is now just a matter of supplying
a corresponding provider.<br />
Moving between the on-premise and Azure version will be just a matter of using different
providers.
</p>
        <p>
          <strong>URL Handling<br /></strong>Another thing that’s substantially different on Azure (and load balanced
scenarios in general) is the handling of URLs. In farm scenarios, the standard APIs
like ASP.NET’s Request.Url return the current (internal) machine name, but you typically
need the address of the external facing load balancer.<br />
There’s a hotfix for WCF 3.5 (included in v4) that fixes this for WCF metadata. This
was accomplished by using the HTTP Host header to generate URLs instead of the local
machine name. I now use the same approach for generating WS-Federation metadata as
well as information card files.
</p>
        <p>
          <strong>New Features<br /></strong>I introduced a cache provider. Since we now have slightly more expensive
lookups (e.g. relying party data from table storage), it makes sense to cache certain
data in the front end. The default implementation uses the ASP.NET web cache and can
be easily extended to use products like memcached or AppFabric Caching.<br />
Starting with the relying party provider, I now also provide a read/write interface.
This allows building management interfaces on top of this provider. I also include
a (very) simple web page that allows working with the relying party provider data.
I guess I will use the same approach for other providers in the future as well.<br />
I am also doing some work on the tracing and health monitoring area. Especially important
for the Azure version.<br /></p>
        <p>
Stay tuned.
</p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=f0716a08-59c5-422b-8b82-4cd5a6fa2bfe" />
      </div>
    </content>
  </entry>
  <entry>
    <title>StarterRP v1.2</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/StarterRPV12.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=1d763681-a19e-44cd-8c4f-f0e5cd4f41e9</id>
    <published>2010-08-11T19:16:44.2819311+02:00</published>
    <updated>2010-08-11T19:16:44.2819311+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
A small update for StarterRP is now live on <a href="http://startersts.codeplex.com/releases/view/50432">codeplex</a>.
</p>
        <p>
This version is based on .NET v4 and includes two sample Silverlight clients. Major
update to StarterSTS coming soon…
</p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=1d763681-a19e-44cd-8c4f-f0e5cd4f41e9" />
      </div>
    </content>
  </entry>
  <entry>
    <title>WIF, ASP.NET 4.0 and Request Validation</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/WIFASPNET40AndRequestValidation.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=b5028a25-6e10-40ab-b229-c54b30529ff5</id>
    <published>2010-07-24T10:14:36.2303292+02:00</published>
    <updated>2010-07-24T10:14:36.2303292+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="html">&lt;p&gt;
Since the response of a WS-Federation sign-in request contains XML, the ASP.NET built-in
request validation will trigger an exception. To solve this, request validation needs
to be turned off for pages receiving such a response message.
&lt;/p&gt;
&lt;p&gt;
Starting with ASP.NET 4.0 you can plug in your own request validation logic. This
allows letting WS-Federation messages through, while applying all standard request
validation to all other requests. The WIF SDK (v4) contains a sample validator that
does exactly that:
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue"&gt;public&lt;/span&gt;&lt;span style="font-family: consolas"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;WSFedRequestValidator&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;RequestValidator&lt;/span&gt;
&lt;br&gt;&lt;?xml:namespace prefix = o /&gt;
{&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; IsValidRequestString(&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt; context, 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt; value, 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;RequestValidationSource&lt;/span&gt; requestValidationSource, 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt; collectionKey, 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;out&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; validationFailureIndex)&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;validationFailureIndex
= 0;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas"&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (
requestValidationSource == &lt;span style="color: #2b91af"&gt;RequestValidationSource&lt;/span&gt;.Form
&amp;amp;&amp;amp; 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;collectionKey.Equals( 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WSFederationConstants&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Parameters&lt;/span&gt;.Result, 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;StringComparison&lt;/span&gt;.Ordinal
) )&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SignInResponseMessage&lt;/span&gt; message
= 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WSFederationMessage&lt;/span&gt;.CreateFromFormPost(context.Request) 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af"&gt;SignInResponseMessage&lt;/span&gt;;&lt;br&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (message
!= &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;base&lt;/span&gt;.IsValidRequestString( 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;context, 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;value, 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;requestValidationSource, 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;collectionKey, 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;out&lt;/span&gt; validationFailureIndex
);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
}&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;o:p&gt;Register this validator via web.config:&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515"&gt;httpRuntime&lt;/span&gt;&lt;span style="font-family: consolas; color: blue"&gt; &lt;/span&gt;&lt;span style="font-family: consolas; color: red"&gt;requestValidationType&lt;/span&gt;&lt;span style="font-family: consolas; color: blue"&gt;=&lt;/span&gt;&lt;span style="font-family: consolas"&gt;"&lt;span style="color: blue"&gt;WSFedRequestValidator&lt;/span&gt;"&lt;span style="color: blue"&gt; /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=b5028a25-6e10-40ab-b229-c54b30529ff5" /&gt;</content>
  </entry>
  <entry>
    <title>StarterSTS v1.2</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/StarterSTSV12.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=d2c021ba-c8cc-4e72-b322-66ed222b9c51</id>
    <published>2010-07-22T11:23:30.4375269+02:00</published>
    <updated>2010-07-22T11:23:30.4375269+02:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
I just uploaded version 1.2 of StarterSTS. This is simply a conversion of v1.1 to
a web application project. Some people have asked for it so here we go.
</p>
        <p>
This version is still compiled against .NET 3.5 SP1 – but this will the last release.
All upcoming releases will be .NET 4.0.
</p>
        <p>
          <a href="http://startersts.codeplex.com/">Codeplex Site</a>
        </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=d2c021ba-c8cc-4e72-b322-66ed222b9c51" />
      </div>
    </content>
  </entry>
  <entry>
    <title>IIS &amp;amp; RESTful Services #FAIL</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/IISAmpRESTfulServicesFAIL.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=85aac735-9853-4987-bcfc-6685878c6803</id>
    <published>2010-07-21T22:39:18.1983991+02:00</published>
    <updated>2010-07-21T22:39:18.1983991+02:00</updated>
    <category term="IIS" label="IIS" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IIS" />
    <category term="WCF" label="WCF" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=WCF" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
really? when will super duper IIS finally support non-Windows accounts for HTTP authentication?
</p>
        <p>
          <a title="http://blogs.msdn.com/b/astoriateam/archive/2010/07/21/odata-and-authentication-part-6-custom-basic-authentication.aspx" href="http://blogs.msdn.com/b/astoriateam/archive/2010/07/21/odata-and-authentication-part-6-custom-basic-authentication.aspx">http://blogs.msdn.com/b/astoriateam/archive/2010/07/21/odata-and-authentication-part-6-custom-basic-authentication.aspx</a>
        </p>
        <p>
see here for a complete module including IIS management integration:
</p>
        <p>
          <a href="http://custombasicauth.codeplex.com">http://custombasicauth.codeplex.com</a>
        </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=85aac735-9853-4987-bcfc-6685878c6803" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Re-MVP&amp;rsquo;d 2010</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/ReMVPrsquod2010.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=ec3f63f1-fba9-4aac-aaf8-b02eab78ae6b</id>
    <published>2010-07-20T07:33:43.0418433+02:00</published>
    <updated>2010-07-20T07:33:43.0418433+02:00</updated>
    <category term="Misc" label="Misc" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=Misc" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
As always: thank you Microsoft!
</p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=ec3f63f1-fba9-4aac-aaf8-b02eab78ae6b" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Modifying the SL/WIF Integration Bits to support Issued Token Credentials</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/ModifyingTheSLWIFIntegrationBitsToSupportIssuedTokenCredentials.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=6053a2b2-df33-4a95-8858-887e24e2c4d5</id>
    <published>2010-06-22T08:45:17.0235909+02:00</published>
    <updated>2010-06-22T08:45:17.0235909+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
The SL/WIF integration code that ships with the Identity Training Kit only supports
Windows and UserName credentials to request tokens from an STS. This is fine for simple
single STS scenarios (like a single IdP). But the more common pattern for claims/token
based systems is to split the STS roles into an IdP and a Resource STS (or whatever
you wanna call it). 
</p>
        <p>
In this case, the 2nd leg requires to present the issued token from the 1st leg –
this is not directly supported by the bits. But they can be easily modified to accomplish
this.
</p>
        <p>
          <strong>The Credential</strong>
          <br />
Fist we need a class that represents an issued token credential. Here we store the
RSTR that got returned from the client to IdP request:
</p>
        <pre style="font-family: consolas">
          <span style="color: blue">public</span> <span style="color: blue">class</span> <span style="color: #2b91af">IssuedTokenCredentials</span> : <span style="color: #2b91af">IRequestCredentials</span><br />
{<br />
    <span style="color: blue">public</span> <span style="color: blue">string</span> IssuedToken
{ <span style="color: blue">get</span>; <span style="color: blue">set</span>; }<br />
    <span style="color: blue">public</span> <span style="color: #2b91af">RequestSecurityTokenResponse</span> RSTR
{ <span style="color: blue">get</span>; <span style="color: blue">set</span>; }<br /><br />
    <span style="color: blue">public</span> IssuedTokenCredentials(<span style="color: #2b91af">RequestSecurityTokenResponse</span> rstr)<br />
    {<br />
        RSTR = rstr;<br />
        IssuedToken = rstr.RequestedSecurityToken.RawToken;<br />
    }<br />
}</pre>
        <p>
          <strong>The Binding<br /></strong>Next we need a binding to be used with issued token credential requests.
This assumes you have an STS endpoint for mixed mode security with SecureConversation
turned off.
</p>
        <pre style="font-family: consolas">
          <span style="color: blue">public</span> <span style="color: blue">class</span> <span style="color: #2b91af">WSTrustBindingIssuedTokenMixed</span> : <span style="color: #2b91af">WSTrustBinding</span><br />
{<br />
    <span style="color: blue">public</span> WSTrustBindingIssuedTokenMixed()<br />
    {<br />
        <span style="color: blue">this</span>.Elements.Add( <span style="color: blue">new</span> <span style="color: #2b91af">HttpsTransportBindingElement</span>()
);<br />
    }<br />
}</pre>
        <p>
          <strong>WSTrustClient</strong>
          <br />
The last step is to make some modifications to <em>WSTrustClient</em> to make it issued
token aware. In the constructor you have to check for the credential type, and if
it is an issued token, store it away.
</p>
        <pre style="font-family: consolas">
          <span style="color: blue">private</span> <span style="color: #2b91af">RequestSecurityTokenResponse</span> _rstr;<br /></pre>
        <pre style="font-family: consolas">
          <span style="color: blue">public</span> WSTrustClient( <span style="color: #2b91af">Binding</span> binding, <span style="color: #2b91af">EndpointAddress</span> remoteAddress, 
<br /><span style="color: #2b91af">IRequestCredentials</span> credentials )<br />
    : <span style="color: blue">base</span>( binding, remoteAddress
)<br />
{<br />
    <span style="color: blue">if</span> ( <span style="color: blue">null</span> ==
credentials )<br />
    {<br />
        <span style="color: blue">throw</span> <span style="color: blue">new</span> <span style="color: #2b91af">ArgumentNullException</span>( <span style="color: #a31515">"credentials"</span> );<br />
    }<br /><br />
    <span style="color: blue">if</span> (credentials <span style="color: blue">is</span> <span style="color: #2b91af">UsernameCredentials</span>)<br />
    {<br />
        <span style="color: #2b91af">UsernameCredentials</span> usernname
= credentials <span style="color: blue">as</span> <span style="color: #2b91af">UsernameCredentials</span>;<br />
        <span style="color: blue">base</span>.ChannelFactory.Credentials.UserName.UserName
= usernname.Username;<br />
        <span style="color: blue">base</span>.ChannelFactory.Credentials.UserName.Password
= usernname.Password;<br />
    }<br />
    <span style="color: blue">else</span> <span style="color: blue">if</span> (credentials <span style="color: blue">is</span> <span style="color: #2b91af">IssuedTokenCredentials</span>)<br />
    {<br />
        <span style="color: blue">var</span> issuedToken
= credentials <span style="color: blue">as</span> <span style="color: #2b91af">IssuedTokenCredentials</span>;<br />
        _rstr = issuedToken.RSTR;<br />
    }<br />
    <span style="color: blue">else</span> <span style="color: blue">if</span> (credentials <span style="color: blue">is</span> <span style="color: #2b91af">WindowsCredentials</span>)<br />
    { }<br />
    <span style="color: blue">else</span><br />
    {<br />
        <span style="color: blue">throw</span> <span style="color: blue">new</span> <span style="color: #2b91af">ArgumentOutOfRangeException</span>(<span style="color: #a31515">"credentials"</span>, <span style="color: #a31515">"type
was not expected"</span>);<br />
    }<br />
}</pre>
        <p>
Next – when <em>WSTrustClient</em> constructs the RST message to the STS, the issued
token header must be embedded when needed:
</p>
        <pre style="font-family: consolas">
          <span style="color: blue">private</span> <span style="color: #2b91af">Message</span> BuildRequestAsMessage( <span style="color: #2b91af">RequestSecurityToken</span> request
)<br />
{<br />
    <span style="color: blue">var</span> message = <span style="color: #2b91af">Message</span>.CreateMessage( 
<br /><span style="color: blue">base</span>.Endpoint.Binding.MessageVersion ?? <span style="color: #2b91af">MessageVersion</span>.Default,<br />
      IssueAction,<br />
      (<span style="color: #2b91af">BodyWriter</span>) <span style="color: blue">new</span> <span style="color: #2b91af">WSTrustRequestBodyWriter</span>(
request ) );<br /><br />
    <span style="color: blue">if</span> (_rstr != <span style="color: blue">null</span>)<br />
    {<br />
        message.Headers.Add(<span style="color: blue">new</span> <span style="color: #2b91af">IssuedTokenHeader</span>(_rstr));<br />
    }<br /><br />
    <span style="color: blue">return</span> message;<br />
}</pre>
        <p>
HTH
</p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=6053a2b2-df33-4a95-8858-887e24e2c4d5" />
      </div>
    </content>
  </entry>
  <entry>
    <title>StarterSTS 1.1</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/StarterSTS11.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=ac366b22-e9a9-45f1-82bf-2a049cc7024b</id>
    <published>2010-06-10T10:07:49.6612685+02:00</published>
    <updated>2010-06-10T10:07:49.6612685+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Earlier today I uploaded <a href="http://startersts.codeplex.com/releases/view/46943">StarterSTS
1.1</a> and <a href="http://startersts.codeplex.com/releases/view/46942">StarterRP
1.1</a> to codeplex.
</p>
        <p>
I added identity delegation for internal as well as OpenID accounts and also updated
StarterRP to show these features.
</p>
        <p>
I also recorded an updated <a href="http://identity.thinktecture.com/download/starterSTS/v1/StarterSTS_ActAs.wmv">screencast</a> on
delegation since some of the config settings have changed since the CTP.
</p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=ac366b22-e9a9-45f1-82bf-2a049cc7024b" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Video of Moxie Marlinspike&amp;rsquo;s &amp;ldquo;More Tricks for Defeating SSL&amp;rdquo; talk</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/VideoOfMoxieMarlinspikersquosLdquoMoreTricksForDefeatingSSLrdquoTalk.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=758d7fc1-a196-4a0a-8e07-c0c8cb63f3c1</id>
    <published>2010-05-27T12:59:05.2183273+02:00</published>
    <updated>2010-05-27T12:59:11.7494937+02:00</updated>
    <category term="Misc" label="Misc" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=Misc" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a title="http://www.mefeedia.com/watch/26711228" href="http://www.mefeedia.com/watch/26711228">http://www.mefeedia.com/watch/26711228</a>
        </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=758d7fc1-a196-4a0a-8e07-c0c8cb63f3c1" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Updated StarterSTS Documentation &amp;amp; Identity Delegation Screencast</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/UpdatedStarterSTSDocumentationAmpIdentityDelegationScreencast.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=9ea5fe43-9dee-4cc0-a068-d8592e61ebec</id>
    <published>2010-05-26T09:42:59.4871026+02:00</published>
    <updated>2010-05-26T09:42:59.4871026+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
I recorded a short screencast describing the identity delegation feature in <a href="http://startersts.codeplex.com/releases/view/45813">StarterSTS
1.1</a>. You can watch it <a href="http://identity.thinktecture.com/download/starterSTS/v1/StarterSTS_ActAs.wmv">here</a>.
</p>
        <p>
I also uploaded an updated version of the documentation <a href="https://identity.thinktecture.com/stsce/docs/">here</a>.
</p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=9ea5fe43-9dee-4cc0-a068-d8592e61ebec" />
      </div>
    </content>
  </entry>
  <entry>
    <title>StarterSTS 1.1 CTP &amp;ndash; ActAs Support</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/StarterSTS11CTPNdashActAsSupport.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=a055388d-328c-4067-aa67-0df5e1b4fb12</id>
    <published>2010-05-24T14:05:19.8444996+02:00</published>
    <updated>2010-05-24T14:05:19.8444996+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="html">&lt;p&gt;
Due to popular demand, I added identity delegation (aka ActAs) support to StarterSTS.
&lt;/p&gt;
&lt;p&gt;
To give this feature a try, first &lt;a href="http://startersts.codeplex.com/releases/view/45813"&gt;download&lt;/a&gt; the
new bits and add a &lt;em&gt;enableActAs = true&lt;/em&gt; to &lt;em&gt;startersts.config&lt;/em&gt;. You
then have to configure which user account is allowed to delegate, as well as the target
realm to delegate to. This is done in &lt;em&gt;usermappings.config&lt;/em&gt;, e.g.:
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-no-proof: yes"&gt;userMappings&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt; &lt;/span&gt;&lt;span style="font-family: consolas; color: red; mso-no-proof: yes"&gt;xmlns&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;"&lt;span style="color: blue"&gt;http://www.thinktecture.com/configuration/usermappings&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-no-proof: yes"&gt;user&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt; &lt;/span&gt;&lt;span style="font-family: consolas; color: red; mso-no-proof: yes"&gt;name&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;"&lt;span style="color: blue"&gt;middletier&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-no-proof: yes"&gt;mappings&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-no-proof: yes"&gt;mapping&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt; &lt;/span&gt;&lt;span style="font-family: consolas; color: red; mso-no-proof: yes"&gt;type&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;"&lt;span style="color: blue"&gt;ActAs&lt;/span&gt;"&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: red; mso-no-proof: yes"&gt;value&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;"&lt;span style="color: blue"&gt;https://server/service.svc&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-no-proof: yes"&gt;mappings&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-no-proof: yes"&gt;user&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-no-proof: yes"&gt;users&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-no-proof: yes"&gt;userMappings&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;&lt;?xml:namespace prefix = o /&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Please use the &lt;a href="http://startersts.codeplex.com/Thread/List.aspx"&gt;forum&lt;/a&gt; for
any feedback. thanks!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=a055388d-328c-4067-aa67-0df5e1b4fb12" /&gt;</content>
  </entry>
  <entry>
    <title>A more elegant way of embedding a SOAP security header in Silverlight 4</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/AMoreElegantWayOfEmbeddingASOAPSecurityHeaderInSilverlight4.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=93f268e4-a48f-42e1-afd3-9034b3426968</id>
    <published>2010-05-14T07:01:54.8883031+02:00</published>
    <updated>2010-05-14T07:01:54.8883031+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="html">&lt;p&gt;
The current situation with Silverlight is, that there is no support for the WCF federation
binding. This means that all security token related interactions have to be done manually.
&lt;/p&gt;
&lt;p&gt;
Requesting the token from an STS is not really the bad part, sending it along with
outgoing SOAP messages is what’s a little annoying. So far you had to wrap all calls
on the channel in an &lt;em&gt;OperationContextScope&lt;/em&gt; wrapping an &lt;em&gt;IContextChannel&lt;/em&gt;.
This “programming model” was a little disruptive (in addition to all the async stuff
that you are forced to do).
&lt;/p&gt;
&lt;p&gt;
It seems that starting with SL4 there is more support for traditional WCF extensibility
points – especially &lt;em&gt;IEndpointBehavior&lt;/em&gt;, &lt;em&gt;IClientMessageInspector&lt;/em&gt;.
I never read somewhere that these are new features in SL4 – but I am pretty sure they
did not exist in SL3.
&lt;/p&gt;
&lt;p&gt;
With the above mentioned interfaces at my disposal, I thought I have another go at
embedding a security header – and yeah – I managed to make the code much prettier
(and much less bizarre). Here’s the code for the behavior/inspector:
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue"&gt;public&lt;/span&gt;&lt;span style="font-family: consolas"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IssuedTokenHeaderInspector&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;IClientMessageInspector&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas"&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;RequestSecurityTokenResponse&lt;/span&gt; _rstr;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;?xml:namespace prefix = o /&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; IssuedTokenHeaderInspector(&lt;span style="color: #2b91af"&gt;RequestSecurityTokenResponse&lt;/span&gt; rstr)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;_rstr
= rstr;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; AfterReceiveReply(&lt;span style="color: blue"&gt;ref&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Message&lt;/span&gt; reply, &lt;span style="color: blue"&gt;object&lt;/span&gt; correlationState)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{
}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;object&lt;/span&gt; BeforeSendRequest(&lt;span style="color: blue"&gt;ref&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Message&lt;/span&gt; request, &lt;span style="color: #2b91af"&gt;IClientChannel&lt;/span&gt; channel)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;request.Headers.Add(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IssuedTokenHeader&lt;/span&gt;(_rstr));&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;}&lt;br&gt;
&lt;/span&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue"&gt;public&lt;/span&gt;&lt;span style="font-family: consolas"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IssuedTokenHeaderBehavior&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;IEndpointBehavior&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas"&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;RequestSecurityTokenResponse&lt;/span&gt; _rstr;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; IssuedTokenHeaderBehavior(&lt;span style="color: #2b91af"&gt;RequestSecurityTokenResponse&lt;/span&gt; rstr)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (rstr
== &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;();&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;_rstr
= rstr;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ApplyClientBehavior(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;ServiceEndpoint&lt;/span&gt; endpoint, &lt;span style="color: #2b91af"&gt;ClientRuntime&lt;/span&gt; clientRuntime)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;clientRuntime.MessageInspectors.Add(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IssuedTokenHeaderInspector&lt;/span&gt;(_rstr));&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;//
rest omitted&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas"&gt;}&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;o:p&gt;This allows to set up a proxy with an issued token header and you don’t have to worry anymore with embedding the header manually with every call:&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue"&gt;var&lt;/span&gt;&lt;span style="font-family: consolas"&gt; client
= GetWSTrustClient();&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; color: blue"&gt;var&lt;/span&gt;&lt;span style="font-family: consolas"&gt; rst
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;RequestSecurityToken&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;WSTrust13Constants&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;KeyTypes&lt;/span&gt;.Symmetric)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AppliesTo
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EndpointAddress&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"https://rp/"&lt;/span&gt;)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;};&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;client.IssueCompleted += (s, args) =&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;_proxy
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;StarterServiceContractClient&lt;/span&gt;();&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;_proxy.Endpoint.Behaviors.Add(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IssuedTokenHeaderBehavior&lt;/span&gt;(args.Result));&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;};&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;client.IssueAsync(rst);&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;o:p&gt;Since SL4 also support the &lt;em&gt;IExtension&amp;lt;T&amp;gt;&lt;/em&gt; interface, you can also
combine this with Nicholas Allen’s &lt;a href="http://blogs.msdn.com/drnick/archive/2008/08/22/autoheader-extension.aspx"&gt;AutoHeaderExtension&lt;/a&gt;.&lt;/o:p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=93f268e4-a48f-42e1-afd3-9034b3426968" /&gt;</content>
  </entry>
  <entry>
    <title>Thinktecture.IdentityModel: WRAP and SWT Support</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/ThinktectureIdentityModelWRAPAndSWTSupport.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=d1dbd1e7-8a2e-464e-8162-dedd7564b3a6</id>
    <published>2010-05-09T22:27:46.1802428+02:00</published>
    <updated>2010-05-09T22:27:46.1802428+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="html">&lt;p&gt;
The latest drop of &lt;a href="http://identitymodel.codeplex.com/"&gt;Thinktecture.IdentityModel&lt;/a&gt; contains
some helpers for the Web Resource Authorization Protocol (WRAP) and Simple Web Tokens
(SWT).
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;WRAP&lt;br&gt;
&lt;/strong&gt;The &lt;em&gt;WrapClient&lt;/em&gt; class is a helper to request SWT tokens via WRAP.
It supports issuer/key, SWT and SAML input credentials, e.g.:
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;var&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; client
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;WrapClient&lt;/span&gt;(wrapEp);&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;var&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; swt
= client.Issue(issuerName, issuerKey, scope);&lt;/span&gt;&lt;span style="mso-ansi-language: en-us" lang="EN-US"&gt;&lt;?xml:namespace prefix = o /&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
All &lt;em&gt;Issue&lt;/em&gt; overrides return a &lt;em&gt;SimpleWebToken&lt;/em&gt; type, which brings me
to the next helper class.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;SWT&lt;br&gt;
&lt;/strong&gt;The &lt;em&gt;SimpleWebToken&lt;/em&gt; class wraps a SWT token. It combines a number
of features:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
conversion between string format and CLR type representation&lt;/li&gt;
&lt;li&gt;
creation of SWT tokens&lt;/li&gt;
&lt;li&gt;
validation of SWT token&lt;/li&gt;
&lt;li&gt;
projection of SWT token as &lt;em&gt;IClaimsIdentity&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
helpers to embed SWT token in headers and query strings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The following sample code generates a SWT token using the helper class:
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;private&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; CreateSwtToken()&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; signingKey
= &lt;span style="color: #a31515"&gt;"wA…"&lt;/span&gt;;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; audience
= &lt;span style="color: #a31515"&gt;"http://websample"&lt;/span&gt;;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; issuer
= &lt;span style="color: #a31515"&gt;"http://self"&lt;/span&gt;;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; token
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;SimpleWebToken&lt;/span&gt;(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; issuer, audience, &lt;span style="color: #2b91af"&gt;Convert&lt;/span&gt;.FromBase64String(signingKey));&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;token.AddClaim(&lt;span style="color: #2b91af"&gt;ClaimTypes&lt;/span&gt;.Name, &lt;span style="color: #a31515"&gt;"dominick"&lt;/span&gt;);&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;token.AddClaim(&lt;span style="color: #2b91af"&gt;ClaimTypes&lt;/span&gt;.Role, &lt;span style="color: #a31515"&gt;"Users"&lt;/span&gt;);&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;token.AddClaim(&lt;span style="color: #2b91af"&gt;ClaimTypes&lt;/span&gt;.Role, &lt;span style="color: #a31515"&gt;"Administrators"&lt;/span&gt;);&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;token.AddClaim(&lt;span style="color: #a31515"&gt;"simple"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"test"&lt;/span&gt;);&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; token.ToString();&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;}&lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=d1dbd1e7-8a2e-464e-8162-dedd7564b3a6" /&gt;</content>
  </entry>
  <entry>
    <title>Thinktecture.IdentityModel: Comparing Strings without leaking Timinig Information</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/ThinktectureIdentityModelComparingStringsWithoutLeakingTiminigInformation.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=a40f14bd-72a6-45cb-9073-d7514d8a5e32</id>
    <published>2010-05-08T21:51:07.2829194+02:00</published>
    <updated>2010-05-08T21:51:07.2829194+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="html">&lt;p&gt;
&lt;a href="https://www.isecpartners.com/"&gt;Paul Hill&lt;/a&gt; commented on a recent post where
I was comparing HMACSHA256 signatures. In a nutshell his complaint was that I am leaking
timing information while doing so – or in other words, my code returned faster with
wrong (or partially wrong) signatures than with the correct signature. This can be
potentially used for timing attacks like &lt;a href="http://rdist.root.org/2009/05/28/timing-attack-in-google-keyczar-library/"&gt;this&lt;/a&gt; &lt;a href="http://crypto.stanford.edu/~dabo/papers/ssl-timing.pdf"&gt;one&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
I think he got a point here, especially in the era of cloud computing where you can
potentially run attack code on the same physical machine as your target to do high
resolution timing analysis (see &lt;a href="http://cseweb.ucsd.edu/~hovav/dist/cloudsec.pdf"&gt;here&lt;/a&gt; for
an example).
&lt;/p&gt;
&lt;p&gt;
It turns out that it is not that easy to write a time-constant string comparer due
to all sort of (unexpected) clever optimization mechanisms in the CLR. With the help
and feedback of Paul and Shawn I came up with this:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Structure the code in a way that the CLR will not try to optimize it 
&lt;li&gt;
In addition turn off optimization (just in case a future version will come up with
new optimization methods) 
&lt;li&gt;
Add a random sleep when the comparison fails (using Shawn’s and Stephen’s nice &lt;em&gt;Random&lt;/em&gt; wrapper
for &lt;em&gt;RNGCryptoServiceProvider&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
You can find the full code in the &lt;a href="http://identitymodel.codeplex.com/"&gt;Thinktecture.IdentityModel&lt;/a&gt; download.
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;[&lt;span style="color: #2b91af"&gt;MethodImpl&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;MethodImplOptions&lt;/span&gt;.NoOptimization)]&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;public&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; IsEqual(&lt;span style="color: blue"&gt;string&lt;/span&gt; s1, &lt;span style="color: blue"&gt;string&lt;/span&gt; s2)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (s1
== &lt;span style="color: blue"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; s2 == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;?xml:namespace prefix = o /&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (s1
== &lt;span style="color: blue"&gt;null&lt;/span&gt; || s2 == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (s1.Length
!= s2.Length)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; s1chars
= s1.ToCharArray();&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; s2chars
= s2.ToCharArray();&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt; hits
= 0;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; i
= 0; i &amp;lt; s1.Length; i++)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (s1chars[i].Equals(s2chars[i]))&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;hits
+= 2;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;else&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;hits
+= 1;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;bool&lt;/span&gt; same
= (hits == s1.Length * 2);&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (!same)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; rnd
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CryptoRandom&lt;/span&gt;();&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;.Sleep(rnd.Next(0,
10));&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; same;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;}&lt;/span&gt;
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;&lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=a40f14bd-72a6-45cb-9073-d7514d8a5e32" /&gt;</content>
  </entry>
  <entry>
    <title>ADFS 2.0 RTW</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/ADFS20RTW.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=cde066d1-abdf-4e26-b37d-13a2a38c8899</id>
    <published>2010-05-05T19:40:56.4571782+02:00</published>
    <updated>2010-05-05T19:40:56.4571782+02:00</updated>
    <category term="Misc" label="Misc" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=Misc" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Finally – the identity story is complete (for now).
</p>
        <p>
          <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=118c3588-9070-426a-b655-6cec0a92c10b&amp;displaylang=en">Download</a> ADFS
2.0.
</p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=cde066d1-abdf-4e26-b37d-13a2a38c8899" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Thinktecture.IdentityModel: WIF Support for WCF REST Services and OData</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/ThinktectureIdentityModelWIFSupportForWCFRESTServicesAndOData.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=a2fb6370-2c92-49a1-818b-d3dc4fb69953</id>
    <published>2010-05-05T16:54:51.6775718+02:00</published>
    <updated>2010-05-05T16:54:51.6775718+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="html">&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
The latest drop of &lt;a href="http://identitymodel.codeplex.com/"&gt;Thinktecture.IdentityModel&lt;/a&gt; includes
plumbing and support for WIF, claims and tokens for WCF REST services and Data Services
(aka OData).
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://weblogs.asp.net/cibrax/"&gt;Cibrax&lt;/a&gt; has an alternative &lt;a href="http://weblogs.asp.net/cibrax/archive/2010/04/15/integrating-wif-with-wcf-data-services.aspx"&gt;implementation&lt;/a&gt; that
uses the WCF Rest Starter Kit. His recent post reminded me that I should finally “document”
that part of our library.
&lt;/p&gt;
&lt;p&gt;
Features include:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
generic plumbing for all &lt;em&gt;WebServiceHost&lt;/em&gt; derived WCF services 
&lt;li&gt;
support for SAML and SWT tokens 
&lt;li&gt;
support for &lt;em&gt;ClaimsAuthenticationManager&lt;/em&gt; and &lt;em&gt;ClaimsAuthorizationManager&lt;/em&gt; 
&lt;li&gt;
based solely on native WCF extensibility points (and WIF)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
This post walks you through the setup of an OData / WCF DataServices endpoint with
token authentication and claims support. This sample is also included in the codeplex
download along a similar sample for plain WCF REST services.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Setting up the Data Service&lt;br&gt;
&lt;/strong&gt;To prove the point I have created a simple WCF Data Service that renders
the claims of the current client as an OData set.
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;public&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ClaimsData&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;ViewClaim&lt;/span&gt;&amp;gt;
Claims&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; GetClaims().AsQueryable();
}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;?xml:namespace prefix = o /&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;ViewClaim&lt;/span&gt;&amp;gt;
GetClaims()&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; claims
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;ViewClaim&lt;/span&gt;&amp;gt;();&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; identity
= &lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;.CurrentPrincipal.Identity &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IClaimsIdentity&lt;/span&gt;;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt; id
= 0;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;identity.Claims.ToList().ForEach(claim
=&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;claims.Add(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ViewClaim&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Id
= ++id,&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ClaimType
= claim.ClaimType,&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Value
= claim.Value,&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Issuer
= claim.Issuer&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;});&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;});&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; claims;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;}&lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
…and hooked that up with a read only data service:
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;public&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ClaimsDataService&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;DataService&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;ClaimsData&lt;/span&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; InitializeService(&lt;span style="color: #2b91af"&gt;IDataServiceConfiguration&lt;/span&gt; config)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;config.SetEntitySetAccessRule(&lt;span style="color: #a31515"&gt;"*"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EntitySetRights&lt;/span&gt;.AllRead);&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;}&lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Enabling WIF&lt;br&gt;
&lt;/strong&gt;Before you enable WIF, you should generate your client proxies. Afterwards
the service will only accept requests with an access token – and svcutil does not
support that.
&lt;/p&gt;
&lt;p&gt;
All the WIF magic is done in a special service authorization manager called the &lt;em&gt;FederatedWebServiceAuthorizationManager&lt;/em&gt;.
This code checks incoming calls to see if the Authorization HTTP header (or X-Authorization
for environments where you are not allowed to set the authorization header) contains
a token. This header must either start with &lt;em&gt;SAML access_token=&lt;/em&gt; or &lt;em&gt;WRAP
access_token= &lt;/em&gt;(for SAML or SWT tokens respectively).
&lt;/p&gt;
&lt;p&gt;
For SAML validation, the plumbing uses the normal WIF configuration. For SWT you can
either pass in a &lt;em&gt;SimpleWebTokenRequirement&lt;/em&gt; or the &lt;em&gt;SwtIssuer&lt;/em&gt;, &lt;em&gt;SwtAudience &lt;/em&gt;and &lt;em&gt;SwtSigningKey &lt;/em&gt;app
settings are checked.If the token can be successfully validated, &lt;em&gt;ClaimsAuthenticationManager&lt;/em&gt; and &lt;em&gt;ClaimsAuthorizationManager&lt;/em&gt; are
invoked and the &lt;em&gt;IClaimsPrincipal&lt;/em&gt; gets established.
&lt;/p&gt;
&lt;p&gt;
The service authorization manager gets wired up by the &lt;em&gt;FederatedWebServiceHostFactory&lt;/em&gt;:
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;public&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;FederatedWebServiceHostFactory&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;WebServiceHostFactory&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ServiceHost&lt;/span&gt; CreateServiceHost(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Type&lt;/span&gt; serviceType, &lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;[]
baseAddresses)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; host
= &lt;span style="color: blue"&gt;base&lt;/span&gt;.CreateServiceHost(serviceType, baseAddresses);&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;host.Authorization.ServiceAuthorizationManager
= 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;FederatedWebServiceAuthorizationManager&lt;/span&gt;();&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;host.Authorization.PrincipalPermissionMode
= &lt;span style="color: #2b91af"&gt;PrincipalPermissionMode&lt;/span&gt;.Custom;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-no-proof: yes"&gt;return&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt; host;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;}&lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
The last step is to set up the .svc file to use the service host factory (see the
sample download).
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Calling the Service&lt;br&gt;
&lt;/strong&gt;To call the service you need to somehow get a token. This is up to you. You
can either use &lt;em&gt;WSTrustChannelFactory&lt;/em&gt; (for the full CLR), &lt;em&gt;WSTrustClient &lt;/em&gt;(Silverlight)
or some other way to obtain a token. The sample also includes code to generate SWT
tokens for testing – but the whole WRAP/SWT support will be subject of a separate
post.
&lt;/p&gt;
&lt;p&gt;
I created some extensions methods for the most common web clients (&lt;em&gt;WebClient&lt;/em&gt;, &lt;em&gt;HttpWebRequest&lt;/em&gt;, &lt;em&gt;DataServiceContext&lt;/em&gt;)
that allow easy setting of the token, e.g.:
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;public&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; SetAccessToken(&lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DataServiceContext&lt;/span&gt; context, 
&lt;br&gt;
&amp;nbsp; &lt;span style="color: blue"&gt;string&lt;/span&gt; token, &lt;span style="color: blue"&gt;string&lt;/span&gt; type, &lt;span style="color: blue"&gt;string&lt;/span&gt; headerName)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;context.SendingRequest
+= (s, e) =&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;e.RequestHeaders[headerName]
= GetHeader(token, type);&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;};&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;}&lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
Making a query against the Data Service could look like this:
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;static&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; CallService(&lt;span style="color: blue"&gt;string&lt;/span&gt; token, &lt;span style="color: blue"&gt;string&lt;/span&gt; type)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; data
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ClaimsData&lt;/span&gt;(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"https://server/odata.svc/"&lt;/span&gt;));&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;data.SetAccessToken(token,
type);&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;data.Claims.ToList().ForEach(c
=&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"{0}\n
{1}\n ({2})\n"&lt;/span&gt;, c.ClaimType, c.Value, c.Issuer));&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;}&lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
HTH
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=a2fb6370-2c92-49a1-818b-d3dc4fb69953" /&gt;</content>
  </entry>
  <entry>
    <title>Thinktecture.IdentityModel: Claims Debugger Visualizer</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/ThinktectureIdentityModelClaimsDebuggerVisualizer.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=59b221ce-482b-438f-9483-0d9e195b8078</id>
    <published>2010-05-05T14:47:42.3988731+02:00</published>
    <updated>2010-05-05T14:47:42.3988731+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
In the latest drop of <a href="http://identitymodel.codeplex.com/">Thinktecture.IdentityModel</a> you
can find a debugger visualizer for <em>IClaimsIdentity</em> and <em>IClaimsPrincipal</em>. 
</p>
        <p>
          <img src="http://www.leastprivilege.com/content/binary/ClaimsVisualizer.png" />
        </p>
        <p>
Have fun ;)
</p>
        <p>
PS. Thanks to Mr. <a href="http://headwriteline.blogspot.com">UI</a>.
</p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=59b221ce-482b-438f-9483-0d9e195b8078" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Sod This! &amp;ndash; reloaded</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/SodThisNdashReloaded.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=05189a91-e702-4e2d-aa3f-5ba73b7fe3d8</id>
    <published>2010-04-27T12:53:55.8783083+02:00</published>
    <updated>2010-04-27T12:53:55.8783083+02:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.sturmnet.org/blog/">Oliver</a> and <a href="http://community.devexpress.com/blogs/garyshort/">Gary</a> fortunately
decided to continue with their “Sod This” podcast show. That’s good – because I always
found this very entertaining.
</p>
        <p>
The “comeback” <a href="http://www.sodthis.com/podcast/2010/04/27/sod-this-8-the-secure-show">show</a> is
about security and identity – awesome ;)
</p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=05189a91-e702-4e2d-aa3f-5ba73b7fe3d8" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Using an Active Endpoint to sign into a Web Application</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/UsingAnActiveEndpointToSignIntoAWebApplication.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=1fd35914-7f4d-42ed-b855-bb535095bdd5</id>
    <published>2010-04-14T14:51:50.7582943+02:00</published>
    <updated>2010-04-14T14:52:40.8204739+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="html">&lt;p&gt;
This question comes up from time to time, so I thought I’ll document it here.
&lt;/p&gt;
&lt;p&gt;
The scenario is, that you don’t want to do a passive redirect in a web app – but directly
talk to an active STS endpoint to authenticate and request a token. The reasons for
that could be that you need a local sign-in page in the web app – or that the token
service is not publicly reachable.
&lt;/p&gt;
&lt;p&gt;
The following code can be used on a login page: 
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;protected&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; _btnLogin_Click(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;//
authenticate with WS-Trust endpoint&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; factory
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;WSTrustChannelFactory&lt;/span&gt;(&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;UserNameWSTrustBinding&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;SecurityMode&lt;/span&gt;.TransportWithMessageCredential),&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EndpointAddress&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"https://sts/endpoint"&lt;/span&gt;));&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;factory.Credentials.UserName.UserName = _txtUserName.Text;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;factory.Credentials.UserName.Password
= _txtPassword.Text;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;?xml:namespace prefix = o /&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; channel
= factory.CreateChannel();&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; rst
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;RequestSecurityToken&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;RequestType
= &lt;span style="color: #2b91af"&gt;RequestTypes&lt;/span&gt;.Issue,&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AppliesTo
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EndpointAddress&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"https://rp/"&lt;/span&gt;),&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;KeyType
= &lt;span style="color: #2b91af"&gt;KeyTypes&lt;/span&gt;.Bearer&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;};&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; genericToken
= channel.Issue(rst) &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericXmlSecurityToken&lt;/span&gt;;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;//
parse token&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; handlers
= &lt;span style="color: #2b91af"&gt;FederatedAuthentication&lt;/span&gt;.ServiceConfiguration.SecurityTokenHandlers;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; token
= handlers.ReadToken(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;XmlTextReader&lt;/span&gt;(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;StringReader&lt;/span&gt;(genericToken.TokenXml.OuterXml)));&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; identity
= handlers.ValidateToken(token).First();&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;// create session token&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; sessionToken
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;SessionSecurityToken&lt;/span&gt;(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;ClaimsPrincipal&lt;/span&gt;.CreateFromIdentity(identity));&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FederatedAuthentication&lt;/span&gt;.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionToken);&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Response.Redirect(&lt;span style="color: #a31515"&gt;"~/users/default.aspx"&lt;/span&gt;);&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;}&lt;/span&gt;
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; mso-no-proof: yes"&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=1fd35914-7f4d-42ed-b855-bb535095bdd5" /&gt;</content>
  </entry>
  <entry>
    <title>Taken by Storm</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/TakenByStorm.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=c38dae76-6f30-4ad0-a81b-4b54a79c1cc0</id>
    <published>2010-04-06T12:18:00.3263196+02:00</published>
    <updated>2010-04-06T12:18:00.3263196+02:00</updated>
    <category term="Misc" label="Misc" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=Misc" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Any more dodgy <a href="http://weblogs.thinktecture.com/cweyer/2010/04/a-storm-blowing-through-net-land-oliver-sturm-joins-thinktecture.html">puns</a>?
</p>
        <p>
I am happy to announce that my good friend <a href="http://www.sturmnet.org/blog/">Oliver</a><a href="http://www.thinktecture.com/staff/oliver">Sturm</a> has
joined thinktecture.
</p>
        <p>
Oliver is a brilliant computer geek in general and a language wonk in particular –
good company to hang out in bars – and just generally a nice guy. Looking forward
working with you!
</p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=c38dae76-6f30-4ad0-a81b-4b54a79c1cc0" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Thinktecture StarterSTS 1.0 RTW</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/ThinktectureStarterSTS10RTW.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=45baa120-96dd-48dc-a067-9a3c9ac0d3dd</id>
    <published>2010-04-04T08:33:42.96253+02:00</published>
    <updated>2010-04-04T09:23:26.7403087+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Wow – I can’t tell you how happy and relieved I am to write this post ;)
</p>
        <p>
I started to work with what’s now called WIF approximately two years ago – and built
various security token services for customers, demos and internal use. The idea behind
StarterSTS was to have a non-trivial security token service sample that demonstrates
the typical tasks of an STS (where it turns out that issuing tokens is by far the
smallest part) and at the same time is real world enough to be directly used in specialized
situations like development STSes.
</p>
        <p>
I checked-in the first public version of StarterSTS at 25th May 2009 and had 1861
download so far. Today I am announcing StarterSTS 1.0 which is feature complete (and
hopefully reasonably bug-free) and finally includes documentation as well as nine
new screencasts on the various feature areas.
</p>
        <p>
I want to thank all beta-testers and early adopters that gave feedback along the way!
Now that 1.0 is done we can think about ways to extend the STS in the future.
</p>
        <p>
          <strong>Codeplex Site</strong>
          <br />
          <a href="http://startersts.codeplex.com">http://startersts.codeplex.com</a> (main)<br /><a title="http://startersts.codeplex.com/releases/view/43054#DownloadId=115213" href="http://startersts.codeplex.com/releases/view/43054#DownloadId=115213">http://startersts.codeplex.com/releases/view/43054#DownloadId=115213</a> (direct)<br /><a href="http://startersts.codeplex.com/thread/list.aspx">http://startersts.codeplex.com/thread/list.aspx</a> (forum)
</p>
        <p>
          <strong>Documentation</strong>
          <br />
          <a href="http://identity.thinktecture.com/stsce/docs/">http://identity.thinktecture.com/stsce/docs/</a>
        </p>
        <p>
          <strong>Screencasts<br /></strong>
          <a href="https://identity.thinktecture.com/download/startersts/v1/StarterSTS_InitialSetup.wmv">Initial
setup &amp; configuration</a>
          <br />
          <a href="http://identity.thinktecture.com/download/starterSTS/v1/StarterSTS_FederatingWebApps.wmv">Federating
your first web application</a>
          <br />
          <a href="http://identity.thinktecture.com/download/starterSTS/v1/StarterSTS_FederatingWebServices.wmv">Federating
with web services</a>
          <br />
          <a href="https://identity.thinktecture.com/download/startersts/v1/StarterSTS_SSO.wmv">Single-Sign-On
&amp; Confirmation screen</a>
          <br />
          <a href="http://identity.thinktecture.com/download/starterSTS/v1/StarterSTS_REST.wmv">Using
the REST endpoint</a>
          <br />
          <a href="http://identity.thinktecture.com/download/starterSTS/v1/StarterSTS_OpenId.wmv">Using
the OpenId bridge</a>
          <br />
          <a href="http://identity.thinktecture.com/download/starterSTS/v1/StarterSTS_Tracing.wmv">Tracing</a>
          <br />
          <a href="http://identity.thinktecture.com/download/starterSTS/v1/StarterSTS_ClientCertificates.wmv">Using
client certificates</a>
          <br />
          <a href="http://identity.thinktecture.com/download/starterSTS/v1/StarterSTS_InfoCards.wmv">Using
Information Cards</a>
        </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=45baa120-96dd-48dc-a067-9a3c9ac0d3dd" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Using Silverlight to Access WIF secured WCF Services (Part 3)</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/UsingSilverlightToAccessWIFSecuredWCFServicesPart3.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=77132bde-77f6-49a8-a858-eb39e82bf56e</id>
    <published>2010-03-30T10:18:07.5942736+02:00</published>
    <updated>2010-03-30T10:18:52.8911486+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="html">&lt;p&gt;
In this last part of the series (see &lt;a href="http://www.leastprivilege.com/UsingSilverlightToAccessWIFSecuredWCFServices.aspx"&gt;here&lt;/a&gt; and &lt;a href="http://www.leastprivilege.com/UsingSilverlightToAccessWIFSecuredWCFServicesPart2.aspx"&gt;here&lt;/a&gt;)
I want to show you how to use the WIF/SL integration &lt;em&gt;ClaimsIdentitySessionManager&lt;/em&gt; to
request tokens and talk to WIF secured services.
&lt;/p&gt;
&lt;p&gt;
The &lt;em&gt;ClaimsIdentityManager&lt;/em&gt; registers as an &lt;em&gt;ApplicationService&lt;/em&gt; in
SL. Once registered, it can encapsulate the process of requesting a token for a relying
party, caching that token as well as setting the SOAP security header for outgoing
service requests.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Registration&lt;/strong&gt;
&lt;br&gt;
&lt;em&gt;ClaimsIdentitySessionManager&lt;/em&gt; gets registered in app.xaml. Here you can specify
the endpoint address of the WS-Trust token services as well as the credential type.
In this sample I am using the ADFS2 Windows/Transport endpoint from my last post.
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-ansi-language: en-us" lang="EN-US"&gt;Application.ApplicationLifetimeObjects&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-ansi-language: en-us" lang="EN-US"&gt;id&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;:&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-ansi-language: en-us" lang="EN-US"&gt;ClaimsIdentitySessionManager&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-ansi-language: en-us" lang="EN-US"&gt;id&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;:&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-ansi-language: en-us" lang="EN-US"&gt;ClaimsIdentitySessionManager.IdentityProvider&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-ansi-language: en-us" lang="EN-US"&gt;id&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;:&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-ansi-language: en-us" lang="EN-US"&gt;WSTrustSecurityTokenService&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; color: red; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
Endpoint&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;="https://server/services/trust/13/windowstransport"&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;nbsp;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red"&gt;CredentialType&lt;/span&gt;&lt;span style="color: blue"&gt;="DefaultCredential"
/&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-ansi-language: en-us" lang="EN-US"&gt;id&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;:&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-ansi-language: en-us" lang="EN-US"&gt;ClaimsIdentitySessionManager.IdentityProvider&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515"&gt;id&lt;/span&gt;&lt;span style="font-family: consolas; color: blue"&gt;:&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515"&gt;ClaimsIdentitySessionManager&lt;/span&gt;&lt;span style="font-family: consolas; color: blue"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515"&gt;Application.ApplicationLifetimeObjects&lt;/span&gt;&lt;span style="font-family: consolas; color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: consolas"&gt;&lt;?xml:namespace prefix = o /&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Calling the Service&lt;/strong&gt;
&lt;br&gt;
All the service interaction is abstracted by the &lt;em&gt;ClaimsIdentitySessionManager&lt;/em&gt;.
The call to &lt;em&gt;InvokeAsync&lt;/em&gt; does a few things:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
checks if a token has already been obtained for the service endpoint&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;
if not, requests the token and caches it&lt;/li&gt;
&lt;li&gt;
if a password is required, invokes a callback to the UI&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
sets the SOAP security header using the requested token&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;private&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; CallService()&lt;br&gt;
{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; factory
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ChannelFactory&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;StarterServiceContract&lt;/span&gt;&amp;gt;(&lt;span style="color: #a31515"&gt;"symmetric"&lt;/span&gt;);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; proxy
= factory.CreateChannel();&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; channel
= proxy &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IClientChannel&lt;/span&gt;;&lt;br&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ClaimsIdentitySessionManager&lt;/span&gt;.Current.InvokeAsync(()
=&amp;gt;&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;proxy.BeginGetClaims(result
=&amp;gt; ShowClaims(proxy, result), &lt;span style="color: blue"&gt;null&lt;/span&gt;);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;},
channel);&lt;br&gt;
}&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=77132bde-77f6-49a8-a858-eb39e82bf56e" /&gt;</content>
  </entry>
  <entry>
    <title>Requesting Tokens from ADFS2 using Silverlight and Windows Authentication</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/RequestingTokensFromADFS2UsingSilverlightAndWindowsAuthentication.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=f7eb2e1a-14e6-4910-9ffa-a3947048598c</id>
    <published>2010-03-28T17:37:27.8106421+02:00</published>
    <updated>2010-03-28T17:48:32.5355755+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
With SL4’s support for NTLM and the WIF integration bits, you can now easily request
tokens from ADFS2 (or any other token service that supports Windows authentication)
in single-sign-on style. Here’s the quick walk-through…
</p>
        <p>
          <strong>Enable the right endpoint in ADFS2</strong>
          <br />
You need a WS-Trust endpoint for version 1.3 that supports transport security and
Windows authentication. This endpoint needs to be enabled in the ADFS2 MMC (/trust/13/windowstransport).
</p>
        <p>
          <strong>Configure WSTrustClient and request the Token</strong>
          <br />
Next you have to configure WSTrustClient to use this endpoint, using the Windows binding
and Windows credential type:
</p>
        <p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal">
          <span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US">var</span>
          <span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"> client
= <span style="color: blue">new</span><span style="color: #2b91af">WSTrustClient</span>(<br /></span>
          <span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US">
            <span style="mso-spacerun: yes">    </span>
            <span style="color: blue">new</span>
            <span style="color: #2b91af">WSTrustBindingWindows</span>(),<br /></span>
          <span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US">
            <span style="mso-spacerun: yes">    </span>
            <span style="color: blue">new</span>
            <span style="color: #2b91af">EndpointAddress</span>(<span style="color: #a31515">"https://server/adfs/services/trust/13/windowstransport"</span>),<br /></span>
          <span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US">
            <span style="mso-spacerun: yes">    </span>
          </span>
          <span style="font-family: consolas; color: blue">new</span>
          <span style="font-family: consolas">
            <span style="color: #2b91af">WindowsCredentials</span>());</span>
        </p>
        <p>
From there on you can include the token to auth against other services.
</p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=f7eb2e1a-14e6-4910-9ffa-a3947048598c" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Using Silverlight to Access WIF secured WCF Services (Part 2)</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/UsingSilverlightToAccessWIFSecuredWCFServicesPart2.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=05de822e-e823-4e82-a319-9864d358019d</id>
    <published>2010-03-21T21:52:58.482544+01:00</published>
    <updated>2010-03-21T21:52:58.482544+01:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="html">&lt;p&gt;
&lt;a href="http://www.leastprivilege.com/UsingSilverlightToAccessWIFSecuredWCFServices.aspx"&gt;This&lt;/a&gt; was
one of my most popular blog post in the recent time (please read it first to get the
necessary background information). I thought I give this another shot with the new
SL/WIF &lt;a href="http://www.leastprivilege.com/AFirstLookAtSilverlightAndWIFIntegration.aspx"&gt;integration&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
There are other ways to accomplish the below things, e.g. using the SL application
service or passive identity providers. I am focusing here purely on the SL initiated
active STS/RP communication scenario and the raw APIs.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Requesting Tokens from within Silverlight&lt;br&gt;
&lt;/strong&gt;In my old post I had to use a custom REST endpoint in &lt;a href="http://startersts.codeplex.com/"&gt;StarterSTS&lt;/a&gt; to
request a bearer token. With the new &lt;em&gt;WSTrustChannel&lt;/em&gt;, it is now possible to
talk to a standard WS-Trust 1.3 endpoint (like the one in StarterSTS or ADFS2). 
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;var&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt; client
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;WSTrustClient&lt;/span&gt;(&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;WSTrustBindingUsernameMixed&lt;/span&gt;(),&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EndpointAddress&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"https://.../issue.svc/mixed/username"&lt;/span&gt;),&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: blue"&gt;new&lt;/span&gt;&lt;span style="font-family: consolas"&gt; &lt;span style="color: #2b91af"&gt;UsernameCredentials&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"username"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"password"&lt;/span&gt;&lt;?xml:namespace prefix = o /&gt;));&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
You then have to construct an RST. Basically you specify the key type (bearer or symmetric)
and appliesTo value.
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;var&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt; rst
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;RequestSecurityToken&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;WSTrust13Constants&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;KeyTypes&lt;/span&gt;.Symmetric)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AppliesTo
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EndpointAddress&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"https://roadie/StarterRP/"&lt;/span&gt;)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;};&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
The call to &lt;em&gt;WSTrustClient.Issue&lt;/em&gt; returns an RSTR – which in turn contains
the requested token and further key material. The identity kit also contains a token
cache called &lt;em&gt;TokenCache&lt;/em&gt;. You could use this class if you want to to store
that token for further use.
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;client.IssueCompleted
+= (s, args) =&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;_cache.AddTokenToCache(&lt;span style="color: #a31515"&gt;"myRP"&lt;/span&gt;,
args.Result);&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;};&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;client.IssueAsync(rst);&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Using a Token to authenticate with a WCF Relying Party&lt;br&gt;
&lt;/strong&gt;Since Silverlight does not support issued token credentials, we must handcraft
the SOAP security header. The identity kit includes the &lt;em&gt;IssuedTokenHeader&lt;/em&gt; class
for this purpose. The nice thing is, that this class supports symmetric proof keys
as well as bearer tokens. But you still have to set this header manually on every
call.
&lt;/p&gt;
&lt;p&gt;
The identity kit includes its own wrapper to abstract away the header generation.
I am using my own little helper here to make this process less disruptive.
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;public&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IssuedTokenHeaderExtensions&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; SendWithIssuedToken(&lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IContextChannel&lt;/span&gt; channel, &lt;span style="color: #2b91af"&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RequestSecurityTokenResponse&lt;/span&gt; rstr, &lt;span style="color: #2b91af"&gt;Action&lt;/span&gt; action)&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;OperationContextScope&lt;/span&gt;(channel))&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;OperationContext&lt;/span&gt;.Current.OutgoingMessageHeaders.Add(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IssuedTokenHeader&lt;/span&gt;(rstr));&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;action();&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;}&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
This allows calling a WCF service like this:
&lt;/p&gt;
&lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: blue; mso-ansi-language: en-us" lang="EN-US"&gt;private&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; CallService()&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; factory
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ChannelFactory&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;StarterServiceContract&lt;/span&gt;&amp;gt;(&lt;span style="color: #a31515"&gt;"myRP"&lt;/span&gt;);&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; proxy
= factory.CreateChannel();&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; channel
= proxy &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IContextChannel&lt;/span&gt;;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;br&gt;
&lt;/o:p&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;channel.SendWithIssuedToken(_cache.GetTokenFromCache(&lt;span style="color: #a31515"&gt;"myRP"&lt;/span&gt;),
() =&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;proxy.BeginGetClaims(result
=&amp;gt; ShowClaims(proxy, result), &lt;span style="color: blue"&gt;null&lt;/span&gt;);&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas"&gt;});&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: consolas"&gt;}&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
The trick here again is, that the client stack is configured for no security at all,
whereas the WCF service uses a federation binding (with SecureConversation turned
off).
&lt;/p&gt;
&lt;p&gt;
I think this is pretty cool and solves some of the problems I had in the past. If
Silverlight would only support client certificate credentials….
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=05de822e-e823-4e82-a319-9864d358019d" /&gt;</content>
  </entry>
  <entry>
    <title>A first Look at Silverlight and WIF Integration</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/AFirstLookAtSilverlightAndWIFIntegration.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=43fda733-cdd8-4ef7-a93b-0f07422150ec</id>
    <published>2010-03-21T11:23:59.8670922+01:00</published>
    <updated>2010-03-21T11:29:15.3358422+01:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
At MIX, Caleb did a <a href="http://live.visitmix.com/MIX10/Sessions/SVC01">talk</a> about
the new Silverlight/WIF integration classes that “ship” with the latest identity training <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=c3e315fa-94e2-4028-99cb-904369f177c0">kit</a>.
Since this is a topic that comes up really frequently – I had a first look.
</p>
        <p>
The integration code consists of two projects (client &amp; server side plumbing)
and can be divided into several feature areas. I will post more information on the
corresponding areas when I have written more code against them.
</p>
        <p>
          <strong>Same claims programming model as in WIF<br /></strong>The integration code includes <em>(I)ClaimsPrincipal, (I)ClaimsIdentity,
Claim, ClaimCollection</em> as well as the standard claim types.
</p>
        <p>
          <strong>WS-Trust and WS-Security support</strong>
          <br />
This is my favourite feature! The <em>WSTrustClient</em> class allows requesting tokens
from WS-Trust 1.3 endpoints. It supports Username/Password and Windows credentials
as well as bearer and symmetric token types. The <em>IssuedTokenHeader</em> class
makes it easier to embed the requested token in calls to backend services. The <em>TokenCache</em> class
allows caching RSTRs to be used with the issued token header.
</p>
        <p>
          <strong>Bringing claims to a Silverlight UI</strong>
          <br />
Another feature area deals with bringing claims into the SL UI for personalization
and authorization purposes. This needs some server side plumbing (the <em>AuthenticationService</em>)
and seems to focus on passive scenarios. The current implementation simply mirrors
the user claims that are visible in the app/service backend back to the UI.
</p>
        <p>
          <strong>Silverlight integration<br /></strong>This part of the integration code makes logons and claims access more SLish
by providing an SL appplication service and thus data binding access to claims.
</p>
        <p>
HTH
</p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=43fda733-cdd8-4ef7-a93b-0f07422150ec" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Thinktecture.DataObjectModel</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/ThinktectureDataObjectModel.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=367023a1-2891-4858-8e00-e251dec0853f</id>
    <published>2010-03-09T10:45:21.8112039+01:00</published>
    <updated>2010-03-09T10:45:21.8112039+01:00</updated>
    <category term="Tools for Thinktecture" label="Tools for Thinktecture" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=Tools+for+Thinktecture" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Our very own <a href="http://www.thinktecture.com/staff/joerg">Jörg</a><a href="http://headwriteline.blogspot.com/">Neumann</a> had
this cooking for quite a while. tt.DOM is a library that lets you add features like
change tracking, undo, redo, views, transactions and n-tier support to arbitrary types
(or lists of types). This makes typical data scenarios in 3-tier applications *much*
easier to handle.
</p>
        <p>
Expect more information and documentation soon (of course ;).
</p>
        <p>
In the meanwhile feel free to play around with it and give us feedback via the codeplex
forum!
</p>
        <p>
          <a href="http://dataobjectmodel.codeplex.com">http://dataobjectmodel.codeplex.com</a>
        </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=367023a1-2891-4858-8e00-e251dec0853f" />
      </div>
    </content>
  </entry>
  <entry>
    <title>This week: Trooper Heidelberg</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/ThisWeekTrooperHeidelberg.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=ad944967-53fd-4fe1-9ff5-7c5f173de8a9</id>
    <published>2010-03-07T18:45:39.4282528+01:00</published>
    <updated>2010-03-07T18:47:27.6470028+01:00</updated>
    <category term="Conferences" label="Conferences" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=Conferences" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Looking forward to this week’s nice little security <a href="http://www.troopers.de/">conference</a> organized
by my old friends at <a href="http://www.ernw.de">ERNW</a>.
</p>
        <p>
          <strong>Federated Identity - Opportunities and Risks</strong>
          <br />
The world is moving towards a federated identity model. Public facing websites like
Google or Facebook utilize technologies like OpenID, OAuth and WRAP to provide single-sign-on
capabilities. Enterprises and ISVs start deploying WS-Federation, WS-Trust and SAML
to federate with customers, partners and even internally. The goals are always the
same: provide a more meaningful representation of "identity" for authentication, authorization
and personalization. This talks sheds light on all these technologies, how they work
and how to secure them.
</p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=ad944967-53fd-4fe1-9ff5-7c5f173de8a9" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Guide to Claims-based Identity and Access Control</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/GuideToClaimsbasedIdentityAndAccessControl.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=b530dfcd-3389-453d-9164-5934b588bedb</id>
    <published>2010-03-05T13:36:46.9721413+01:00</published>
    <updated>2010-03-05T13:36:46.9721413+01:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
RTM finally ;)
</p>
        <p>
          <img src="http://weblogs.thinktecture.com/.a/6a012876b389bb970c01310f589418970c-pi" />
        </p>
        <p>
Book <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=4c09ffe4-43dd-4fcc-be35-c897c9bc4386">here</a>.<br />
Code <a href="http://www.microsoft.com/downloads/details.aspx?familyid=33829BCF-F5EA-4650-B807-57C63A753753&amp;displaylang=en">here</a>.<br />
More info <a href="mailto:dominick.baier(_at_)thinktecture.com">here</a>.
</p>
        <p>
Enjoy!!!
</p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=b530dfcd-3389-453d-9164-5934b588bedb" />
      </div>
    </content>
  </entry>
  <entry>
    <title>WIF Workshop</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/WIFWorkshop.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=54bb6d22-766a-40c4-9ecc-e084656a035f</id>
    <published>2010-03-05T13:28:46.5594904+01:00</published>
    <updated>2010-03-05T13:28:46.5594904+01:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="http://www.leastprivilege.com/CategoryView.aspx?category=IdentityModel" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Mein geschätzter Kollege <a href="http://blogs.msdn.com/vbertocci">Vittorio</a> Bertocci
führt einen 2-Tägigen <a href="http://blogs.msdn.com/dparys/archive/2010/03/05/interesse-an-windows-identity-foundation.aspx">Workshop</a> zum
Thema Windows Identity Foundation in München durch. Das ist bestimmt eine gute Gelegenheit
sich mal abseits vom Projektalltag mit dem Thema genauer zu beschäftigen.
</p>
        <p>
Wenn danach alle (un)Klarheiten beseitigt sind, und Sie weiterführenden Informationen
oder Unterstützung zur Implementierung von Claims in der Praxis benötigen – einfach
Email an mich (dominick.baier (_at_) thinktecture.com). Ich helfe gerne weiter. Viel
Spaß!
</p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=54bb6d22-766a-40c4-9ecc-e084656a035f" />
      </div>
    </content>
  </entry>
</feed>