<?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>2008-07-02T23:13:54.9181449+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="1.8.5223.2">DasBlog</generator>
  <entry>
    <title>Using IdentityModel: Useful Extension Methods for Serializing Claim Sets</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/UsingIdentityModelUsefulExtensionMethodsForSerializingClaimSets.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=b550b5f7-d5f6-47de-a5e0-4def7c663f20</id>
    <published>2008-07-02T23:13:54.9181449+02:00</published>
    <updated>2008-07-02T23:13:54.9181449+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="dasBlog" />
    <content type="html">&lt;p&gt;
   As a follow up to my last post - the following extension methods make it easy to manually
   serialize claim sets:
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;
   &lt;span lang="EN-US" style="color: blue; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span lang="EN-US" style="font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-us; mso-no-proof: yes"&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt; Serialize(&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ClaimSet&lt;/span&gt; set, &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Type&lt;/span&gt;&amp;gt;
   knownTypes)&lt;br&gt;
   {&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;DataContractSerializer&lt;/span&gt; dcs
   = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DataContractSerializer&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;set.GetType(),&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;knownTypes,&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;int&lt;/span&gt;.MaxValue,&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;false&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;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; &lt;/span&gt;&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; &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: #2b91af"&gt;MemoryStream&lt;/span&gt; ms
   = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MemoryStream&lt;/span&gt;();&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;dcs.WriteObject(ms, set);&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ms.Seek(0, &lt;span style="color: #2b91af"&gt;SeekOrigin&lt;/span&gt;.Begin);&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; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;.Load(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;XmlTextReader&lt;/span&gt;(ms));&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 class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;
   &lt;span lang="EN-US" style="color: blue; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;
   &lt;span lang="EN-US" style="color: blue; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span lang="EN-US" style="font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-us; mso-no-proof: yes"&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt; Serialize(&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;ClaimSet&lt;/span&gt;&amp;gt;
   claimSets, &lt;span style="color: blue"&gt;string&lt;/span&gt; rootName, 
   &lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt; rootNamespace, &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Type&lt;/span&gt;&amp;gt;
   knownTypes)&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;XNamespace&lt;/span&gt; ns
   = &lt;span style="color: #2b91af"&gt;XNamespace&lt;/span&gt;.Get(rootNamespace);&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;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;(ns
   + rootName,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;from&lt;/span&gt; cs &lt;span style="color: blue"&gt;in&lt;/span&gt; claimSets&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;select&lt;/span&gt; cs.Serialize(knownTypes));&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=b550b5f7-d5f6-47de-a5e0-4def7c663f20" /&gt;</content>
  </entry>
  <entry>
    <title>Re:MVP</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/ReMVP.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=05e9088f-0faf-4485-94e2-3fb1e1ada472</id>
    <published>2008-07-02T22:53:58.2958268+02:00</published>
    <updated>2008-07-02T22:53:58.2958268+02:00</updated>
    <category term="Misc" label="Misc" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Quoting <a href="http://www.pluralsight.com/community/blogs/brian/archive/2008/07/01/a-new-year-starts.aspx">Brian</a>:
   </p>
        <p>
      "Microsoft has decided I didn't cause too much trouble over the last 12 months so
      I get to continue being a <font color="#0000ff">{0}</font> MVP. Thanks!", <font color="#0000ff">"Developer
      Security"</font></p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=05e9088f-0faf-4485-94e2-3fb1e1ada472" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Using IdentityModel: Serializing Claim Sets</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/UsingIdentityModelSerializingClaimSets.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=bdbba2ce-c51e-4a2a-b223-b18a5cb5c9ae</id>
    <published>2008-07-02T10:00:28.9816999+02:00</published>
    <updated>2008-07-02T10:19:33.2160749+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="dasBlog" />
    <content type="html">&lt;p&gt;
   Both &lt;em&gt;Claim&lt;/em&gt; and &lt;em&gt;ClaimSet&lt;/em&gt; are decorated with &lt;em&gt;DataContract/DataMember&lt;/em&gt; attributes.
   This means they are made for serialization. And this makes sense - maybe you want
   to forward a claim set (server to server) or send a claim set from server to client
   (UI authorization).
&lt;/p&gt;
&lt;p&gt;
   But you will most likely run into problems when trying to serialize a claim set using
   the &lt;em&gt;DataContractSerializer&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;Known Types&lt;br&gt;
   &lt;/strong&gt;DCS needs to 'know' all types that are involved in the serialization process.
   This involves every type in the inheritance chain down to ClaimSet (e.g. &lt;em&gt;DefaultClaimSet&lt;/em&gt; or
   my &lt;em&gt;DeferredLoadClaimSet&lt;/em&gt;) as well as all possible resource types. You either
   supply the known types via attributes/config (&lt;em&gt;KnownType&lt;/em&gt; and &lt;em&gt;ServiceKnownType&lt;/em&gt;).
&lt;/p&gt;
&lt;p&gt;
   Or you supply the types when newing up the DCS manually:
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;
   &lt;span lang="EN-US" style="color: #2b91af; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-ansi-language: en-us"&gt;DataContractSerializer&lt;/span&gt;&lt;span lang="EN-US" style="font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-ansi-language: en-us"&gt; dcs
   = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DataContractSerializer&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;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;ClaimSet&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;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Type&lt;/span&gt;&amp;gt;
   { &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;DefaultClaimSet&lt;/span&gt;), &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;UIClaimResource&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;
   &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;Circular References&lt;br&gt;
   &lt;/strong&gt;Typical claim sets will have circular references - e.g. when the last issuer
   in the chain points to himself. DCS is not made for cyclic reference - but rather
   object trees (at least with the default settings). When you are trying to serialize
   objects with cyclic references you will get the following exception : "type contains
   cycles and cannot be serialized if reference tracking is disabled.". In WCF traces
   you will see something like "message not logged because its size exceeds configured
   quota".
&lt;/p&gt;
&lt;p&gt;
   When newing up a DCS you can opt for "preserving object references". This will create
   ID/IDREF pairs in the serialized XML and allows for type references and thus cycles.
   (Aaron has an &lt;a href="http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/14/50943.aspx"&gt;explanation&lt;/a&gt; of
   how that works).
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;
   &lt;span lang="EN-US" style="color: #2b91af; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-ansi-language: en-us"&gt;DataContractSerializer&lt;/span&gt;&lt;span lang="EN-US" style="font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-ansi-language: en-us"&gt; dcs
   = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DataContractSerializer&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;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;ClaimSet&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;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Type&lt;/span&gt;&amp;gt;
   { &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;DefaultClaimSet&lt;/span&gt;), &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;UIClaimResource&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;int&lt;/span&gt;.MaxValue,&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;true&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;true&lt;/span&gt;,&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;//
   preserveObjectReferences&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;null&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   This is fine when you can control the DCS parameters. But you can't easily do that
   in WCF. Sowmy has a &lt;a href="http://blogs.msdn.com/sowmy/archive/2006/03/26/561188.aspx"&gt;sample&lt;/a&gt; on
   how to enable reference preserving in WCF. This will solve the problem!
&lt;/p&gt;
&lt;span style="font-size: 11pt; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: de; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;[&lt;span style="color: #2b91af"&gt;OperationContract&lt;/span&gt;]&lt;br&gt;
[&lt;span style="color: #2b91af"&gt;ReferencePreservingDataContractFormat&lt;/span&gt;]&lt;br&gt;
&lt;span style="color: #2b91af"&gt;ClaimSet&lt;/span&gt; GetClaims();&lt;/span&gt; 
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;3.5 SP1 to the Rescue!?&lt;/strong&gt;
   &lt;br&gt;
   Starting with 3.5 SP1 you can enable reference preserving on a &lt;em&gt;DataContract&lt;/em&gt; like
   this:
&lt;/p&gt;
&lt;span lang="EN-US" style="font-size: 11pt; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;[&lt;span style="color: #2b91af"&gt;DataContract&lt;/span&gt;(Namespace
= &lt;span style="color: #a31515"&gt;"..."&lt;/span&gt;, &lt;b style="mso-bidi-font-weight: normal"&gt;IsReference
= &lt;span style="color: blue"&gt;true&lt;/span&gt;&lt;/b&gt;)]&lt;br&gt;
&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DeferredLoadClaimSet&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;ClaimSet&lt;/span&gt;&lt;/span&gt; 
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   But there are two problems with this approach:
&lt;/p&gt;
&lt;ul&gt;
   &lt;li&gt;
      You actually need access to the DataContract to change the attribute. In the claims
      case - you would need to change the framework's &lt;em&gt;DefaultClaimSet&lt;/em&gt; or your own &lt;em&gt;ClaimSet&lt;/em&gt;-derived
      class.&lt;/li&gt;
   &lt;li&gt;
      Every &lt;em&gt;DataContract&lt;/em&gt; in the inheritance chain needs the &lt;em&gt;IsReference&lt;/em&gt; attribute
      - otherwise you will get the following error: "Derived types must have the same value
      for IsReference as the base type". Since all custom claim sets ultimately derive from &lt;em&gt;ClaimSet&lt;/em&gt; -
      but this &lt;em&gt;DataContract&lt;/em&gt; has no &lt;em&gt;IsReference&lt;/em&gt; set, we are back to square
      one.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;Conclusion&lt;/strong&gt;
   &lt;br&gt;
   Keep these things in mind when serializing claim sets:
&lt;/p&gt;
&lt;ul&gt;
   &lt;li&gt;
      supply all involved types as known types&lt;/li&gt;
   &lt;li&gt;
      Set &lt;em&gt;preserveObjectReferences&lt;/em&gt; to true on the DCS. The new attribute on &lt;em&gt;DataContract&lt;/em&gt; in
      3.5 SP1 is nice - but does not help with claim sets. Use the [ReferencePreservingDataContractFormat]
      attribute instead (find the code &lt;a href="http://blogs.msdn.com/sowmy/attachment/561188.ashx"&gt;here&lt;/a&gt;).&lt;/li&gt;
   &lt;li&gt;
      Reference preserving adds ID/IDREF attributes to the resulting XML. These attributes
      come from a Microsoft namespace. This may be a problem for interop scenarios. If you
      need full control over the XML, either use the DCS extensibility points for manual
      serialization, or don't use the DCS at all (and use one of the alternative message
      generation mechanisms). Another option would be to use a more standardized serialization
      format for claims like a SAML token.&lt;/li&gt;
   &lt;li&gt;
      &lt;em&gt;WindowsClaimSet&lt;/em&gt; and &lt;em&gt;X509CertificateClaimSet&lt;/em&gt; are not marked with
      [DataContract] at all - they are not intended for serialization.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
   HTH
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=bdbba2ce-c51e-4a2a-b223-b18a5cb5c9ae" /&gt;</content>
  </entry>
  <entry>
    <title>PowerShell Profile</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/PowerShellProfile.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=01ad0c4b-2601-4ac6-b4dd-83809f43115f</id>
    <published>2008-06-15T16:44:38.5208473+02:00</published>
    <updated>2008-06-15T16:52:27.9865927+02:00</updated>
    <category term="Work in Progress" label="Work in Progress" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Putting <a href="http://www.tavaresstudios.com/Blog/post/The-last-vsvars32ps1-Ill-ever-need.aspx">these</a><a href="http://www.leastprivilege.com/MyMonadCommandPrompt.aspx">three</a><a href="http://www.leastprivilege.com/AdminTitleBarForPowerShell.aspx">things</a> (and
      a little bit of <a href="http://www.interact-sw.co.uk/iangblog/2007/02/09/pshdetectelevation">this</a>)
      together - you can build a very nice profile script for PowerShell ;)
   </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=01ad0c4b-2601-4ac6-b4dd-83809f43115f" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Advanced Extensions to IIS 7 Configuration</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/AdvancedExtensionsToIIS7Configuration.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=bf0ddd2a-8712-4777-90a1-3a7492511bd9</id>
    <published>2008-06-13T00:55:59.4171334+02:00</published>
    <updated>2008-06-13T00:55:59.4171334+02:00</updated>
    <category term="IIS" label="IIS" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Great article about IIS 7 configuration extensibility:
   </p>
        <p>
          <a title="http://learn.iis.net/page.aspx/241/configuration-extensibility/" href="http://learn.iis.net/page.aspx/241/configuration-extensibility/">http://learn.iis.net/page.aspx/241/configuration-extensibility/</a>
        </p>
        <p>
      Especially infos about the COM backed extensions are hard to find elsewhere...
   </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=bf0ddd2a-8712-4777-90a1-3a7492511bd9" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Software Architect 2008</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/SoftwareArchitect2008.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=c0ebf17c-d5ac-423a-9d49-27200a5d99fc</id>
    <published>2008-06-07T06:44:43.2469319+02:00</published>
    <updated>2008-06-07T06:44:43.2469319+02:00</updated>
    <category term="Conferences" label="Conferences" scheme="dasBlog" />
    <category term="IdentityModel" label="IdentityModel" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Thanks to everyone who attended my IdentityModel talk at <a href="http://www.software-architect.co.uk/">Software
      Architect</a>.
   </p>
        <p>
      You can have all the code I showed you during my talk - just send me a private message
      or leave a comment. Most of the demos are online anyways - have a look at my IdentityModel <a href="http://www.leastprivilege.com/IdentityModel">micro-site</a>.
   </p>
        <p>
      Questions and feedback are more than welcome. Happy identity-ing.
   </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=c0ebf17c-d5ac-423a-9d49-27200a5d99fc" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Writing IIS 7 Manager Extensions</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/WritingIIS7ManagerExtensions.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=d7d81925-ba58-4281-95dd-c53d9ea98533</id>
    <published>2008-06-05T11:16:30.1827905+02:00</published>
    <updated>2008-06-05T11:16:30.1827905+02:00</updated>
    <category term="IIS" label="IIS" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Good walkthrough here:
   </p>
        <p>
          <a title="http://learn.iis.net/page.aspx/441/understanding-ui-extension-authoring/" href="http://learn.iis.net/page.aspx/441/understanding-ui-extension-authoring/">http://learn.iis.net/page.aspx/441/understanding-ui-extension-authoring/</a>
        </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=d7d81925-ba58-4281-95dd-c53d9ea98533" />
      </div>
    </content>
  </entry>
  <entry>
    <title>SQL Server Security Best Practices</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/SQLServerSecurityBestPractices.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=9c9d4ab6-c1d9-45b8-b6ef-bbb4f4f56c9a</id>
    <published>2008-05-28T10:39:37.2060185+02:00</published>
    <updated>2008-05-28T10:39:37.2060185+02:00</updated>
    <category term="For Your Favourites" label="For Your Favourites" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.sqlskills.com/blogs/bobb">Bob</a> wrote me an email as a response
      to <a href="http://www.leastprivilege.com/SystemAccountsAndSQLServer2005.aspx">this</a> post.
      He also directed me to this <a href="http://download.microsoft.com/download/8/5/e/85eea4fa-b3bb-4426-97d0-7f7151b2011c/SQL2005SecBestPract.doc">whitepaper</a> he
      wrote about SQL Server Security. Interesting read!
   </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=9c9d4ab6-c1d9-45b8-b6ef-bbb4f4f56c9a" />
      </div>
    </content>
  </entry>
  <entry>
    <title>OpenID Phishing Demo</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/OpenIDPhishingDemo.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=fcf019b2-11fb-4c61-a58a-88efdb06056b</id>
    <published>2008-05-26T22:02:32.5873635+02:00</published>
    <updated>2008-05-26T22:02:32.5873635+02:00</updated>
    <category term="For Your Favourites" label="For Your Favourites" scheme="dasBlog" />
    <category term="IdentityModel" label="IdentityModel" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Funny and educational:
   </p>
        <p>
          <a title="http://idtheft.fun.de/" href="http://idtheft.fun.de/">http://idtheft.fun.de/</a>
        </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=fcf019b2-11fb-4c61-a58a-88efdb06056b" />
      </div>
    </content>
  </entry>
  <entry>
    <title>System Accounts and SQL Server 2005</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/SystemAccountsAndSQLServer2005.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=50d609a8-e4e9-4a68-846e-fd40dfc41bf6</id>
    <published>2008-05-26T13:26:37.9644917+02:00</published>
    <updated>2008-05-26T13:27:17.0418664+02:00</updated>
    <category term="Work in Progress" label="Work in Progress" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      I recently ran into a strange situation - I was expecting an "access denied" but it
      didn't happen (yes - security guys are strange people ;). Here's the long story:
   </p>
        <p>
      I was writing some test code for LINQ to SQL (see <a href="http://www.leastprivilege.com/LINQToSQLAndSecurity.aspx">here</a>)
      in ASP.NET. Since this was on a freshly installed box I was expecting an access denied
      since I hadn't created a SQL login for <em>Network Service</em> yet. But it worked
      - I could successfully query (and update) data in all databases. Shock.
   </p>
        <p>
      After some investigation I found the reason for this behavior. Since I was using SQL
      Express, the SQL instance was running as <em>Network Service</em> (the default). Furthermore
      setup creates a Windows group for SQL Server service accounts (e.g. MACHINE\SQLServer2005MSSQLUser$...)
      and puts <em>Network Service</em> in there. It turns out that this Windows group is
      mapped to a SQL login with a server role of <em>sysadmin...</em></p>
        <p>
      This means (on my machine) that all SQL clients running as <em>Network Service</em> (or
      can get an impersonation token for that account) have <em>sysadmin</em> privileges
      in the SQL Server installation. Or more generally - when a client can use the same
      Windows account as SQL Server itself - it will get sysadmin privileges
   </p>
        <p>
      I thought I might point this out, since running SQL Server and ASP.NET as <em>Network
      Service</em> seems to be a pretty common configuration.
   </p>
        <p>
          <strong>The moral of the story: Always create dedicated service accounts for SQL Server
      (or every service you install). </strong>
        </p>
        <p>
      btw - the full blown SQL Server installation specifically asks you for the account
      to use (but also gives <em>Network Service</em> as a choice).
   </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=50d609a8-e4e9-4a68-846e-fd40dfc41bf6" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Avoid unhandled Exceptions in WCF Error Handlers</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/AvoidUnhandledExceptionsInWCFErrorHandlers.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=5ec86ca3-e719-464a-b5be-220aa31102ce</id>
    <published>2008-05-23T10:26:30.189201+02:00</published>
    <updated>2008-05-23T10:26:30.189201+02:00</updated>
    <category term="WCF" label="WCF" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      The <em>IErrorHandler</em> interface in WCF allows to write some central error handling
      code that gets invoked whenever an unhandled exception bubbles up from your service.
      There are two methods to implement:
   </p>
        <ul>
          <li>
            <em>ProvideFault</em> - called on the request thread to turn the exception into a
         fault message</li>
          <li>
            <em>HandleError</em> - called on a separate thread for error logging and the like</li>
        </ul>
        <p>
      While WCF tries its best to shield the service host from all kinds of error conditions,
      there are some situations where unhandled exceptions can hurt your hosting process.
      One of them is the <em>HandleError</em> method on <em>IErrorHandler</em>.
   </p>
        <p>
          <em>HandleError</em> is called on a background thread to allow doing (kind of) lenghty
      operations without impacting the request where the error originally occurred. If you
      have an unhandled exception in <em>HandleError</em> the normal CLR rules for excpetions
      in background threads apply - which means shutting down the process. Be careful here.
   </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=5ec86ca3-e719-464a-b5be-220aa31102ce" />
      </div>
    </content>
  </entry>
  <entry>
    <title>How to change validity period of issued certificates in Windows Certificate Services</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/HowToChangeValidityPeriodOfIssuedCertificatesInWindowsCertificateServices.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=da9f58c3-5442-4f68-a2c4-ea93d4c9cbc7</id>
    <published>2008-05-18T17:22:24.7057592+02:00</published>
    <updated>2008-05-18T17:22:24.7057592+02:00</updated>
    <category term="For Your Favourites" label="For Your Favourites" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://support.microsoft.com/kb/254632">http://support.microsoft.com/kb/254632</a>
        </p>
        <p>
       
   </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=da9f58c3-5442-4f68-a2c4-ea93d4c9cbc7" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Two important Security changes in .NET 3.5 SP1</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/TwoImportantSecurityChangesInNET35SP1.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=24ee543d-a836-4b35-b00d-1366cb1733a5</id>
    <published>2008-05-15T08:53:45.2456668+02:00</published>
    <updated>2008-05-15T08:53:45.2456668+02:00</updated>
    <category term="FX Security" label="FX Security" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Shawn details the two big security changes in .NET 3.5 SP1 on his blog:
   </p>
        <ul>
          <li>
            <a href="http://blogs.msdn.com/shawnfa/archive/2008/05/14/strong-name-bypass.aspx">Strong
         Name Bypass</a>
          </li>
          <li>
            <a href="http://blogs.msdn.com/shawnfa/archive/2008/05/12/fulltrust-on-the-localintranet.aspx">Full
         Trust on the Local Intranet</a>
          </li>
        </ul>
        <p>
      We have discussed both changes internally - and I have mixed feelings about them.
      I guess the most important thing to be aware of is, that they are not opt-in changes.
      By installing SP1 - the behavior will change automatically - if you like it or not.
   </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=24ee543d-a836-4b35-b00d-1366cb1733a5" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Improved IisRegMgmt</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/ImprovedIisRegMgmt.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=2f7d30da-b7b1-4d28-9b89-6bef02ad15cc</id>
    <published>2008-05-14T08:34:10.3648344+02:00</published>
    <updated>2008-05-14T08:34:10.3648344+02:00</updated>
    <category term="IIS" label="IIS" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Thanks to <a href="http://blogs.msdn.com/carlosag/">CarlosAg</a> from the IIS team,
      I was able to improve my tool for registering IIS 7 management modules.
   </p>
        <p>
          <a href="http://www.leastprivilege.com/content/binary/IisRegMgmt01.zip">IisRegMgmt01.zip</a>
        </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=2f7d30da-b7b1-4d28-9b89-6bef02ad15cc" />
      </div>
    </content>
  </entry>
  <entry>
    <title>P2P and WCF: The PeerName Tool</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/P2PAndWCFThePeerNameTool.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=6e1dbade-12c5-44f7-98c4-6b90d4cd9963</id>
    <published>2008-05-14T08:03:31.624+02:00</published>
    <updated>2008-05-14T08:06:29.0761302+02:00</updated>
    <category term="WCF" label="WCF" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      To play around with peer name registration and resolution, I wrote a little tool that
      makes this easy (yes - I know all this functionality is also available via netsh -
      but I wanted something more specialized).
   </p>
        <p>
          <strong>Registering</strong>
        </p>
        <p>
          <img src="http://www.leastprivilege.com/content/binary/PeerNameReg.png" border="0" />
        </p>
        <p>
          <strong>Resolving</strong>
        </p>
        <p>
          <img src="http://www.leastprivilege.com/content/binary/PeerNameResolve.png" border="0" />
        </p>
        <p>
          <a href="http://www.leastprivilege.com/content/binary/PeerName.zip">PeerName.zip (27.31
      KB)</a>
        </p>
        <p>
       
   </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=6e1dbade-12c5-44f7-98c4-6b90d4cd9963" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Using IdentityModel: Tracing</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/UsingIdentityModelTracing.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=85567584-e6c1-4a35-86fb-78a447e27a77</id>
    <published>2008-05-12T19:28:09.084661+02:00</published>
    <updated>2008-05-12T19:28:09.084661+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="dasBlog" />
    <category term="WCF" label="WCF" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      While reading through some of the code of <em>System.IdentityModel</em>, I noticed
      that there is some diagnostics tracing going on. Just add a trace listener for the
      source 'System.IdentityModel' to your config file.
   </p>
        <p>
      HTH
   </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=85567584-e6c1-4a35-86fb-78a447e27a77" />
      </div>
    </content>
  </entry>
  <entry>
    <title>P2P and WCF: Some Resources</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/P2PAndWCFSomeResources.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=a38f39cb-900c-4bf7-9cb6-5cb17639ad53</id>
    <published>2008-05-02T06:09:01.4524206+02:00</published>
    <updated>2008-05-02T06:09:01.4524206+02:00</updated>
    <category term="For Your Favourites" label="For Your Favourites" scheme="dasBlog" />
    <category term="WCF" label="WCF" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      If you want to know more about P2P and its related protocols and components, here's
      a list of online resource I found useful while researching:
   </p>
        <ul>
          <li>
            <a href="http://blogs.msdn.com/p2p/">P2P team blog</a>
          </li>
          <li>
            <a href="http://blogs.msdn.com/peerchan/">Peer Channel blog</a>
          </li>
          <li>
            <a href="http://msdn.microsoft.com/en-us/library/cc219453.aspx">Peer Channel protocol
         specification</a>
          </li>
          <li>
            <a href="http://technet.microsoft.com/en-us/network/bb545868.aspx">P2P on TechNet</a>
          </li>
          <li>
            <a href="http://www.microsoft.com/technet/network/ipv6/teredo.mspx">Teredo</a>
          </li>
          <li>
         "The Teredo Protocol: Tunneling Past Network Security and other Security Implications" <a href="http://www.symantec.com/avcenter/reference/Teredo_Security.pdf">whitepaper</a></li>
          <li>
         "Get Connected with .NET 3.5" MSDN <a href="http://msdn.microsoft.com/msdnmag/issues/07/09/Networking/default.aspx">article</a></li>
          <li>
         "Peer-to-Peer Programming with WCF and .NET Framework 3.5" MSDN <a href="http://msdn.microsoft.com/en-us/library/cc297274.aspx">article</a></li>
        </ul>
        <p>
      Have fun!
   </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=a38f39cb-900c-4bf7-9cb6-5cb17639ad53" />
      </div>
    </content>
  </entry>
  <entry>
    <title>P2P and WCF: Exposing a Service</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/P2PAndWCFExposingAService.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=98a3b225-8111-4650-ba32-ae97ef0ac435</id>
    <published>2008-05-01T11:26:52.057+02:00</published>
    <updated>2008-05-01T12:13:45.5240125+02:00</updated>
    <category term="WCF" label="WCF" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      The <a href="http://www.leastprivilege.com/P2PAndWCFFindingAService.aspx">last</a> post
      explained how to find a PNRP registered service. What else do you have to do for e.g.
      exposing a WCF service over the P2P infrastructure?
   </p>
        <p>
      Code-wise nothing. If the WCF service listens on all NICs (the default), a client
      can do a resolution via the peer DNS name and connect to it. Easy.
   </p>
        <p>
      Well - hold on - does that mean that arbitrary clients can now traverse my NAT and
      connect to my intranet machine? Kind of - yes...
   </p>
        <p>
      For the service to be accessible you also have to adjust firewall rules:
   </p>
        <ul>
          <li>
         the port the service is listening on must be openend (this will allow <em>normal</em> TCP/IP
         traffic to the endpoint) 
      </li>
          <li>
         to allow Teredo traffic to the service, additionally the "allow edge traversal" option
         must be checked. This option is only available via the advanced firewall (available
         via <em>Administrative Tools</em> or <em>MMC</em>). See screenshot:</li>
        </ul>
        <p>
          <img src="http://www.leastprivilege.com/content/binary/EdgeTraversal_Firewall.png" border="0" />
        </p>
        <p>
      So to recap - these are the prereqs for a globally reachable service:
   </p>
        <ul>
          <li>
         P2P (PNRP and Teredo) must work properly 
      </li>
          <li>
         the service must be registered 
      </li>
          <li>
         the client (or peer) must know the peer name 
      </li>
          <li>
         the endpoint port must be opened in the firewall 
      </li>
          <li>
         Teredo traffic must be allowed for this port</li>
        </ul>
        <p>
      But one thing is very true, you now allow (internet) inbound traffic to an intranet
      hosted service, which has some implications:
   </p>
        <ul>
          <li>
         there is probably no security around that intranet machine (like a DMZ). 
      </li>
          <li>
         intranet machines are typically not hardened for exposing internet services. 
      </li>
          <li>
         this means that if the service has some security problem (e.g. directory traversal
         etc), there are no safe-nets that will stop an attacker e.g. accessing other machines
         or system resources. 
      </li>
          <li>
         your administrators may not like this!</li>
        </ul>
        <p>
      Typical P2P scenarios don't necessarily involve publicly known peer names, so you
      maybe only have a limited exposure. But still - the traffic bypasses perimeter security
      and goes directly into the intranet. So be careful.
   </p>
        <p>
       
   </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=98a3b225-8111-4650-ba32-ae97ef0ac435" />
      </div>
    </content>
  </entry>
  <entry>
    <title>P2P and WCF: Finding a Service</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/P2PAndWCFFindingAService.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=d5154265-efff-4252-84a1-e67658abeb87</id>
    <published>2008-05-01T08:43:10.3885721+02:00</published>
    <updated>2008-05-01T08:43:10.3885721+02:00</updated>
    <category term="WCF" label="WCF" scheme="dasBlog" />
    <content type="html">&lt;p&gt;
   After you have &lt;a href="http://www.leastprivilege.com/P2PAndWCFRegisteringAService.aspx"&gt;registered&lt;/a&gt; a
   service, the next step is to find it again. The &lt;em&gt;System.Net.PeerToPeer&lt;/em&gt; API
   includes a &lt;em&gt;PeerNameResolver&lt;/em&gt; class which does that.
&lt;/p&gt;
&lt;p&gt;
   You input the peer name and get back the registration details (IP addresses, port,
   comment and data):
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;
   &lt;span style="color: blue; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt;static&lt;/span&gt;&lt;span style="font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Resolve(&lt;span style="color: blue"&gt;string&lt;/span&gt; name)&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;PeerNameResolver&lt;/span&gt; resolver
   = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PeerNameResolver&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: #2b91af"&gt;PeerName&lt;/span&gt; peerName
   = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PeerName&lt;/span&gt;(name);&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;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"Resolving
   {0}..."&lt;/span&gt;, peerName);&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;Console&lt;/span&gt;.WriteLine();&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;PeerNameRecordCollection&lt;/span&gt; results
   = resolver.Resolve(peerName);&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;if&lt;/span&gt; (results.Count
   == 0)&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;&lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"No
   records found."&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;span style="color: blue"&gt;return&lt;/span&gt;;&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&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; &lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt; count
   = 1;&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;foreach&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;PeerNameRecord&lt;/span&gt; record &lt;span style="color: blue"&gt;in&lt;/span&gt; results)&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;&lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"Record
   #{0}\n"&lt;/span&gt;, count);&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: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"DNS
   Name: {0}"&lt;/span&gt;, record.PeerName.PeerHostName);&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: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"Endpoints:"&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;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;IPEndPoint&lt;/span&gt; endpoint &lt;span style="color: blue"&gt;in&lt;/span&gt; record.EndPointCollection)&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;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"\t
   Endpoint:{0}"&lt;/span&gt;, endpoint);&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; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;count++;&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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&gt;
   The way you will resolve peer names more commonly is via the DNS format (the &lt;em&gt;PeerHostName&lt;/em&gt; property
   in the above code). A peer name also has DNS name representation (e.g. &lt;em&gt;foo.pnrp.net&lt;/em&gt; for
   an unsecured service named &lt;em&gt;foo&lt;/em&gt;). Whenever you use this format (e.g. with
   ping or any other application that does DNS name resolution), Windows will use the
   P2P APIs internally to return the corresponding IP address). See &lt;a href="http://blogs.msdn.com/p2p/archive/2007/06/15/pnrp-and-pnrp-net.aspx"&gt;here&lt;/a&gt; for
   the details.
&lt;/p&gt;
&lt;p&gt;
   This e.g. means that you could make a registration on a web server for port 80 and
   can use the browser to directly connect to the web server using the DNS format name.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=d5154265-efff-4252-84a1-e67658abeb87" /&gt;</content>
  </entry>
  <entry>
    <title>P2P and WCF: Registering a Service</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/P2PAndWCFRegisteringAService.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=69ceff74-e10a-4bfe-b1b4-87a76af1e738</id>
    <published>2008-05-01T07:42:58.0869436+02:00</published>
    <updated>2008-05-01T07:42:58.0869436+02:00</updated>
    <category term="WCF" label="WCF" scheme="dasBlog" />
    <content type="html">&lt;p&gt;
   To make a service discoverable using the P2P infrastructure, you first have to do
   a so called peer name registration.
&lt;/p&gt;
&lt;p&gt;
   A peer name registration has the following properties:
&lt;/p&gt;
&lt;ul&gt;
   &lt;li&gt;
      a name (there are two different flavours: secured and unsecured - more on that later) 
   &lt;li&gt;
      one or more IP addresses and scope 
   &lt;li&gt;
      a port number 
   &lt;li&gt;
      a comment (optional) 
   &lt;li&gt;
      up to 4KB of binary data (optional)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
   &lt;strong&gt;Peer Name&lt;/strong&gt;
   &lt;br&gt;
   The name of the service you want to register. Names have the following format: 'authorityId.Name'.
   Unsecured Names use a '0' as the authorityId and are easy to spoof/squat. When using
   a secured name, a key/pair is generated on the fly (the first time only) to sign the
   registration request. The public key hash becomes the authorityId in this case.
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;IP addresses and scope&lt;/strong&gt;
   &lt;br&gt;
   That's the most fascinating (and complicated) part. The peer name registration can
   have local and/or a global scope. A global scope means that the service can be discovered
   and contacted - well - globally. How can that work, given the service is behind a
   NAT device? IPv6 is the answer.
&lt;/p&gt;
&lt;p&gt;
   Now you may ask yourself: "but my network/router hardware is not IPv6 enabled, can
   this still work?". Yes it does - making the transition between IPv4 and IPv6 is the
   job of so called transition or tunneling protocols. Teredo is the name of the protocol
   that is typically used here. Teredo has several jobs - one is to provide a globally
   unique IPv6 address, the other is to enable NAT traversal. I won't go into the Teredo
   details here, but this &lt;a href="http://technet.microsoft.com/en-us/library/bb457011.aspx"&gt;document&lt;/a&gt; describes
   how it works.
&lt;/p&gt;
&lt;p&gt;
   When you do a &lt;em&gt;'ipconfig'&lt;/em&gt; on the command line you may already see a bunch
   of IPv6 addresses. The one that is directly associated with your NIC is the local
   address. You may also see a "Tunnel Adapter" interface - that would be the global
   Teredo provided address.
&lt;/p&gt;
&lt;p&gt;
   You can check the status/health of the Teredo protocol by using this command: &lt;em&gt;'netsh
   int teredo show state'&lt;/em&gt;. This &lt;a href="http://blogs.msdn.com/p2p/archive/2007/03/22/teredo-and-the-pnrp-global-cloud.aspx"&gt;article&lt;/a&gt; helps
   you with troubleshooting if Teredo should not be enabled on your machine.
&lt;/p&gt;
&lt;p&gt;
   You can also have a look at the scope of your registration by checking the &lt;em&gt;clouds&lt;/em&gt; to
   which your machine has access. This is done by doing a &lt;em&gt;'netsh p2p pnrp cloud show
   list'&lt;/em&gt;. You should see one or more &lt;em&gt;LinkLocal_&lt;/em&gt; clouds and a &lt;em&gt;Global_&lt;/em&gt; cloud.
&lt;/p&gt;
&lt;p&gt;
   Again this &lt;a href="http://blogs.msdn.com/p2p/archive/2007/06/12/understanding-pnrp-clouds.aspx"&gt;article&lt;/a&gt; has
   all the details on clouds and their background.
&lt;/p&gt;
&lt;p&gt;
   So to wrap it up - by default a peer name registration will use all available NICs/IP
   addresses. If you have a global IPv6 address (which means that Teredo is working properly
   and you can 'see' the global cloud) this one is used also. This in turn means that
   the service can be used by every client that also has a global address.
&lt;/p&gt;
&lt;p&gt;
   The remaining properties are self explaining I think.
&lt;/p&gt;
&lt;p&gt;
   The following code snippet would register a secured peer name in all available clouds
   (you can find the APIs in the System.Net assembly (v3.5):
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;
   &lt;span style="color: blue; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt;private&lt;/span&gt;&lt;span style="font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Register(&lt;span style="color: blue"&gt;string&lt;/span&gt; name, &lt;span style="color: blue"&gt;int&lt;/span&gt; port, &lt;span style="color: blue"&gt;string&lt;/span&gt; comment)&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;PeerName&lt;/span&gt; peerName
   = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PeerName&lt;/span&gt;(name, &lt;span style="color: #2b91af"&gt;PeerNameType&lt;/span&gt;.Secured);&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;PeerNameRegistration&lt;/span&gt; reg
   = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PeerNameRegistration&lt;/span&gt;();&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; &lt;/span&gt;reg.PeerName = peerName;&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;reg.Port = port;&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;reg.Cloud = &lt;span style="color: #2b91af"&gt;Cloud&lt;/span&gt;.Available;&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;reg.Comment = _cl.Comment;&lt;br&gt;
   &lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;reg.Start();&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&gt;
   The next posts will deal with peer name resolution and how to host a WCF service over
   this infrastructure.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=69ceff74-e10a-4bfe-b1b4-87a76af1e738" /&gt;</content>
  </entry>
  <entry>
    <title>P2P, PNRP, Teredo...the Motivation</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/P2PPNRPTeredotheMotivation.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=2b264cfe-9822-4054-aa51-37e27524f81b</id>
    <published>2008-04-30T08:18:56.0807164+02:00</published>
    <updated>2008-04-30T08:18:56.0807164+02:00</updated>
    <category term="WCF" label="WCF" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Since I started playing around with computers, communication of machines over a "wire"
      has been fascinating to me. This is probably why I ended up in the distributed applications
      space.
   </p>
        <p>
      Typically clients talk to servers and servers to servers - but less common clients
      directly to clients. But applications like MSN Messenger or Skype show useful use
      cases of client to client communication. With Vista and Server 2008 (and XP SP2 +
      some components) peer to peer networking has become part of the operating system.
      There is also a peer channel in WCF that sits on top of these core components. Time
      to have a closer look.
   </p>
        <p>
      So what features is the P2P infrastructure supposed to give you?
   </p>
        <ul>
          <li>
         Global/local registration of services</li>
          <li>
         Global/local connectivity between peers which includes the capability to traverse
         NAT devices</li>
          <li>
         Global/local virtual broadcasting networks</li>
          <li>
         Peer/Service Discovery</li>
          <li>
         Invitation/activation of P2P enabled applications</li>
        </ul>
        <p>
      All of these capabilities are as fascinating as they are scary. More importantly I
      really think that P2P communication patterns will be a "big" thing and will also change
      the way we have to think about network/perimeter security.
   </p>
        <p>
      In the next posts I will write about some of my findings. Stay tuned.
   </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=2b264cfe-9822-4054-aa51-37e27524f81b" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Using IdentityModel: Converting ADFS Security Properties to Claims</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/UsingIdentityModelConvertingADFSSecurityPropertiesToClaims.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=54620546-a29b-479f-af68-c530aabcf70f</id>
    <published>2008-04-28T07:39:21.381632+02:00</published>
    <updated>2008-04-28T08:33:33.9858152+02:00</updated>
    <category term="IdentityModel" label="IdentityModel" scheme="dasBlog" />
    <content type="html">&lt;p&gt;
   This little helper might be useful when you are working with ADFS, but want to use
   the IdentityModel types in your app:
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;
   &lt;span style="color: blue; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span style="font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ClaimSet&lt;/span&gt; ToClaimSet(&lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;SingleSignOnIdentity&lt;/span&gt; identity)&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;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Claim&lt;/span&gt;&amp;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;Claim&lt;/span&gt;&amp;gt;();&lt;br&gt;
   &lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&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;Claim&lt;/span&gt;(identity.NameType,
   identity.Name, &lt;span style="color: #2b91af"&gt;Rights&lt;/span&gt;.Identity));&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;foreach&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;SecurityProperty&lt;/span&gt; property &lt;span style="color: blue"&gt;in&lt;/span&gt; identity.SecurityPropertyCollection)&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;&lt;span style="color: blue"&gt;string&lt;/span&gt; claimType
   = property.Uri;&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; (claimType.EndsWith(&lt;span style="color: #a31515"&gt;"NameValue"&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;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;claimType
   = property.Name;&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;claims.Add(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Claim&lt;/span&gt;(claimType,
   property.Value, &lt;span style="color: #2b91af"&gt;Rights&lt;/span&gt;.PossessProperty));&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&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; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DefaultClaimSet&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;ClaimSet&lt;/span&gt;.System,
   claims);&lt;br&gt;&lt;?xml:namespace prefix = o /&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=54620546-a29b-479f-af68-c530aabcf70f" /&gt;</content>
  </entry>
  <entry>
    <title>Ein Session Abstract ganz genau nach meinem Geschmack</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/EinSessionAbstractGanzGenauNachMeinemGeschmack.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=f920f63b-8f39-44ed-aac3-c994f1604a12</id>
    <published>2008-04-22T13:49:20.414+02:00</published>
    <updated>2008-04-22T13:50:43.2402056+02:00</updated>
    <category term="Microsoft Deutschland Security Portal" label="Microsoft Deutschland Security Portal" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Gesehen auf der JAX2008 Webseite:
   </p>
        <blockquote>
          <p>
            <strong>Security Last – Sicherheitsentscheidungen spät treffen</strong>
            <br />
      Sicherheitsanforderungen wie Logins und Berechtigung sind wichtig – aber müssen diese
      wirklich gleich am Anfang umgesetzt werden? Das nachträgliche Hinzufügen dieser Anforderungen
      mit reinem Java und OOP ist sehr schwierig, weshalb dies meistens mit „Ja“ beantwortet
      wird. Erfahren Sie hier, wie mithilfe von Tools wie Spring Security, AspectJ und CAS
      auch spät in Anwendungen integriert werden kann.
   </p>
        </blockquote>
        <p>
      Ohne Worte... 
   </p>
        <p>
       
   </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=f920f63b-8f39-44ed-aac3-c994f1604a12" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Token Kidnapping</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/TokenKidnapping.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=a00be432-76a0-4078-b890-2143af32a68f</id>
    <published>2008-04-20T09:15:28.789+02:00</published>
    <updated>2008-04-20T10:03:32.2237359+02:00</updated>
    <category term="For Your Favourites" label="For Your Favourites" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Interesting...and shocking.
   </p>
        <p>
      Read more here: 
      <br /><a href="http://www.argeniss.com/research/TokenKidnapping.pdf">http://www.argeniss.com/research/TokenKidnapping.pdf</a></p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=a00be432-76a0-4078-b890-2143af32a68f" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Installing an IIS 7 Extension</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/InstallingAnIIS7Extension.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=e14c9126-4dcb-42c7-9bac-7855c2b3f81b</id>
    <published>2008-04-20T08:50:57.209+02:00</published>
    <updated>2008-04-22T07:41:27.1780428+02:00</updated>
    <category term="IIS" label="IIS" scheme="dasBlog" />
    <content type="html">&lt;p&gt;
   Related to cleaning up my authentication module for &lt;a href="http://www.codeplex.com/CustomBasicAuth"&gt;Codeplex&lt;/a&gt;,
   I needed a way to (semi) automatically install a complete IIS extension (including
   schema, config sections and management extensions). I came up with a batch file that
   does the necessary steps (anybody out there that wants to write a real installer?).
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;1. Register all assemblies in the GAC&lt;br&gt;
   &lt;/strong&gt;Usually an IIS 7 extension consists of at least three assemblies (module/handler,
   server extensions, client extensions). Gacutil.exe is your friend here (use the /if
   option). Also take into account, that IIS loads GACed assemblies domain neutral. That
   means that you have to recycle the worker process when you update e.g. your GACed
   module.
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;2. Register schema and config section&lt;/strong&gt;
   &lt;br&gt;
   This involves copying your schema to the IIS' schema directory and add a &amp;lt;configSection&amp;gt;
   registration to applicationHost.config. &lt;a href="http://mvolo.com/blogs/serverside"&gt;Mike
   Volodarsky&lt;/a&gt; from the IIS team has written a nice tool call &lt;a href="http://mvolo.com/blogs/serverside/archive/2007/08/04/IISSCHEMA.EXE-_2D00_-A-tool-to-register-IIS7-configuration-sections.aspx"&gt;IisSchema&lt;/a&gt; that
   automates this step.
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;3. Registering the management extension&lt;/strong&gt;
   &lt;br&gt;
   This involves adding the module to administration.config (in two different places).
   I haven't found an automated way of doing this, so I wrote a little tool to accomplish
   this task.
&lt;/p&gt;
&lt;p&gt;
   IisRegMgmt [install/uninstall] [assembly_to_register]
&lt;/p&gt;
&lt;p&gt;
   This will find all &lt;em&gt;Microsoft.Web.Management.Server.ConfigurationModuleProvider&lt;/em&gt; derived
   classes in the specified assembly and register them in administration.config.
&lt;/p&gt;
&lt;p&gt;
   The code to do the registration is as follows:
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
   &lt;span style="COLOR: blue; FONT-FAMILY: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt;private&lt;/span&gt;&lt;span style="FONT-FAMILY: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; RegisterAdministration(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; name, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; type, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; assembly)&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: green"&gt;//
   get access to administration.config&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: #2b91af"&gt;Configuration&lt;/span&gt; administration
   = _manager.GetAdministrationConfiguration();&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: green"&gt;//
   get access to &amp;lt;moduleProviders&amp;gt;&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: #2b91af"&gt;ConfigurationSection&lt;/span&gt; moduleProvidersSection
   = 
   &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="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;administration.GetSection(&lt;span style="COLOR: #a31515"&gt;"moduleProviders"&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: #2b91af"&gt;ConfigurationElementCollection&lt;/span&gt; moduleProviders
   =&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;moduleProvidersSection.GetCollection();&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: green"&gt;//
   check for existing elements first&lt;/span&gt;
   &lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Clean(name, moduleProviders);&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: green"&gt;//
   create new element&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: #2b91af"&gt;ConfigurationElement&lt;/span&gt; newModuleProvider
   =&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;moduleProviders.CreateElement();&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: green"&gt;//
   set attributes&lt;/span&gt;
   &lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;newModuleProvider.SetAttributeValue(&lt;span style="COLOR: #a31515"&gt;"name"&lt;/span&gt;,
   name);&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;newModuleProvider.SetAttributeValue(&lt;span style="COLOR: #a31515"&gt;"type"&lt;/span&gt;,
   type + &lt;span style="COLOR: #a31515"&gt;", "&lt;/span&gt; + assembly);&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: green"&gt;//
   add element&lt;/span&gt;
   &lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;moduleProviders.Add(newModuleProvider);&lt;br&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: green"&gt;//
   get access to &amp;lt;modules&amp;gt;&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: #2b91af"&gt;ConfigurationSection&lt;/span&gt; modulesSection
   = 
   &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;administration.GetSection(&lt;span style="COLOR: #a31515"&gt;"modules"&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: #2b91af"&gt;ConfigurationElementCollection&lt;/span&gt; modules
   = modulesSection.GetCollection();&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: green"&gt;//
   check for existing element first&lt;/span&gt;
   &lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Clean(name, modules);&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: green"&gt;//
   create new element&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: #2b91af"&gt;ConfigurationElement&lt;/span&gt; newModule
   = modules.CreateElement();&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: green"&gt;//
   set attributes&lt;/span&gt;
   &lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;newModule.SetAttributeValue(&lt;span style="COLOR: #a31515"&gt;"name"&lt;/span&gt;,
   name);&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: green"&gt;//
   add element&lt;/span&gt;
   &lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;modules.Add(newModule);&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: green"&gt;//
   save changes&lt;/span&gt;
   &lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;_manager.CommitChanges();&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&gt;
   Don't forget to clean up the sections before you add the new module, otherwise you
   might end up with double entries:
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
   &lt;span style="COLOR: blue; FONT-FAMILY: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt;private&lt;/span&gt;&lt;span style="FONT-FAMILY: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Clean(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; name, &lt;span style="COLOR: #2b91af"&gt;ConfigurationElementCollection&lt;/span&gt; elements)&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; hits
   = &lt;span style="COLOR: blue"&gt;from&lt;/span&gt; e &lt;span style="COLOR: blue"&gt;in&lt;/span&gt; elements&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;where&lt;/span&gt; (&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;)e.GetAttributeValue(&lt;span style="COLOR: #a31515"&gt;"name"&lt;/span&gt;)
   == name&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;select&lt;/span&gt; e;&lt;br&gt;
   &lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;hits.ToList().ForEach(e
   =&amp;gt; elements.Remove(e));&lt;br&gt;
   }&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   For completeness sake, here's how you can find the right management classes in the
   assembly (and because I was amused about 'Linq to Reflection' ;)
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
   &lt;span style="COLOR: blue; FONT-FAMILY: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt;private&lt;/span&gt;&lt;span style="FONT-FAMILY: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&amp;gt;
   GetManagementTypes(&lt;span style="COLOR: #2b91af"&gt;Assembly&lt;/span&gt; a)&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;string&lt;/span&gt; baseType
   = &lt;span style="COLOR: #a31515"&gt;"Microsoft.Web.Management.Server.ConfigurationModuleProvider"&lt;/span&gt;;&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; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;var&lt;/span&gt; types
   = &lt;span style="COLOR: blue"&gt;from&lt;/span&gt; t &lt;span style="COLOR: blue"&gt;in&lt;/span&gt; a.GetExportedTypes()&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;where&lt;/span&gt; t.BaseType.FullName
   == baseType&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;select&lt;/span&gt; t.FullName;&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;return&lt;/span&gt; types;&lt;br&gt;
   }&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://www.leastprivilege.com/content/binary/IisRegMgmt01.zip"&gt;IisRegMgmt01.zip
   (18.66 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=e14c9126-4dcb-42c7-9bac-7855c2b3f81b" /&gt;</content>
  </entry>
  <entry>
    <title>Custom Basic Authentication is now on Codeplex</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/CustomBasicAuthenticationIsNowOnCodeplex.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=f9453fb0-6e2a-4faf-8cf9-62162dc7531e</id>
    <published>2008-04-19T09:44:05.453+02:00</published>
    <updated>2008-04-19T15:19:13.3821266+02:00</updated>
    <category term="ASP.NET" label="ASP.NET" scheme="dasBlog" />
    <category term="IIS" label="IIS" scheme="dasBlog" />
    <category term="WCF" label="WCF" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      I also moved my "Basic Authentication against non-Windows accounts for IIS" (phew)
      project to Codeplex
   </p>
        <p>
          <a href="http://www.codeplex.com/CustomBasicAuth">http://www.codeplex.com/CustomBasicAuth</a>
        </p>
        <p>
      Again, if you have feature ideas or want to contribute, contact me.
   </p>
        <p>
       
   </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=f9453fb0-6e2a-4faf-8cf9-62162dc7531e" />
      </div>
    </content>
  </entry>
  <entry>
    <title>InfoCardSelector is now on Codeplex</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/InfoCardSelectorIsNowOnCodeplex.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=735b42bd-85e2-4345-9acc-7e0a14899f5d</id>
    <published>2008-04-16T18:02:36.155617+02:00</published>
    <updated>2008-04-16T18:02:36.155617+02:00</updated>
    <category term="ASP.NET" label="ASP.NET" scheme="dasBlog" />
    <category term="CardSpace" label="CardSpace" scheme="dasBlog" />
    <category term="IdentityModel" label="IdentityModel" scheme="dasBlog" />
    <category term="WCF" label="WCF" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      I finally found a new home for my ASP.NET InfoCard control:
   </p>
        <p>
          <a href="http://www.codeplex.com/InfoCardSelector">http://www.codeplex.com/InfoCardSelector</a>
        </p>
        <p>
      If you feel like contributing or suggesting new features, you can contact me via this
      page.
   </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=735b42bd-85e2-4345-9acc-7e0a14899f5d" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Developing ASP.NET Applications in Medium Trust</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/DevelopingASPNETApplicationsInMediumTrust.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=170f8682-d133-4e8c-982b-d3d45db15cbf</id>
    <published>2008-04-12T07:56:02.7015012+02:00</published>
    <updated>2008-04-12T07:56:02.7015012+02:00</updated>
    <category term="ASP.NET" label="ASP.NET" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://keepitlocked.net/">Alex Smolen</a> did a good <a href="http://keepitlocked.net/archive/2008/04/11/developing-asp-net-in-partial-trust.aspx">write
      up</a> of the various approaches for sandboxing ASP.NET applications. Recommended!
   </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=170f8682-d133-4e8c-982b-d3d45db15cbf" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Beware of Whitespaces in WAS Configuration</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/BewareOfWhitespacesInWASConfiguration.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=7a332526-ab1c-4697-9eba-9dd8ecb40e88</id>
    <published>2008-04-03T10:04:24.5512034+02:00</published>
    <updated>2008-04-03T10:04:24.5512034+02:00</updated>
    <category term="IIS" label="IIS" scheme="dasBlog" />
    <category term="WCF" label="WCF" scheme="dasBlog" />
    <category term="Work in Progress" label="Work in Progress" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      This took me a while to solve...
   </p>
        <p>
      In the WAS configuration dialog there must be NO whitespaces in the enabled protocols
      configuration. Otherwise you will get this error:
   </p>
        <p>
      "Could not find a base address that matches scheme net.tcp for the endpoint with binding
      NetTcpBinding."
   </p>
        <p>
       
   </p>
        <p>
          <img src="http://www.leastprivilege.com/content/binary/WasSettings.jpg" border="0" />
        </p>
        <p>
      HTH
   </p>
        <p>
       
   </p>
        <img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=7a332526-ab1c-4697-9eba-9dd8ecb40e88" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Using Information Cards in ASMX Web Services</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/UsingInformationCardsInASMXWebServices.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=46671e74-ded6-4432-be78-cd0b394e4346</id>
    <published>2008-03-30T10:49:07.0081464+02:00</published>
    <updated>2008-03-30T10:50:43.3050214+02:00</updated>
    <category term="ASP.NET" label="ASP.NET" scheme="dasBlog" />
    <category term="CardSpace" label="CardSpace" scheme="dasBlog" />
    <category term="IdentityModel" label="IdentityModel" scheme="dasBlog" />
    <content type="html">&lt;p&gt;
   As I wrote &lt;a href="http://www.leastprivilege.com/GettingCardSpaceTokensProgrammatically.aspx"&gt;here&lt;/a&gt; -
   an Information Card token is just a string. This means that (with the help of some
   extra plumbing) you can seamlessly integrate cards into "legacy" technologies. Here's
   a sample walkthrough for ASMX web services.
&lt;/p&gt;
&lt;p&gt;
   To transmit the token to the service, I will use a SOAP header. So the first step
   is to define the header:
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;
   &lt;span style="font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt;[&lt;span style="color: #2b91af"&gt;XmlRoot&lt;/span&gt;(ElementName
   = &lt;span style="color: #a31515"&gt;"InformationCard"&lt;/span&gt;,&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Namespace = &lt;span style="color: #a31515"&gt;"http://schemas.xmlsoap.org/ws/2005/05/identity"&lt;/span&gt;)]&lt;br&gt;
   &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;InfoCardTokenHeader&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;SoapHeader&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: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Token;&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&gt;
   For metadata support, we can now annotate a web method with this header information:
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;
   &lt;span style="font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt;[&lt;span style="color: #2b91af"&gt;WebService&lt;/span&gt;(Namespace
   = &lt;span style="color: #a31515"&gt;"urn:leastprivilege"&lt;/span&gt;)]&lt;br&gt;
   [&lt;span style="color: #2b91af"&gt;WebServiceBinding&lt;/span&gt;(ConformsTo = &lt;span style="color: #2b91af"&gt;WsiProfiles&lt;/span&gt;.BasicProfile1_1)]&lt;br&gt;
   &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;AsmxService&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;WebService&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: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;InfoCardTokenHeader&lt;/span&gt; InfoCardToken;&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;WebMethod&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: #2b91af"&gt;SoapHeader&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"InfoCardToken"&lt;/span&gt;,
   Direction = &lt;span style="color: #2b91af"&gt;SoapHeaderDirection&lt;/span&gt;.In)]&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;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Ping()&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; &lt;/span&gt;…&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&gt;
   The client can now use the &lt;em&gt;CardSpaceSelector &lt;/em&gt;API (or my &lt;a href="http://www.leastprivilege.com/IdentityModel"&gt;wrapper&lt;/a&gt;)
   to get a token manually. Afterwards the token gets transmitted using the header:
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;
   &lt;span style="color: blue; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt;static&lt;/span&gt;&lt;span style="font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[]
   args)&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;AsmxService&lt;/span&gt; proxy
   = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;AsmxService&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;InfoCardTokenHeader&lt;/span&gt; token
   = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;InfoCardTokenHeader&lt;/span&gt;();&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;token.Token = GetInfoCardToken(proxy.Url);&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;proxy.InformationCard =
   token;&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;Console&lt;/span&gt;.WriteLine(proxy.Ping());&lt;br&gt;
   }&lt;br&gt;
   &lt;br&gt;
   &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetInfoCardToken(&lt;span style="color: blue"&gt;string&lt;/span&gt; targetUri)&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;IdentitySelector&lt;/span&gt; selector
   = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IdentitySelector&lt;/span&gt;();&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;selector.TargetUri = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(targetUri);&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;selector.SetTargetCertificate(targetUri);&lt;br&gt;
   &lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;selector.RequiredClaims.Add(&lt;span style="color: #2b91af"&gt;ClaimTypes&lt;/span&gt;.GivenName);&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;selector.RequiredClaims.Add(&lt;span style="color: #2b91af"&gt;ClaimTypes&lt;/span&gt;.Surname);&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;selector.RequiredClaims.Add(&lt;span style="color: #2b91af"&gt;ClaimTypes&lt;/span&gt;.Email);&lt;br&gt;
   &lt;/span&gt;&lt;span style="font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&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;GenericXmlSecurityToken&lt;/span&gt; token
   = selector.GetToken();&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;return&lt;/span&gt; token.TokenXml.OuterXml;&lt;br&gt;
   }&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   On the server side you could now retrieve the token from the header and use your favourite
   token decryption class to extract the claims. If you want to put in a little bit more
   work, you can improve the integration of that information using a &lt;em&gt;SoapExtension&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
   The extension will check the incoming headers, extract the token and set &lt;em&gt;Thread.CurrentPrincipal&lt;/em&gt; and &lt;em&gt;Context.User&lt;/em&gt; to
   an instance of &lt;a href="http://www.leastprivilege.com/IdentityModel"&gt;IdentityPrincipal&lt;/a&gt; that
   wraps the token generated authorization context. A corresponding extension attribute
   connects this logic with the web method:
&lt;/p&gt;
&lt;span style="font-size: 11pt; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;[&lt;span style="color: #2b91af"&gt;WebMethod&lt;/span&gt;]&lt;br&gt;
[&lt;span style="color: #2b91af"&gt;InfoCardSoapExtension&lt;/span&gt;(TokenRequired = &lt;span style="color: blue"&gt;true&lt;/span&gt;)]&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;br&gt;
[&lt;span style="color: #2b91af"&gt;SoapHeader&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"InfoCardToken"&lt;/span&gt;,
Direction = &lt;span style="color: #2b91af"&gt;SoapHeaderDirection&lt;/span&gt;.In)]&lt;br&gt;
&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Ping()&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;return&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IdentityPrincipal&lt;/span&gt;.Current.ClaimSets.FindClaim(&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: #2b91af"&gt;ClaimTypes&lt;/span&gt;.GivenName).Get&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&lt;br&gt;
}&lt;/span&gt; 
&lt;p&gt;
   This gives the web service method seamless access to incoming claims.
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   The code for the SOAP extension is quite simple (the configuration code is omitted):
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;
   &lt;span style="color: blue; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span style="font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;InfoCardSoapExtension&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;SoapExtension&lt;br&gt;
   &lt;/span&gt;{&lt;span style="color: #2b91af"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ProcessMessage(&lt;span style="color: #2b91af"&gt;SoapMessage&lt;/span&gt; message)&lt;span style="color: #2b91af"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;{&lt;span style="color: #2b91af"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (message.Stage
   == &lt;span style="color: #2b91af"&gt;SoapMessageStage&lt;/span&gt;.AfterDeserialize)&lt;span style="color: #2b91af"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;{&lt;span style="color: #2b91af"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;SoapHeader&lt;/span&gt; header &lt;span style="color: blue"&gt;in&lt;/span&gt; message.Headers)&lt;span style="color: #2b91af"&gt;
   &lt;br&gt;
   &lt;/span&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;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&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;InfoCardTokenHeader&lt;/span&gt; tokenHeader
   = 
   &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;header &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af"&gt;InfoCardTokenHeader&lt;/span&gt;;&lt;span style="color: #2b91af"&gt;
   &lt;br style="mso-special-character: line-break"&gt;
   &lt;br style="mso-special-character: line-break"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;
   &lt;span style="font-family: consolas; mso-bidi-font-family: 'Times New Roman'; 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;&lt;span style="color: blue"&gt;if&lt;/span&gt; (tokenHeader
   != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;span style="color: #2b91af"&gt;
   &lt;br&gt;
   &lt;/span&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;
   &lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&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;IdentityPrincipal&lt;/span&gt; principal;&lt;span style="color: #2b91af"&gt;
   &lt;br style="mso-special-character: line-break"&gt;
   &lt;br style="mso-special-character: line-break"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;
   &lt;span style="font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&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; &lt;/span&gt;&lt;span style="color: blue"&gt;try&lt;br&gt;
   &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; &lt;/span&gt;{&lt;span style="color: blue"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&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; &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;Token&lt;/span&gt;(tokenHeader.Token, &lt;span style="color: blue"&gt;true&lt;/span&gt;);&lt;span style="color: blue"&gt;
   &lt;br&gt;
   &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;&amp;nbsp; &lt;/span&gt;principal
   = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IdentityPrincipal&lt;/span&gt;(token.AuthorizationContext);&lt;span style="color: blue"&gt;
   &lt;br&gt;
   &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; &lt;/span&gt;}&lt;span style="color: blue"&gt;
   &lt;br&gt;
   &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; &lt;/span&gt;&lt;span style="color: blue"&gt;catch&lt;br&gt;
   &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; &lt;/span&gt;{&lt;span style="color: blue"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&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; &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;HttpException&lt;/span&gt;(500, &lt;span style="color: #a31515"&gt;"Token
   validation failed"&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; &lt;/span&gt;}&lt;span style="color: blue"&gt;
   &lt;br&gt;
   &lt;br&gt;
   &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; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.User
   = &lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;.CurrentPrincipal = principal;&lt;span style="color: blue"&gt;
   &lt;br&gt;
   &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; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt;;&lt;span style="color: blue"&gt;
   &lt;br&gt;
   &lt;/span&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;
   &lt;br&gt;
   &lt;/span&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;
   &lt;br&gt;
   &lt;br&gt;
   &lt;/span&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;if&lt;/span&gt; (_tokenRequired)&lt;span style="color: blue"&gt;
   &lt;br&gt;
   &lt;/span&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;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&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;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HttpException&lt;/span&gt;(401, &lt;span style="color: #a31515"&gt;"Authentication
   required"&lt;/span&gt;);&lt;span style="color: blue"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;span style="color: blue"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;span style="color: blue"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;}&lt;span style="color: blue"&gt;
   &lt;br&gt;
   &lt;/span&gt;}&lt;span style="color: blue"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   Disclaimer: I know that this code could be written far more generic. Consider this
   as a proof of concept.
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   The &lt;a href="http://www.leastprivilege.com/IdentityModel"&gt;LeastPrivilege.IdentityModel&lt;/a&gt; download
   contains the complete sample. Have fun.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=46671e74-ded6-4432-be78-cd0b394e4346" /&gt;</content>
  </entry>
  <entry>
    <title>Using IdentityModel: Some Samples</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/UsingIdentityModelSomeSamples.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=d804a3e4-3dcc-4935-b8a9-3ffce3d31848</id>
    <published>2008-03-22T14:54:39.233+01:00</published>
    <updated>2008-03-22T15:02:14.77411+01:00</updated>
    <category term="ASP.NET" label="ASP.NET" scheme="dasBlog" />
    <category term="CardSpace" label="CardSpace" scheme="dasBlog" />
    <category term="IdentityModel" label="IdentityModel" scheme="dasBlog" />
    <category term="WCF" label="WCF" scheme="dasBlog" />
    <content type="html">&lt;p&gt;
   Here are some typical usage scenario of &lt;em&gt;IdentityPrincipal&lt;/em&gt; in ASP.NET.
&lt;/p&gt;
&lt;p&gt;
   Simple &lt;em&gt;IsInRole&lt;/em&gt; calls (checks for a status claim with a value of 'Gold'):
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 11pt; COLOR: #2b91af; FONT-FAMILY: consolas; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt;HttpContext&lt;/span&gt;&lt;span style="FONT-SIZE: 11pt; FONT-FAMILY: consolas; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt;.Current.User.IsInRole(&lt;span style="COLOR: #a31515"&gt;"Gold"&lt;/span&gt;);&lt;/span&gt; 
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   Retrieving the &lt;em&gt;OrderHistory&lt;/em&gt; claim:
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
   &lt;span style="COLOR: #2b91af; FONT-FAMILY: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt;IdentityPrincipal&lt;/span&gt;&lt;span style="FONT-FAMILY: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt; ip
   = &lt;span style="COLOR: #2b91af"&gt;IdentityPrincipal&lt;/span&gt;.Current;&lt;br&gt;
   &lt;span style="COLOR: #2b91af"&gt;Claim&lt;/span&gt; orderHistory = ip.ClaimSets.FindClaim(&lt;br&gt;
   &lt;span style="COLOR: #2b91af"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Constants&lt;/span&gt;.OrderHistoryClaimType, 
   &lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: #2b91af"&gt;Constants&lt;/span&gt;&lt;?xml:namespace prefix = o /&gt;.ApplicationIssuerIdentityClaim);&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: consolas; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt;var&lt;/span&gt;&lt;span style="FONT-SIZE: 11pt; FONT-FAMILY: consolas; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt; orders
= orderHistory.Get&amp;lt;&lt;span style="COLOR: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR: #2b91af"&gt;OrderDetail&lt;/span&gt;&amp;gt;&amp;gt;();&lt;/span&gt; 
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   ..or some authorization code from my CardSpace sample app - thanks to the unified
   authorization model, I can share this method across ASP.NET, ASMX and WCF:
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
   &lt;span style="COLOR: blue; FONT-FAMILY: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span style="FONT-FAMILY: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="COLOR: #2b91af"&gt;MessageBoard&lt;/span&gt;&amp;gt;
   GetBoardsForUser(&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: #2b91af"&gt;AuthorizationContext&lt;/span&gt; context, &lt;span style="COLOR: blue"&gt;bool&lt;/span&gt; includePublic)&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;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR: #2b91af"&gt;MessageBoard&lt;/span&gt;&amp;gt;
   boards = &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;MessageBoard&lt;/span&gt;&amp;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: blue"&gt;foreach&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;Claim&lt;/span&gt; typeClaim &lt;span style="COLOR: blue"&gt;in&lt;/span&gt; context.ClaimSets.FindClaims(&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;AppClaims&lt;/span&gt;.UserTypeClaim, 
   &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;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;ApplicationIssuerClaimSet&lt;/span&gt;()))&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;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; type
   = typeClaim.Get&amp;lt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&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;span style="COLOR: blue"&gt;if&lt;/span&gt; (&lt;span style="COLOR: #a31515"&gt;"Public"&lt;/span&gt;.Equals(type)
   &amp;amp;&amp;amp; includePublic == &lt;span style="COLOR: blue"&gt;false&lt;/span&gt;) &lt;span style="COLOR: blue"&gt;continue&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;boards.AddRange(GetBoards(type));&lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&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; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;return&lt;/span&gt; boards;&lt;br&gt;
   }&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   I have updated the source download &lt;a href="http://www.leastprivilege.com/IdentityModel"&gt;here&lt;/a&gt; to
   include a console, WCF and ASP.NET test app that share the same authorization model.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=d804a3e4-3dcc-4935-b8a9-3ffce3d31848" /&gt;</content>
  </entry>
  <entry>
    <title>LINQ to SQL and Security</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/LINQToSQLAndSecurity.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=c39e9b51-68d3-4bd1-b417-9cc7e284cfb5</id>
    <published>2008-03-21T14:16:11.2497973+01:00</published>
    <updated>2008-03-21T14:30:37.9372973+01:00</updated>
    <category term="Work in Progress" label="Work in Progress" scheme="dasBlog" />
    <content type="html">&lt;p&gt;
   I don't know how many SQL injection demos I did in my life - and it is still surprising
   (or shocking rather) how many people don't know about this. It is even more surprising
   how many people fight for their string concat ad hoc queries and come up with all
   kind of dodgy excuses why it makes sense to use them.
&lt;/p&gt;
&lt;p&gt;
   What is wrong with SQL parameters? ;)
&lt;/p&gt;
&lt;p&gt;
   Recently I played around with LINQ to SQL and think it is a compelling (and time saving)
   way to do database interactions. The thing I really like about LINQ to SQL is that
   it does the right thing by default (security wise) when it comes to parameters.
&lt;/p&gt;
&lt;p&gt;
   Consider this query:
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;
   &lt;span style="color: blue; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt;var&lt;/span&gt;&lt;span style="font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt; products
   = &lt;span style="color: blue"&gt;from&lt;/span&gt; p &lt;span style="color: blue"&gt;in&lt;/span&gt; context.products&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;where&lt;/span&gt; p.description.StartsWith(_txtSearch.Text)&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;select&lt;/span&gt; &lt;span style="color: blue"&gt;new&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; &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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;p.description,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;p.price,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;p.stock&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;?xml:namespace prefix = o /&gt;};&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   This gets turned into the following SQL (for a search value of 'sony'):
&lt;/p&gt;
&lt;p&gt;
   &lt;font face="Courier New"&gt;exec sp_executesql N'SELECT [t0].[description], [t0].[price],
   [t0].[stock]&lt;br&gt;
   FROM [dbo].[products] AS [t0]&lt;br&gt;
   WHERE [t0].[description] LIKE @p0',N'@p0 varchar(5)',@p0='sony%'&lt;/font&gt; 
&lt;p&gt;
   A (malicious) search value with an appended &lt;em&gt;or 1=1&lt;/em&gt; where clause would look
   like this:
&lt;/p&gt;
&lt;p&gt;
   &lt;font face="Courier New"&gt;exec sp_executesql N'SELECT [t0].[description], [t0].[price],
   [t0].[stock]&lt;br&gt;
   FROM [dbo].[products] AS [t0]&lt;br&gt;
   WHERE [t0].[description] LIKE @p0',N'@p0 varchar(16)',@p0='sony'' or 1=1 --%'&lt;/font&gt; 
&lt;p&gt;
   Which will not yield any results.
&lt;/p&gt;
&lt;p&gt;
   So if you really like ad hoc SQL - but for some reason are too lazy to work with parameters,
   LINQ is a compelling alternative (again purely from a security view).
&lt;/p&gt;
&lt;p&gt;
   Usually the databases I design (and how I recommend it to my customers), don't allow
   direct table access. All access is done via stored procedures. This is where LINQ
   to SQL comes in really handy for me - basically as a nice Sproc to C# code generator.
   Calling a &lt;em&gt;GetData&lt;/em&gt; stored procedure and subsequent binding to a grid looks
   like this:
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;
   &lt;span style="color: blue; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt;protected&lt;/span&gt;&lt;span style="font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; _btnSearch_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;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;ComputerstoreDataContext&lt;/span&gt; context
   = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ComputerstoreDataContext&lt;/span&gt;())&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;&lt;span style="color: blue"&gt;var&lt;/span&gt; products
   = context.GetProducts(_txtSearch.Text);&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;_gridProducts.DataSource
   = products;&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _gridProducts.DataBind();&lt;br&gt;
   &lt;/span&gt;&lt;span style="font-family: consolas; mso-bidi-font-family: 'Times New Roman'; 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;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   Which will result in this SQL:
&lt;/p&gt;
&lt;p&gt;
   &lt;font face="Courier New"&gt;declare @p4 int&lt;br&gt;
   set @p4=0&lt;br&gt;
   exec sp_executesql N'EXEC @RETURN_VALUE = [dbo].[GetProducts] @Search = @p0',N'@p0
   nvarchar(4),@RETURN_VALUE int output',@p0=N'sony',@RETURN_VALUE=@p4 output&lt;br&gt;
   select @p4&lt;/font&gt; 
&lt;p&gt;
   This works for me.
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;Disclaimer:&lt;/strong&gt; There's quite some controversy about LINQ to SQL and
   I am not a database expert enough to say if LINQ is good or bad. They way I use it
   (for Sprocs only) it seems to be fine. Again from a security point of view it does
   the right thing by default. And that's what I mostly care about ;)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leastprivilege.com/aggbug.ashx?id=c39e9b51-68d3-4bd1-b417-9cc7e284cfb5" /&gt;</content>
  </entry>
  <entry>
    <title>Using IdentityModel: Adding ASP.NET Support Part 2 (Claims Manager)</title>
    <link rel="alternate" type="text/html" href="http://www.leastprivilege.com/UsingIdentityModelAddingASPNETSupportPart2ClaimsManager.aspx" />
    <id>http://www.leastprivilege.com/PermaLink.aspx?guid=178b4d64-d933-456b-aefc-5970c304edb2</id>
    <published>2008-03-20T07:54:32.2416027+01:00</published>
    <updated>2008-03-20T07:54:32.2416027+01:00</updated>
    <category term="ASP.NET" label="ASP.NET" scheme="dasBlog" />
    <category term="IdentityModel" label="IdentityModel" scheme="dasBlog" />
    <content type="html">&lt;p&gt;
   The last step for integrating claims into ASP.NET is to write a module that loads
   authorization policies, creates an &lt;em&gt;AuthorizationContext&lt;/em&gt; and persists that
   on &lt;em&gt;Context.User&lt;/em&gt;/&lt;em&gt;Thread.CurrentPrincipal&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
   My module has this simple configuration section:
&lt;/p&gt;
&lt;span style="font-size: 11pt; color: blue; line-height: 115%; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 11pt; color: #a31515; line-height: 115%; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;claimsManager&lt;/span&gt;&lt;span style="font-size: 11pt; color: blue; line-height: 115%; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt; &lt;/span&gt;&lt;span style="font-size: 11pt; color: red; line-height: 115%; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;enabled&lt;/span&gt;&lt;span style="font-size: 11pt; color: blue; line-height: 115%; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;=&lt;/span&gt;&lt;span style="font-size: 11pt; line-height: 115%; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;"&lt;span style="color: blue"&gt;true&lt;/span&gt;"&lt;br&gt;
&lt;span style="color: blue"&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&gt;&lt;span style="color: red"&gt;addAuthenticationClaims&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;true&lt;/span&gt;"&lt;br&gt;
&lt;span style="color: blue"&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&gt;&lt;span style="color: red"&gt;roleClaimType&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;urn:leastprivilege/claims/customers/status&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;authorizationPolicies&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: blue"&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="color: #a31515"&gt;policy&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;LeastPrivilege.CustomerIdAuthorizationPolicy,
App_Code&lt;/span&gt;"&lt;span style="color: blue"&gt; /&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: blue"&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="color: #a31515"&gt;policy&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;LeastPrivilege.CustomerAuthorizationPolicy,
App_Code&lt;/span&gt;"&lt;span style="color: blue"&gt; /&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;authorizationPolicies&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;claimsManager&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; 
&lt;p&gt;
   If &lt;em&gt;addAuthenticationClaims&lt;/em&gt; is set to true, the policy that transforms authentication
   details to claims (see my last post) will be loaded before all the external policies.
   The &lt;em&gt;roleClaimType&lt;/em&gt; attribute specifies the claim type that should be used
   for the &lt;em&gt;IsInRole&lt;/em&gt; implementation of &lt;em&gt;IdentityPrincipal&lt;/em&gt;. The &lt;em&gt;authorizationPolicies&lt;/em&gt; collection
   specifies the claims transformation policies that should run.
&lt;/p&gt;
&lt;p&gt;
   The module itself subscribes to PostAuthenticateRequest, loads the policies and populates &lt;em&gt;Context.User/Thread.CurrentPrincipal&lt;/em&gt; with
   the &lt;em&gt;IdentityPrincipal&lt;/em&gt; (which in turn wraps the &lt;em&gt;AuthorizationContext&lt;/em&gt;).
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;
   &lt;span style="color: blue; font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span style="font-family: consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ClaimsManagerModule&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;IHttpModule&lt;br&gt;
   &lt;/span&gt;{&lt;span style="color: #2b91af"&gt;
   &lt;br&gt;
   &lt;/span&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; Dispose()&lt;span style="color: #2b91af"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ }&lt;span style="color: #2b91af"&gt;
   &lt;br&gt;
   &lt;br&gt;
   &lt;/span&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; Init(&lt;span style="color: #2b91af"&gt;HttpApplication&lt;/span&gt; context)&lt;span style="color: #2b91af"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;span style="color: #2b91af"&gt;
   &lt;br&gt;
   &lt;/span&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;context.PostAuthenticateRequest
   += OnPostAuthenticateRequest;&lt;span style="color: #2b91af"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;span style="color: #2b91af"&gt;
   &lt;br&gt;
   &lt;br&gt;
   &lt;/span&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: blue"&gt;void&lt;/span&gt; OnPostAuthenticateRequest(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;span style="color: #2b91af"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;span style="color: #2b91af"&gt;
   &lt;br&gt;
   &lt;/span&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: green"&gt;//
   this code makes only sense when the user is authenticated&lt;/span&gt;&lt;span style="color: #2b91af"&gt;
   &lt;br&gt;
   &lt;/span&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; (!(&lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Request.IsAuthenticated))&lt;span style="color: #2b91af"&gt;
   &lt;br&gt;
   &lt;/span&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;{