<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Pablo Cibraro (Cibrax)]]></title>
  <link href="http://cibrax.me/atom.xml" rel="self"/>
  <link href="http://cibrax.me/"/>
  <updated>2014-10-20T15:32:01-03:00</updated>
  <id>http://cibrax.me/</id>
  <author>
    <name><![CDATA[Cibrax]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[do not version urls]]></title>
    <link href="http://cibrax.me/blog/2014/10/20/do-not-version-urls/"/>
    <updated>2014-10-20T15:21:00-03:00</updated>
    <id>http://cibrax.me/blog/2014/10/20/do-not-version-urls</id>
    <content type="html"><![CDATA[<p>Versioning the Web API URL is probably one of most common choice among developers. Well-known APIs such as Twitter, Github or Facebook use this approach, but it does not mean it&rsquo;s the best way to do things. It presents some of the issues discussed below.</p>

<ul>
<li>A new version number represents a new set of resources. If you have to create a new version to introduce a breaking change in one resource, that change expands to all the resources.</li>
</ul>


<p>For example. You have two resources /orders and /customers. You need to introduce a new version to accommodate an schema change in orders. That implies adding a new version number in the URL for v1/orders and v1/customers. Although customers is still the same resource, it&rsquo;s now referenced as a new resource v1/customers.</p>

<ul>
<li><p>It&rsquo;s hard to introduce backward compatibility changes. You might want to introduce improvements or changes that new clients can use without affecting existing ones. You can create a new version number for this, but it will represent some unnecessary overhead. Existing clients won&rsquo;t be affected by the change so creating a new version does not seem to be right. Also, you will not want to keep the same version number as you will want clients to know which specific version they are targeting.</p></li>
<li><p>It does not go along with the idea of introducing incremental changes. A new version number usually represents a major release. If you want to make those changes public as they become available, you need a new version number. However, you won&rsquo;t want to create v1, v1.1, v1.2 for the overhead discussed in #2.</p></li>
</ul>


<h2>A better approach for versioning.</h2>

<p>Use an http header to specify version. If no http header is specified in the request message, stick to the latest version.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>/orders
</span><span class='line'>accepts-version: 1.0
</span><span class='line'>content-type: application/json</span></code></pre></td></tr></table></div></figure>


<p>The &ldquo;accepts-version&rdquo; header represents the version the client can understand. If some changes were introduced in the resource representation that won&rsquo;t affect the client, the service might be able to return it. Let&rsquo;s say that you now have a new version 1.3 for /orders, which only contains backward compatibility changes. The server can return a header to inform that.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>/orders
</span><span class='line'>version: 1.3</span></code></pre></td></tr></table></div></figure>


<p>The client will know a new version exists, which is also compatible with 1.0 so it can optionally upgrade to it. This approach also works for fine for dynamic languages or schema-less types like json.</p>

<p>For embedded URLs or browser support, the http header can be replaced by an optional query string parameter ?accepts-version or ?v to make it shorter.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[SelfHost Utilities]]></title>
    <link href="http://cibrax.me/blog/2014/07/23/selfhost-utilities/"/>
    <updated>2014-07-23T09:49:00-03:00</updated>
    <id>http://cibrax.me/blog/2014/07/23/selfhost-utilities</id>
    <content type="html"><![CDATA[<p>Self Hosting a Http server is a very common scenario these days with the push that Microsoft and the rest of the community are giving to Owin. One of the challenges you often find in this scenario is the ability to use HTTPS, and I can say by experience that it&rsquo;s not something trivial. You have to run several commands, and usually generate a self signed certificate for SSL.</p>

<p>As part of the project where I was working on, we had to automate many of these steps in the installation process so we came up with a set of utilities classes that call the underline Win32 APIS for generate the certificate and also do the required registrations for the namespace and port. The process for doing this with these classes is pretty straigforward as it is shown below,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="kt">var</span> <span class="n">cert</span> <span class="p">=</span> <span class="n">X509Util</span><span class="p">.</span><span class="n">CreateSelfSignedCertificate</span><span class="p">(</span><span class="n">Environment</span><span class="p">.</span><span class="n">MachineName</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//Register a namespace reservation for everyone in localhost in port 9010</span>
</span><span class='line'><span class="n">HttpServerApi</span><span class="p">.</span><span class="n">ModifyNamespaceReservation</span><span class="p">(</span><span class="k">new</span> <span class="n">Uri</span><span class="p">(</span><span class="s">&quot;https://localhost:9010&quot;</span><span class="p">),</span>
</span><span class='line'>  <span class="s">&quot;everyone&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="n">HttpServerApiConfigurationAction</span><span class="p">.</span><span class="n">AddOrUpdate</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//Register the SSL certificate for any address (0.0.0.0) in the port 9010.</span>
</span><span class='line'><span class="n">HttpServerApi</span><span class="p">.</span><span class="n">ModifySslCertificateToAddressBinding</span><span class="p">(</span><span class="s">&quot;0.0.0.0&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="m">9010</span><span class="p">,</span>
</span><span class='line'>  <span class="n">cert</span><span class="p">.</span><span class="n">GetCertHash</span><span class="p">(),</span>
</span><span class='line'>  <span class="n">System</span><span class="p">.</span><span class="n">Security</span><span class="p">.</span><span class="n">Cryptography</span><span class="p">.</span><span class="n">X509Certificates</span><span class="p">.</span><span class="n">StoreName</span><span class="p">.</span><span class="n">My</span><span class="p">,</span>
</span><span class='line'>  <span class="n">HttpServerApiConfigurationAction</span><span class="p">.</span><span class="n">AddOrUpdate</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>All the code is now available for you in github <a href="https://github.com/pcibraro/SelfHostUtilities">SelfHostUtilities</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[AppFabric OutputCaching]]></title>
    <link href="http://cibrax.me/blog/2014/05/23/appfabric-outputcaching/"/>
    <updated>2014-05-23T14:36:00-03:00</updated>
    <id>http://cibrax.me/blog/2014/05/23/appfabric-outputcaching</id>
    <content type="html"><![CDATA[<p>ASP.NET Web API does not provide any output caching capabilities out of the box other than the ones you would traditionally find in the ASP.NET caching module.
Fortunately, Filip <a href="http://www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/">wrote a very nice library</a> that you can use to decorate your Web API controller methods with an [OutputCaching] attribute, which is similar to the one you can find in ASP.NET MVC.
This library provides a way to configure different persistence storages for the cached data, which uses memory by default. As part of this post, I will show how you can implement your own persistence provider for AppFabric in order to support distributed caching on web applications running on premises.</p>

<p>The first thing is to install AppFabric Caching. Wade Wegner wrote a very useful post describing all the required steps <a href="http://www.wadewegner.com/2010/08/getting-started-with-windows-server-appfabric-cache/">here</a>.</p>

<p>Once AppFabric Cache is installed, you need to start the cluster and configure a new cache that will be used by our extension. Open up the Cache PowerShell console (Caching Administration Windows PowerShell in programs). Run the following command in the PowerShell console:</p>

<p>Start-CacheCluster</p>

<p>Create a new cache for our extension. Run the following command in the PowerShell console:</p>

<p>New-Cache OutputCache</p>

<p>At that point, we are ready to jump into the implementation of the extension. Before writing any code, we will use the AppFabric Caching client library, which is available as a Nuget package. You can find it in the repository under the name of &ldquo;ServerAppFabric.Client&rdquo;.
The library written by Filip provides an extension point for the persistence providers called IApiOutputCache, so we will have to implement that interface.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">AppFabricCachingProvider</span> <span class="p">:</span> <span class="n">IApiOutputCache</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">readonly</span> <span class="k">static</span> <span class="n">DataCacheFactory</span> <span class="n">Factory</span> <span class="p">=</span> <span class="k">new</span> <span class="n">DataCacheFactory</span><span class="p">();</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">string</span> <span class="n">Region</span> <span class="p">=</span> <span class="s">&quot;OutputCache&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="k">readonly</span> <span class="n">DataCache</span> <span class="n">cache</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="nf">AppFabricCachingProvider</span><span class="p">(</span><span class="kt">string</span> <span class="n">cacheName</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="n">cache</span> <span class="p">=</span> <span class="n">Factory</span><span class="p">.</span><span class="n">GetCache</span><span class="p">(</span><span class="n">cacheName</span><span class="p">);</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="n">cache</span><span class="p">.</span><span class="n">CreateRegion</span><span class="p">(</span><span class="n">Region</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">void</span> <span class="nf">Add</span><span class="p">(</span><span class="kt">string</span> <span class="n">key</span><span class="p">,</span> <span class="kt">object</span> <span class="n">o</span><span class="p">,</span> <span class="n">DateTimeOffset</span> <span class="n">expiration</span><span class="p">,</span> <span class="kt">string</span> <span class="n">dependsOnKey</span> <span class="p">=</span> <span class="k">null</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">exp</span> <span class="p">=</span> <span class="n">expiration</span> <span class="p">-</span> <span class="n">DateTime</span><span class="p">.</span><span class="n">Now</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">dependsOnKey</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">dependsOnKey</span> <span class="p">=</span> <span class="n">key</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">cache</span><span class="p">.</span><span class="n">Put</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">o</span><span class="p">,</span> <span class="k">new</span><span class="p">[]</span> <span class="p">{</span> <span class="k">new</span> <span class="n">DataCacheTag</span><span class="p">(</span><span class="n">dependsOnKey</span><span class="p">)</span> <span class="p">},</span> <span class="n">Region</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="kt">bool</span> <span class="nf">Contains</span><span class="p">(</span><span class="kt">string</span> <span class="n">key</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">result</span> <span class="p">=</span> <span class="k">this</span><span class="p">.</span><span class="n">cache</span><span class="p">.</span><span class="n">Get</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">Region</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">result</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span> <span class="k">return</span> <span class="k">true</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="kt">object</span> <span class="nf">Get</span><span class="p">(</span><span class="kt">string</span> <span class="n">key</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">result</span> <span class="p">=</span> <span class="k">this</span><span class="p">.</span><span class="n">cache</span><span class="p">.</span><span class="n">Get</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">Region</span><span class="p">);</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">T</span> <span class="n">Get</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;(</span><span class="kt">string</span> <span class="n">key</span><span class="p">)</span> <span class="k">where</span> <span class="n">T</span> <span class="p">:</span> <span class="k">class</span>
</span><span class='line'>    <span class="err">{</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">result</span> <span class="p">=</span> <span class="k">this</span><span class="p">.</span><span class="n">cache</span><span class="p">.</span><span class="n">Get</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">Region</span><span class="p">)</span> <span class="k">as</span> <span class="n">T</span><span class="p">;</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">void</span> <span class="nf">Remove</span><span class="p">(</span><span class="kt">string</span> <span class="n">key</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="n">cache</span><span class="p">.</span><span class="n">Remove</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">Region</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">void</span> <span class="nf">RemoveStartsWith</span><span class="p">(</span><span class="kt">string</span> <span class="n">key</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">objs</span> <span class="p">=</span> <span class="k">this</span><span class="p">.</span><span class="n">cache</span><span class="p">.</span><span class="n">GetObjectsByTag</span><span class="p">(</span><span class="k">new</span> <span class="n">DataCacheTag</span><span class="p">(</span><span class="n">key</span><span class="p">),</span> <span class="n">Region</span><span class="p">);</span>
</span><span class='line'>        <span class="k">foreach</span><span class="p">(</span><span class="kt">var</span> <span class="n">o</span> <span class="k">in</span> <span class="n">objs</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="n">cache</span><span class="p">.</span><span class="n">Remove</span><span class="p">(</span><span class="n">o</span><span class="p">.</span><span class="n">Key</span><span class="p">,</span> <span class="n">Region</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This implementation is pretty straightforward and uses the AppFabric client library for getting or storing data in the cache. All the data is stored as part of a region, which groups all the entries together to facilitate management. The name of the cache is passed as part of the constructor, so it will be provided at the moment of instantiating and configuring this extension.</p>

<p>The following code shows how the extension is configured,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="kt">var</span> <span class="n">config</span> <span class="p">=</span> <span class="k">new</span> <span class="n">HttpSelfHostConfiguration</span><span class="p">(</span><span class="s">&quot;http://localhost:999&quot;</span><span class="p">);</span>
</span><span class='line'><span class="n">config</span><span class="p">.</span><span class="n">Routes</span><span class="p">.</span><span class="n">MapHttpRoute</span><span class="p">(</span>
</span><span class='line'>      <span class="n">name</span><span class="p">:</span> <span class="s">&quot;DefaultApi&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="n">routeTemplate</span><span class="p">:</span> <span class="s">&quot;api/{controller}/{id}&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="n">defaults</span><span class="p">:</span> <span class="k">new</span> <span class="p">{</span> <span class="n">id</span> <span class="p">=</span> <span class="n">RouteParameter</span><span class="p">.</span><span class="n">Optional</span> <span class="p">}</span>
</span><span class='line'><span class="p">);</span>
</span><span class='line'><span class="kt">var</span> <span class="n">server</span> <span class="p">=</span> <span class="k">new</span> <span class="n">HttpSelfHostServer</span><span class="p">(</span><span class="n">config</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">config</span><span class="p">.</span><span class="n">CacheOutputConfiguration</span><span class="p">().</span><span class="n">RegisterCacheOutputProvider</span><span class="p">(()</span> <span class="p">=&gt;</span> <span class="k">new</span> <span class="n">AppFabricCachingProvider</span><span class="p">(</span><span class="s">&quot;OutputCache&quot;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="n">server</span><span class="p">.</span><span class="n">OpenAsync</span><span class="p">().</span><span class="n">Wait</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="n">Console</span><span class="p">.</span><span class="n">ReadKey</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="n">server</span><span class="p">.</span><span class="n">CloseAsync</span><span class="p">().</span><span class="n">Wait</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>The name of the cache must be the same that we used before in the powershell console with the New-Cache command.</p>

<p>Finally, output caching can be configured in any existing controller using the [OutputCaching] attribute distributed with the Filip&rsquo;s library.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">TeamsController</span> <span class="p">:</span> <span class="n">ApiController</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>
</span><span class='line'><span class="na">    [CacheOutput(ClientTimeSpan = 50, ServerTimeSpan = 50)]</span>
</span><span class='line'>    <span class="k">public</span> <span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">Team</span><span class="p">&gt;</span> <span class="n">Get</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">Teams</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The implementation of this provider is available as a <a href="https://github.com/pcibraro/CacheOutput.AppFabric">separate project in GitHub</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Making ajax calls with Hawk authentication to ASP.NET Web API]]></title>
    <link href="http://cibrax.me/blog/2014/01/31/making-ajax-calls-with-hawk-authentication-to-asp-dot-net-web-api/"/>
    <updated>2014-01-31T14:14:00-03:00</updated>
    <id>http://cibrax.me/blog/2014/01/31/making-ajax-calls-with-hawk-authentication-to-asp-dot-net-web-api</id>
    <content type="html"><![CDATA[<p>Hawk is an authentication protocol initially written by Eran Hammer in javascript for being used in Node.js. Later on, Eran also added support for browsers through a browser.js library, which is also part of the <a href="https://github.com/hueniverse/hawk">hawk github project</a>.</p>

<p>As part of this post, I will show how you can use that browser.js library to make Ajax calls to a ASP.NET Web API that authenticates the calls with Hawk.</p>

<p>The first thing is to define the Web API to call from javascript. For the sake of simplicity, we will use a very simple &ldquo;Hello World&rdquo; controller that returns the name of the authenticated user.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">HelloWorldController</span> <span class="p">:</span> <span class="n">ApiController</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">public</span> <span class="kt">string</span> <span class="nf">Get</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="s">&quot;hello &quot;</span> <span class="p">+</span> <span class="k">this</span><span class="p">.</span><span class="n">User</span><span class="p">.</span><span class="n">Identity</span><span class="p">.</span><span class="n">Name</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>As second step, we will configure the Hawk filter globally to authenticate the calls. This filter is part of the HawkNet integration project with Web API.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Register</span><span class="p">(</span><span class="n">HttpConfiguration</span> <span class="n">config</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">config</span><span class="p">.</span><span class="n">Filters</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">RequiresHawkAttribute</span><span class="p">((</span><span class="n">id</span><span class="p">)</span> <span class="p">=&gt;</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">new</span> <span class="n">HawkCredential</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">Id</span> <span class="p">=</span> <span class="s">&quot;dh37fgj492je&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="n">Key</span> <span class="p">=</span> <span class="s">&quot;werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="n">Algorithm</span> <span class="p">=</span> <span class="s">&quot;hmacsha256&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="n">User</span> <span class="p">=</span> <span class="s">&quot;steve&quot;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>  <span class="p">}));</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Once we have the Web API configured, we will write the javascript to make the call, which will use browser.js to generate the hawk header on the client.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;~/Scripts/browser.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;script&gt;</span>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">url</span> <span class="o">=</span> <span class="s1">&#39;http://localhost:28290/api/HelloWorld&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">credentials</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">id</span><span class="o">:</span> <span class="s1">&#39;dh37fgj492je&#39;</span><span class="p">,</span> <span class="c1">// Required by Hawk.client.header</span>
</span><span class='line'>        <span class="nx">key</span><span class="o">:</span> <span class="s1">&#39;werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">algorithm</span><span class="o">:</span> <span class="s1">&#39;sha256&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">user</span><span class="o">:</span> <span class="s1">&#39;Steve&#39;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#helloworld&quot;</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>              
</span><span class='line'>      <span class="kd">var</span> <span class="nx">header</span> <span class="o">=</span> <span class="nx">hawk</span><span class="p">.</span><span class="nx">client</span><span class="p">.</span><span class="nx">header</span><span class="p">(</span><span class="nx">url</span><span class="p">,</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">credentials</span><span class="o">:</span> <span class="nx">credentials</span> <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span>
</span><span class='line'>          <span class="nx">dataType</span><span class="o">:</span> <span class="s2">&quot;json&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span> <span class="nx">authorization</span><span class="o">:</span> <span class="nx">header</span><span class="p">.</span><span class="nx">field</span> <span class="p">},</span>
</span><span class='line'>          <span class="nx">url</span><span class="o">:</span> <span class="nx">url</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">success</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">error</span><span class="p">,</span> <span class="nx">response</span><span class="p">,</span> <span class="nx">body</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  
</span><span class='line'>              <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#response&quot;</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span><span class="nx">body</span><span class="p">.</span><span class="nx">responseText</span><span class="p">);</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, the part that matters in the sample above is how you generate the hawk header by calling the &ldquo;header&rdquo; method in the client object provided by the browser.js library. That method receives the url, the http method and the credentials. The result of that call is the hawk authentication header, which is attached to the authorization header in the ajax call.</p>

<p>The complete sample can be found in the <a href="https://github.com/pcibraro/hawknet/tree/master/Example.Web">HawkNet github project</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Coordinating async work in Node.js]]></title>
    <link href="http://cibrax.me/blog/2014/01/13/coordinating-async-work-in-node-dot-js/"/>
    <updated>2014-01-13T10:39:00-03:00</updated>
    <id>http://cibrax.me/blog/2014/01/13/coordinating-async-work-in-node-dot-js</id>
    <content type="html"><![CDATA[<p>When you first move to Node.js, you need to get used to write asynchronous single thread code that does not block. For some scenarios, writing such kind of code is not trivial, specially when you have to coordinate the execution of multiple async calls in parallel and return a result after all these tasks have been completed. One thing you don&rsquo;t want to do in that scenario is block the main thread to wait for all the calls, which is how you normally do in other platforms. Let&rsquo;s discuss a very trivial example that coordinates two calls for getting information from two different sources, which is subsequently returned as a response message in express.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">exports</span><span class="p">.</span><span class="nx">index</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">){</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">returnResponse</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">data</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">getName</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">data</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="nx">name</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span><span class="p">(</span><span class="nx">returnResponse</span><span class="p">)</span>
</span><span class='line'>          <span class="nx">res</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="s1">&#39;index&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">title</span><span class="o">:</span> <span class="s1">&#39;Express&#39;</span><span class="p">,</span> <span class="nx">data</span><span class="o">:</span> <span class="nx">data</span> <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">returnResponse</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">getPhone</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">phone</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">data</span><span class="p">.</span><span class="nx">phone</span> <span class="o">=</span> <span class="nx">phone</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span><span class="p">(</span><span class="nx">returnResponse</span><span class="p">)</span>
</span><span class='line'>          <span class="nx">res</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="s1">&#39;index&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">title</span><span class="o">:</span> <span class="s1">&#39;Express&#39;</span><span class="p">,</span> <span class="nx">data</span><span class="o">:</span> <span class="nx">data</span> <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">returnResponse</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>The code above calls two functions to retrieve a name and a phone from different places asynchronously. The results of the calls are temporarily stored as members of the &ldquo;data&rdquo; variable. The ugly part is how the &ldquo;returnResponse&rdquo; variable is also used to notify that each function has done its part and a response can be returned. This contains duplicated code, it&rsquo;s error prone and it can easily get more complicated as the number of async calls increase.</p>

<p>As interesting fact, there isn&rsquo;t any built-in or native functionality to handle an scenario like this in Node.js. That&rsquo;s where an module like &ldquo;async&rdquo; comes in place. &ldquo;Async&rdquo; is a swiss knife for async work in Node.js. It provides a ton of functions for coordinating asynchronous tasks such as the ones shown in next examples.</p>

<p>One of the functions you will find useful for an scenario like this is parallel. The parallel function receives an array of async functions to call, and invokes a final callback when all the functions have completed their part.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">exports</span><span class="p">.</span><span class="nx">index</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">){</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">async</span><span class="p">.</span><span class="nx">parallel</span><span class="p">([</span>
</span><span class='line'>      <span class="kd">function</span><span class="p">(</span><span class="nx">callback</span><span class="p">){</span> <span class="nx">getName</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">if</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>          <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">name</span><span class="p">);</span>
</span><span class='line'>      <span class="p">})},</span>
</span><span class='line'>      <span class="kd">function</span><span class="p">(</span><span class="nx">callback</span><span class="p">){</span> <span class="nx">getPhone</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">phone</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">if</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>          <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">phone</span><span class="p">);</span>
</span><span class='line'>      <span class="p">})}</span>
</span><span class='line'>  <span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">results</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      
</span><span class='line'>      <span class="kd">var</span> <span class="nx">data</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">name</span> <span class="o">:</span> <span class="nx">results</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
</span><span class='line'>          <span class="nx">phone</span><span class="o">:</span> <span class="nx">results</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">res</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="s1">&#39;index&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">title</span><span class="o">:</span> <span class="s1">&#39;Express&#39;</span><span class="p">,</span> <span class="nx">data</span><span class="o">:</span> <span class="nx">data</span> <span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Every function in the Array passed to the parallel function receives a callback argument, which must be called after the work is completed. That callback receives two arguments, an error if something went wrong and a result. All the collected results and  errors are later passed to the final callback.</p>

<p>Another useful function is &ldquo;each&rdquo;, which is similar to &ldquo;parallel&rdquo;, but it iterates over an array and invokes a function representing the async work for every element in that array.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">exports</span><span class="p">.</span><span class="nx">index</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">async</span><span class="p">.</span><span class="nx">each</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">item</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">getDataForItem</span><span class="p">(</span><span class="nx">item</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">data</span><span class="p">);</span>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">},</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>       <span class="nx">res</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="s1">&#39;index2&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">title</span><span class="o">:</span> <span class="s1">&#39;Express&#39;</span><span class="p">,</span> <span class="nx">data</span><span class="o">:</span> <span class="nx">data</span> <span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the code above, the function is executed three times with the values &ldquo;1&rdquo;, &ldquo;2&rdquo; and &ldquo;3&rdquo;. A callback is also executed when the work is completed. The final callback is executed after all the functions invoked the callback.</p>

<p>This is a good way to coordinate async work in node.js, but you also have promises, which is not widely adopted yet in the platform as a way to represent async tasks. It&rsquo;s implemented by a lot of modules out there, but it&rsquo;s not something standard yet. A promise is an object that represents an asynchronous task. Among other things, this object represents a way to manipulate the task, determine when it is completed or to chain other tasks for example. The following example illustrates how a promise looks like in the Moongose module (example included in the <a href="http://mongoosejs.com/docs/api.html">Moongose docs</a>),</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">promise</span> <span class="o">=</span> <span class="nx">Meetups</span><span class="p">.</span><span class="nx">find</span><span class="p">({</span> <span class="nx">tags</span><span class="o">:</span> <span class="s1">&#39;javascript&#39;</span> <span class="p">}).</span><span class="nx">select</span><span class="p">(</span><span class="s1">&#39;_id&#39;</span><span class="p">).</span><span class="nx">exec</span><span class="p">();</span>
</span><span class='line'><span class="nx">promise</span><span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">meetups</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">ids</span> <span class="o">=</span> <span class="nx">meetups</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">m</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">m</span><span class="p">.</span><span class="nx">_id</span><span class="p">;</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">People</span><span class="p">.</span><span class="nx">find</span><span class="p">({</span> <span class="nx">meetups</span><span class="o">:</span> <span class="p">{</span> <span class="nx">$in</span><span class="o">:</span> <span class="nx">ids</span> <span class="p">}).</span><span class="nx">exec</span><span class="p">();</span>
</span><span class='line'><span class="p">}).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">people</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">people</span><span class="p">.</span><span class="nx">length</span> <span class="o">&amp;</span><span class="nx">lt</span><span class="p">;</span> <span class="mi">10000</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">&#39;Too few people!!!&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">&#39;Still need more people!!!&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}).</span><span class="nx">then</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">assert</span><span class="p">.</span><span class="nx">ok</span><span class="p">(</span><span class="nx">err</span> <span class="k">instanceof</span> <span class="nb">Error</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Meetups is a Moongose object for executing queries against a MongoDB collection. &ldquo;exec&rdquo; is a method in the returned promise to start the call, and &ldquo;then&rdquo; is another method to chain other promises when the execution is completed. In this example, another promise to find people is executed after all the meetups have been found.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[OAuth Bridge for ADFS with ThinkTecture Authorization Server]]></title>
    <link href="http://cibrax.me/blog/2013/12/27/oauth-bridge-for-adfs-with-thinkteckture-authorization-server/"/>
    <updated>2013-12-27T10:23:00-03:00</updated>
    <id>http://cibrax.me/blog/2013/12/27/oauth-bridge-for-adfs-with-thinkteckture-authorization-server</id>
    <content type="html"><![CDATA[<p>ADFS 2.0 only supports SAML 2.0 and WS-Federation for supporting single sign on web applications and services. However, some new development platforms such as iOS only support OAuth 2.0, which makes the use of ADFS a bit tricky. ADFS for Windows Server 2012 R2 already provides some limited support for JSON Web Tokens (JWT) with the OAuth 2.0 the code flow (As it is described in this <a href="http://www.cloudidentity.com/blog/2013/07/30/securing-a-web-api-with-windows-server-2012-r2-adfs-and-katana/">excellent post</a> by Vittorio).</p>

<p>For some other scenarios in which your applications or services rely on JWTs for doing authentication/authorization, the Thinktecture Authorization Server represents a very nice alternative, which integrates really well with ADFS. The Authorization Server can act as a brige or broker between client apps that use OAuth 2.0 to get a JWT, and ADFS, which is used for authenticating the users.</p>

<p>The configuration of the Authorization Server is very simple. Once you get Authorization Server deployed in IIS, it uses Entity Framework code first to automatically generate the backend database for you on the first use. After that, you only need to change the configuration files to trust ADFS as it is shown bellow,</p>

<p>[Authorization Server Folder]\Configuration\identityModel.config</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;issuerNameRegistry</span> <span class="na">type=</span><span class="s">&quot;System.IdentityModel.Tokens.ValidatingIssuerNameRegistry, </span>
</span><span class='line'><span class="s">  System.IdentityModel.Tokens.ValidatingIssuerNameRegistry&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;authority</span> <span class="na">name=</span><span class="s">&quot;http://[your ADFS server]/adfs/services/trust&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;keys&gt;</span>
</span><span class='line'>          <span class="nt">&lt;add</span> <span class="na">thumbprint=</span><span class="s">&quot;[signing cert thumprint]&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/keys&gt;</span>
</span><span class='line'>        <span class="nt">&lt;validIssuers&gt;</span>
</span><span class='line'>          <span class="nt">&lt;add</span> <span class="na">name=</span><span class="s">&quot;http://[your ADFS server]/adfs/services/trust&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/validIssuers&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/authority&gt;</span>
</span><span class='line'><span class="nt">&lt;/issuerNameRegistry&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>[Authorization Server Folder]\Configuration\identityModel.services.config</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;system.identityModel.services&gt;</span>
</span><span class='line'>  <span class="nt">&lt;federationConfiguration&gt;</span>
</span><span class='line'>      <span class="nt">&lt;wsFederation</span> <span class="na">passiveRedirectEnabled=</span><span class="s">&quot;true&quot;</span>
</span><span class='line'> <span class="na">issuer=</span><span class="s">&quot;https://[your ADFS server]/adfs/ls/&quot;</span> <span class="na">realm=</span><span class="s">&quot;urn:authorizationserver&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/federationConfiguration&gt;</span>
</span><span class='line'><span class="nt">&lt;/system.identityModel.services&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>urn:authorizationserver is the Relying Party identifier I used for configuring Authorization Server in ADFS. In ADFS, you only to configure a new relying party with a WS-Federation endpoint, and set the URL of the Authorization Server. Make also sure the Relying Party identifier matches the one you configured in Authorization Server.</p>

<p>The following code shows how to get a JWT from Authorization Server using the Resource Owner Flow (The user is authenticated by Authorization Server in ADFS)</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">private</span> <span class="k">static</span> <span class="kt">string</span> <span class="nf">GetToken</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">ServicePointManager</span><span class="p">.</span><span class="n">ServerCertificateValidationCallback</span> <span class="p">=</span>
</span><span class='line'>      <span class="p">(</span><span class="n">o</span><span class="p">,</span> <span class="n">cert</span><span class="p">,</span> <span class="n">chain</span><span class="p">,</span> <span class="n">ssl</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="k">true</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">HttpClient</span> <span class="n">client</span> <span class="p">=</span> <span class="k">new</span> <span class="n">HttpClient</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">HttpRequestMessage</span> <span class="n">request</span> <span class="p">=</span> <span class="k">new</span> <span class="n">HttpRequestMessage</span><span class="p">(</span><span class="n">HttpMethod</span><span class="p">.</span><span class="n">Post</span><span class="p">,</span>
</span><span class='line'>      <span class="s">&quot;https://[your auth server]/[App namespace in Authorization Server]/oauth/token&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="n">request</span><span class="p">.</span><span class="n">Headers</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="s">&quot;Authorization&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s">&quot;Basic &quot;</span> <span class="p">+</span> <span class="n">Convert</span><span class="p">.</span><span class="n">ToBase64String</span><span class="p">(</span><span class="n">System</span><span class="p">.</span><span class="n">Text</span><span class="p">.</span><span class="n">ASCIIEncoding</span><span class="p">.</span><span class="n">ASCII</span><span class="p">.</span><span class="n">GetBytes</span><span class="p">(</span>
</span><span class='line'>          <span class="kt">string</span><span class="p">.</span><span class="n">Format</span><span class="p">(</span><span class="s">&quot;{0}:{1}&quot;</span><span class="p">,</span> <span class="s">&quot;[client id]&quot;</span><span class="p">,</span> <span class="s">&quot;[client secret]&quot;</span><span class="p">))));</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">request</span><span class="p">.</span><span class="n">Content</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FormUrlEncodedContent</span><span class="p">(</span><span class="k">new</span> <span class="n">Dictionary</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="kt">string</span><span class="p">&gt;</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>         <span class="p">{</span><span class="s">&quot;grant_type&quot;</span><span class="p">,</span> <span class="s">&quot;password&quot;</span><span class="p">},</span>
</span><span class='line'>         <span class="p">{</span><span class="s">&quot;username&quot;</span><span class="p">,</span> <span class="s">&quot;[account]&quot;</span><span class="p">},</span> <span class="c1">//Windows account name without domain</span>
</span><span class='line'>         <span class="p">{</span><span class="s">&quot;password&quot;</span><span class="p">,</span> <span class="s">&quot;[password]&quot;</span><span class="p">},</span>
</span><span class='line'>         <span class="p">{</span><span class="s">&quot;scope&quot;</span><span class="p">,</span> <span class="s">&quot;All&quot;</span><span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">HttpResponseMessage</span> <span class="n">response</span> <span class="p">=</span> <span class="n">client</span><span class="p">.</span><span class="n">SendAsync</span><span class="p">(</span><span class="n">request</span><span class="p">).</span><span class="n">Result</span><span class="p">;</span>
</span><span class='line'>    <span class="n">response</span><span class="p">.</span><span class="n">EnsureSuccessStatusCode</span><span class="p">();</span>
</span><span class='line'>    <span class="n">JObject</span> <span class="n">json</span> <span class="p">=</span> <span class="n">JObject</span><span class="p">.</span><span class="n">Parse</span><span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="n">Content</span><span class="p">.</span><span class="n">ReadAsStringAsync</span><span class="p">().</span><span class="n">Result</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">string</span> <span class="n">accessToken</span> <span class="p">=</span> <span class="n">json</span><span class="p">[</span><span class="s">&quot;access_token&quot;</span><span class="p">].</span><span class="n">ToString</span><span class="p">();</span>
</span><span class='line'>    <span class="kt">string</span> <span class="n">refreshToken</span> <span class="p">=</span> <span class="n">json</span><span class="p">[</span><span class="s">&quot;refresh_token&quot;</span><span class="p">].</span><span class="n">ToString</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="n">accessToken</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can find more details in the <a href="http://leastprivilege.com/2013/09/19/adding-oauth2-to-adfs-and-thus-bridging-the-gap-between-modern-applications-and-enterprise-back-ends">Dominick&rsquo;s blog</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Automatic Client Cert Detection in ADFS 2.0]]></title>
    <link href="http://cibrax.me/blog/2013/11/22/automatic-client-cert-detection-in-adfs-2-dot-0/"/>
    <updated>2013-11-22T12:29:00-03:00</updated>
    <id>http://cibrax.me/blog/2013/11/22/automatic-client-cert-detection-in-adfs-2-dot-0</id>
    <content type="html"><![CDATA[<p>ADFS 2.0 supports multiple authentication methods through authentication handlers that are mutually exclusive. If one of the handlers runs, the others don&rsquo;t. There is no way to implement a fallback logic if one the handlers fail to run or the user was not able to provide the expected credentials, so supporting dual authentication such as username/password and client certificates is sometimes problematic.  The following list shows the handlers included out of the box with ADFS 2.0,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;microsoft.identityServer.web&gt;</span>
</span><span class='line'>  <span class="nt">&lt;localAuthenticationTypes&gt;</span>
</span><span class='line'>      <span class="nt">&lt;add</span> <span class="na">name=</span><span class="s">&quot;Forms&quot;</span> <span class="na">page=</span><span class="s">&quot;FormsSignIn.aspx&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;add</span> <span class="na">name=</span><span class="s">&quot;Integrated&quot;</span> <span class="na">page=</span><span class="s">&quot;auth/integrated/&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;add</span> <span class="na">name=</span><span class="s">&quot;TlsClient&quot;</span> <span class="na">page=</span><span class="s">&quot;auth/sslclient/&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;add</span> <span class="na">name=</span><span class="s">&quot;Basic&quot;</span> <span class="na">page=</span><span class="s">&quot;auth/basic/&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/localAuthenticationTypes&gt;</span>
</span><span class='line'><span class="nt">&lt;microsoft.identityServer.web&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Those handlers are for Forms Authentication (Username/Password in an html form), Integrated Windows Authentication, Client Cert Authentication, and finally Http Basic Auth Authentication. The order in this list determines the priority by default unless the priority has been changed in the execution context. The order in the execution context can be changed in multiple ways. For example, when you are doing WS-Federation, the relying party can pass an additional &ldquo;WAuth&rdquo; query string parameter with the expected authentication type such as &ldquo;urn:oasis:names:tc:SAML:1.0:am:password&rdquo; for Forms Authentication or &ldquo;urn:ietf:rfc:2246&rdquo; for Client Cert authentication, which overrides the priority in the list set on the configuration. The same thing can be done for SAML 2.0 by changing the authentication context in the SAML Request message or changing the URL.</p>

<p>However, as I said before, in one of the handlers run, you will not have a chance to run any of the other handlers unless you implement some workaround. For example, you might want to add a checkbox in the html form for Forms authentication to allow the user to authenticate with a client certificate. When the checkbox is clicked, you do an http redirect to ADFS but changing the URL this time to use this new authentication method. If the RP is using WS-Federation, that means a new redirect that includes the WAuth query string variable with the value &ldquo;urn:ietf:rfc:2246&rdquo;, or a redirect to &ldquo;auth/sslclient/&rdquo; in the case of SAML 2.0.</p>

<p>If you want to avoid this manual step and detect the client certificate automatically, more work is involved, and it is what we are going to discuss next.</p>

<ol>
<li>Enable Forms Authentication as default in the configuration file. The &ldquo;Forms&rdquo; handler must be on top of the list.</li>
<li>Create a new virtual directory in the ADFS IIS, and configure that virtual directory to require HTTPS and Accept Client Certs.</li>
</ol>


<p><img src="http://cibrax.me/images/adfs_cert/iis.png" title="IIS Settings" alt="IIS Settings" /></p>

<ol>
<li>Configure an ASP.NET Generic handler in that virtual directory to check if the certificate is present or not</li>
</ol>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System.Web</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">CertificateHandler</span> <span class="p">:</span> <span class="n">IHttpHandler</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="k">void</span> <span class="nf">ProcessRequest</span><span class="p">(</span><span class="n">HttpContext</span> <span class="n">context</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">context</span><span class="p">.</span><span class="n">Response</span><span class="p">.</span><span class="n">ContentType</span> <span class="p">=</span> <span class="s">&quot;application/javascript&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">context</span><span class="p">.</span><span class="n">Request</span><span class="p">.</span><span class="n">ClientCertificate</span><span class="p">.</span><span class="n">IsPresent</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">context</span><span class="p">.</span><span class="n">Response</span><span class="p">.</span><span class="n">Write</span><span class="p">(</span><span class="s">&quot;if(typeof(certificateCallback) == &#39;function&#39;) </span>
</span><span class='line'>              <span class="p">{</span> <span class="p">(</span><span class="n">certificateCallback</span><span class="p">)</span> <span class="p">(</span><span class="k">true</span><span class="p">);</span> <span class="p">}</span><span class="s">&quot;);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="k">else</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">context</span><span class="p">.</span><span class="n">Response</span><span class="p">.</span><span class="n">Write</span><span class="p">(</span><span class="s">&quot;if(typeof(certificateCallback) == &#39;function&#39;) </span>
</span><span class='line'>              <span class="p">{</span> <span class="p">(</span><span class="n">certificateCallback</span><span class="p">)</span> <span class="p">(</span><span class="k">false</span><span class="p">);</span> <span class="p">}</span><span class="s">&quot;);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="kt">bool</span> <span class="n">IsReusable</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">get</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This code checks if the client certificate is present and invokes a javascript callback with &ldquo;true&rdquo; or &ldquo;false&rdquo; based on that condition. This code does not check the authenticity of the cert or anything else, and it is only for determining if the certificate is present. The rest of the validations will be done by ADFS.</p>

<ol>
<li>Configure this handler in the web.config of that virtual directory.</li>
</ol>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;system.webServer&gt;</span>
</span><span class='line'>  <span class="nt">&lt;handlers&gt;</span>
</span><span class='line'>    <span class="nt">&lt;add</span> <span class="na">name=</span><span class="s">&quot;certificate&quot;</span> <span class="na">type=</span><span class="s">&quot;CertificateHandler&quot;</span> <span class="na">path=</span><span class="s">&quot;Script&quot;</span> <span class="na">verb=</span><span class="s">&quot;GET&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/handlers&gt;</span>
</span><span class='line'><span class="nt">&lt;/system.webServer&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<ol>
<li>Include a CertCallBack.js javascript file into the ADFS folder with the code required for the callback,</li>
</ol>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nb">window</span><span class="p">.</span><span class="nx">certificateCallback</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">cert</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">url</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">cert</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">url</span> <span class="o">=</span> <span class="s2">&quot;auth/sslclient/&quot;</span> <span class="o">+</span> <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">search</span><span class="p">;</span>
</span><span class='line'>        <span class="nb">document</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">href</span> <span class="o">=</span> <span class="nx">url</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>This code is very simple. It simply does a redirect when the cert is present (the callback was called with a &ldquo;true&rdquo; value). The redirect in this sample is only valid for SAML 2.0</p>

<ol>
<li>Modify the FormsSign.aspx page to include the following code at the end of the Page_Load event,</li>
</ol>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="kt">string</span> <span class="n">script</span> <span class="p">=</span> <span class="n">System</span><span class="p">.</span><span class="n">IO</span><span class="p">.</span><span class="n">File</span><span class="p">.</span><span class="n">ReadAllText</span><span class="p">(</span><span class="n">Server</span><span class="p">.</span><span class="n">MapPath</span><span class="p">(</span><span class="s">&quot;CertCallBack.js&quot;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="k">this</span><span class="p">.</span><span class="n">Page</span><span class="p">.</span><span class="n">ClientScript</span><span class="p">.</span><span class="n">RegisterClientScriptBlock</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="n">GetType</span><span class="p">(),</span> <span class="s">&quot;callback&quot;</span><span class="p">,</span> <span class="n">script</span><span class="p">,</span> <span class="k">true</span><span class="p">);</span>
</span><span class='line'><span class="k">this</span><span class="p">.</span><span class="n">Page</span><span class="p">.</span><span class="n">ClientScript</span><span class="p">.</span><span class="n">RegisterClientScriptInclude</span><span class="p">(</span><span class="s">&quot;certauth&quot;</span><span class="p">,</span> <span class="s">&quot;/CertDetection/Script&quot;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>This code injects our CertCallBack.js script in the page and it also includes the script located in the virtual directory configured to accept client certs (/CertDetection/Script invokes the ASP.NET Handler basically)</p>

<p>That should be all. If the browser detects a client certificate when the script in the CertDetection virtual directory is resolved, the callback will be executed with a true value, making the form to do a redirect to authenticate the client with a Client Certificate instead. Otherwise, the client will see the Form to enter the username and password. We are adding a new virtual directory for not interferring with the existing authentication methods in the ADFS virtual directory.</p>

<p>The code for the handler and the javascript callback is included in the <a href="http://cibrax.me/external/adfs_cert/CertDetection.zip">attached zip file</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Injecting dynamic content in Windows Azure packages]]></title>
    <link href="http://cibrax.me/blog/2013/11/21/injecting-dynamic-content-in-windows-azure-package/"/>
    <updated>2013-11-21T10:52:00-03:00</updated>
    <id>http://cibrax.me/blog/2013/11/21/injecting-dynamic-content-in-windows-azure-package</id>
    <content type="html"><![CDATA[<p>The Windows Azure Tools 1.7 introduced a new feature for adding content to the Windows Azure projects called &ldquo;Role Content Folders&rdquo;. In some scenarios, you might want to add custom content such as static pages, documentation, configuration files or external binaries for example. This is useful for example if you want to deploy a solution not written in .NET such as java implementation, and you don&rsquo;t want to mix that with the .NET code in the Role project. The following image shows how the content folders are added in the Azure project.</p>

<p><img src="http://cibrax.me/images/azure_content/content_folders.png" title="Content Folders" alt="Content Folders" /></p>

<p>That content is included in the generated Azure package, and it is deployed in the AppRoot folder when the package is finally published in VM in the cloud.</p>

<p>One of the problem with this feature is that you might want to include content with an structure that changes often or content with thousands of folders/files, which requires some tedious manual work in Visual Studio to keep that content updated in the project.</p>

<p>Good news is that you can use a MSBuild task to inject that custom content automatically when the package is being generated. You have to include a custom Target &ldquo;BeforeRoleAddContent&rdquo; right after the declaration of the &ldquo;Microsoft.WindowsAzure.targets&rdquo; as it is shown bellow,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;Import</span> <span class="na">Project=</span><span class="s">&quot;$(CloudExtensionsDir)Microsoft.WindowsAzure.targets&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;Target</span> <span class="na">Name=</span><span class="s">&quot;BeforeAddRoleContent&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;ItemGroup&gt;</span>
</span><span class='line'>    <span class="nt">&lt;AzureRoleContent</span> <span class="na">Include=</span><span class="s">&quot;..\Solr\Solr&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;RoleName&gt;</span>SolrMasterHostWorkerRole<span class="nt">&lt;/RoleName&gt;</span>
</span><span class='line'>      <span class="nt">&lt;Destination&gt;</span>Solr<span class="nt">&lt;/Destination&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/AzureRoleContent&gt;</span>
</span><span class='line'>    <span class="nt">&lt;AzureRoleContent</span> <span class="na">Include=</span><span class="s">&quot;..\Solr\jre6&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;RoleName&gt;</span>SolrMasterHostWorkerRole<span class="nt">&lt;/RoleName&gt;</span>
</span><span class='line'>      <span class="nt">&lt;Destination&gt;</span>jre6<span class="nt">&lt;/Destination&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/AzureRoleContent&gt;</span>
</span><span class='line'>    <span class="nt">&lt;AzureRoleContent</span> <span class="na">Include=</span><span class="s">&quot;..\Solr\SolrFiles&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;RoleName&gt;</span>SolrMasterHostWorkerRole<span class="nt">&lt;/RoleName&gt;</span>
</span><span class='line'>      <span class="nt">&lt;Destination&gt;</span>SolrFiles<span class="nt">&lt;/Destination&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/AzureRoleContent&gt;</span>
</span><span class='line'>    <span class="nt">&lt;AzureRoleContent</span> <span class="na">Include=</span><span class="s">&quot;..\Solr\Solr&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;RoleName&gt;</span>SolrSlaveHostWorkerRole<span class="nt">&lt;/RoleName&gt;</span>
</span><span class='line'>      <span class="nt">&lt;Destination&gt;</span>Solr<span class="nt">&lt;/Destination&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/AzureRoleContent&gt;</span>
</span><span class='line'>    <span class="nt">&lt;AzureRoleContent</span> <span class="na">Include=</span><span class="s">&quot;..\Solr\jre6&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;RoleName&gt;</span>SolrSlaveHostWorkerRole<span class="nt">&lt;/RoleName&gt;</span>
</span><span class='line'>      <span class="nt">&lt;Destination&gt;</span>jre6<span class="nt">&lt;/Destination&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/AzureRoleContent&gt;</span>
</span><span class='line'>    <span class="nt">&lt;AzureRoleContent</span> <span class="na">Include=</span><span class="s">&quot;..\Solr\SolrFiles&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;RoleName&gt;</span>SolrSlaveHostWorkerRole<span class="nt">&lt;/RoleName&gt;</span>
</span><span class='line'>      <span class="nt">&lt;Destination&gt;</span>SolrFiles<span class="nt">&lt;/Destination&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/AzureRoleContent&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/ItemGroup&gt;</span>
</span><span class='line'><span class="nt">&lt;/Target&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The example above injects several content folders in two different roles, &ldquo;SolrMasterHostWorkerRole&rdquo; and &ldquo;SolrSlaveHostWorkerRole&rdquo;. The &ldquo;Include&rdquo; attribute specifies the source folder, and the Destination folder within the AppRoot is specified in the Destination element.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Full-Text Searches in SQL Azure with Solr]]></title>
    <link href="http://cibrax.me/blog/2013/11/01/full-text-searches-in-sql-azure-with-solr/"/>
    <updated>2013-11-01T15:41:00-03:00</updated>
    <id>http://cibrax.me/blog/2013/11/01/full-text-searches-in-sql-azure-with-solr</id>
    <content type="html"><![CDATA[<p>Solr is a robust search platform created by the open source community on top of Apache Lucene. It&rsquo;s completelly written in java, and uses the Lucene java implementation at is core for full-text indexing and search. In addition, it exposes an http web interface for doing the full text searches and perform management tasks.
On other hand, we have SQL Azure, which currently does not support full text searches, so these two services complement very well each other.</p>

<p>As Solr is mainly a java implementation, you only have a few alternatives to run in on Windows Azure. You can deploy it as a worker role together with the java runtime machine, or you can deploy it in a VM. As any solution in the cloud, the state persisted in the worker role or VM goes away when the VMs are replaced or they go down. As Solr persists the indexes in disk, you need to make sure it is stored in a permament storage like Azure Drive or the storage service. If you decide to use a worker role, this requires some additional work to make Solr to store the indexes in Azure drive for example, which is a VHD stored in the storage service that can be mounted by the VM as a local disk. Good news is that MS Open Tech has already done this for us. They have a created a template that deployes Solr with a fail-over configuration(master-slave) in two worker roles, one role for the master node, and another role for the slave node. The slave node replicates from the master node, so in case you lost one of them, you still have the other node available. . In addition, it configures a web role with an MVC application that acts as a admin dashboard for doing basic management stuff. This solution is hosted in Github as part of this project <a href="https://github.com/MSOpenTech/Windows-Azure-Solr">Windows-Azure-Solr</a>. The Github site also provides instructions to get the solution deployed in Windows Azure.</p>

<p>The template that you download from GitHub imports data into Solr by crawling some URLs. That&rsquo;s part of the data-config.xml file that you can find in the configuration folder of the master and slave nodes (SolrMasterWorkerRole\SolrFiles\data-config.xml and SolrSlaveWorkerRole\SolrFiles\data-config.xml). Solr supports the idea of data importers, which can be used to import data from different sources such as existing web sites, files in disk or even a database.</p>

<p>In this case, we will modify that data-config.xml file to use a data importer that pulls data from an existing SQL Azure instance. The following example shows how this data importer configuration looks like,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;dataConfig&gt;</span>
</span><span class='line'>  <span class="nt">&lt;dataSource</span> <span class="na">type=</span><span class="s">&quot;JdbcDataSource&quot;</span> <span class="na">name=</span><span class="s">&quot;ds1&quot;</span>
</span><span class='line'>    <span class="na">driver=</span><span class="s">&quot;com.microsoft.sqlserver.jdbc.SQLServerDriver&quot;</span>
</span><span class='line'>    <span class="na">url=</span><span class="s">&quot;jdbc:sqlserver://[your server];database=[your database];user=[your user];password=[your user];encrypt=true;hostNameInCertificate=*.database.windows.net;loginTimeout=30;&quot;</span>
</span><span class='line'>    <span class="na">readOnly=</span><span class="s">&quot;true&quot;</span>
</span><span class='line'>  <span class="nt">/&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;document</span> <span class="na">name=</span><span class="s">&quot;articles&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;entity</span> <span class="na">name=</span><span class="s">&quot;article&quot;</span> <span class="na">dataSource=</span><span class="s">&quot;ds1&quot;</span> <span class="na">pk=</span><span class="s">&quot;id&quot;</span>
</span><span class='line'>  <span class="na">query =</span> <span class="s">&quot;SELECT id, title, description, tags, author, lastupdated from Articles&quot;</span>
</span><span class='line'>  <span class="na">deltaQuery=</span><span class="s">&quot;select id FROM Articles WHERE LastUpdated &amp;gt; &#39;${dataimporter.last_index_time}&#39;&quot;</span>
</span><span class='line'>  <span class="na">deltaImportQuery=</span><span class="s">&quot;SELECT id, title, description, tags, author, lastupdated from Articles where id = &#39;${dataimporter.delta.id}&#39;&quot;</span>
</span><span class='line'>      <span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;field</span> <span class="na">column=</span><span class="s">&quot;id&quot;</span> <span class="na">name=</span><span class="s">&quot;id&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;field</span> <span class="na">column=</span><span class="s">&quot;title&quot;</span> <span class="na">name=</span><span class="s">&quot;title&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;field</span> <span class="na">column=</span><span class="s">&quot;description&quot;</span> <span class="na">name=</span><span class="s">&quot;description&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;field</span> <span class="na">column=</span><span class="s">&quot;tags&quot;</span> <span class="na">name=</span><span class="s">&quot;tags&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;field</span> <span class="na">column=</span><span class="s">&quot;author&quot;</span> <span class="na">name=</span><span class="s">&quot;author&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;field</span> <span class="na">column=</span><span class="s">&quot;lastupdated&quot;</span> <span class="na">name=</span><span class="s">&quot;lastupdated&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/entity&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/document&gt;</span>
</span><span class='line'><span class="nt">&lt;/dataConfig&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>First of all, we have defined a dataSource element that points to our SQL Azure instance. This is a Jdbc data source that uses the SQL Server driver and sets the connection string in the url attribute.
Secondly, we have defined a document, which specifies one or more entities that are mapped from the SQL Azure database with a select statement. The fields section maps the different fields in the document to the fields returned by the select statements. This document is what Solr stores in the index using Lucene. As you can see, three queries have been defined. The first one with the &ldquo;query&rdquo; attribute is used by the data importer when a full import of the complete database is done into Solr. The other two queries are used for supporting a delta or partial import scenario. These two are optional and useful only in scenarios where you have frecuent updates and a lot of data to import, which will make the full import considerably slow.</p>

<p>Since this data importer uses the SQL Server driver for the Jdbc data source, you will have to download that package from the Microsoft website and copying it in the folder where Solr looks for the external libraries (SolrMasterWorkerRole\Solr\dist and SolrSlaveWorkerRole\Solr\dist).</p>

<p>We have defined so far the mapping of a document against one or more tables in the database, but Solr still requires the definition of those fields, which are part of the schema. The schema definition can be found in the schema.xml file (SolrMasterWorkerRole\SolrFiles\v44\schema.xml and SolrSlaveWorkerRole\SolrFiles\v44\schema.xml). The following example shows how the schema is modified to include the fields used by the data importer.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;field</span> <span class="na">name=</span><span class="s">&quot;id&quot;</span> <span class="na">type=</span><span class="s">&quot;string&quot;</span> <span class="na">indexed=</span><span class="s">&quot;true&quot;</span> <span class="na">stored=</span><span class="s">&quot;true&quot;</span> <span class="na">required=</span><span class="s">&quot;true&quot;</span> <span class="na">multiValued=</span><span class="s">&quot;false&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;field</span> <span class="na">name=</span><span class="s">&quot;title&quot;</span> <span class="na">type=</span><span class="s">&quot;string&quot;</span> <span class="na">indexed=</span><span class="s">&quot;true&quot;</span> <span class="na">stored=</span><span class="s">&quot;true&quot;</span> <span class="na">required=</span><span class="s">&quot;true&quot;</span> <span class="na">multiValued=</span><span class="s">&quot;false&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;field</span> <span class="na">name=</span><span class="s">&quot;description&quot;</span> <span class="na">type=</span><span class="s">&quot;string&quot;</span> <span class="na">indexed=</span><span class="s">&quot;true&quot;</span> <span class="na">stored=</span><span class="s">&quot;true&quot;</span> <span class="na">required=</span><span class="s">&quot;true&quot;</span> <span class="na">multiValued=</span><span class="s">&quot;false&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;field</span> <span class="na">name=</span><span class="s">&quot;tags&quot;</span> <span class="na">type=</span><span class="s">&quot;string&quot;</span> <span class="na">indexed=</span><span class="s">&quot;true&quot;</span> <span class="na">stored=</span><span class="s">&quot;true&quot;</span> <span class="na">required=</span><span class="s">&quot;true&quot;</span> <span class="na">multiValued=</span><span class="s">&quot;false&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;field</span> <span class="na">name=</span><span class="s">&quot;author&quot;</span> <span class="na">type=</span><span class="s">&quot;string&quot;</span> <span class="na">indexed=</span><span class="s">&quot;true&quot;</span> <span class="na">stored=</span><span class="s">&quot;true&quot;</span> <span class="na">required=</span><span class="s">&quot;true&quot;</span> <span class="na">multiValued=</span><span class="s">&quot;false&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;field</span> <span class="na">name=</span><span class="s">&quot;lastupdated&quot;</span> <span class="na">type=</span><span class="s">&quot;date&quot;</span> <span class="na">indexed=</span><span class="s">&quot;true&quot;</span> <span class="na">stored=</span><span class="s">&quot;true&quot;</span> <span class="na">required=</span><span class="s">&quot;true&quot;</span> <span class="na">multiValued=</span><span class="s">&quot;false&quot;</span> <span class="nt">/&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is enough to get Solr configured to pull data from SQL Azure, so we are in conditions to deploy Solr into an Windows Azure subscription also using the tool provided by MS Open Tech. If you have installed all the pre-requisites and followed the instructions in the wiki page of the Github website, the following command should be enough to perform that deployment.</p>

<p>Inst4WA.exe -XmlConfigPath &ldquo;SolrInstWR_V4.4.xml&rdquo; -subscription &ldquo;[subscription name]&rdquo; -location &ldquo;[location]&rdquo; -DomainName &ldquo;[cloud service name]&rdquo;</p>

<p>If you are lucky enough to get the command to work in the first instance, it will open a new browser instance when the deployment is complete, and it will also redirect you to the MVC dashboard running in the web role.</p>

<p>You are in conditions now to execute a few commands to import the data into Solr. You will see the location and port where the Solr master and slave nodes are running as part of the home page in the dashboard. For doing a full import into the master role, you have to copy that location and port, and append &ldquo;/dataimport?command=full-import&rdquo;. For example, &ldquo;<a href="http://mysamplesolr.cloudapp.net:21000/solr/dataimport?command=full-import">http://mysamplesolr.cloudapp.net:21000/solr/dataimport?command=full-import</a>&rdquo;. That will start a full import that runs asynchronously, so you can use this other command to check the status of the import &ldquo;/dataimport?command=status&rdquo;. For doing a partial import, you only change the command to this one &ldquo;/dataimport?command=delta-import&rdquo;. Once the import is complete, you can do a search to verify that everything looks ok. That can be done with the following command &ldquo;/select?q=[query]&rdquo;. For example, &ldquo;<a href="http://mysamplesolr.cloudapp.net:21000/solr/select?q=azure">http://mysamplesolr.cloudapp.net:21000/solr/select?q=azure</a>&rdquo;</p>

<p>So you have Solr indexing all your data now, but what happens with the security ?. This thing is open to the world. Anyone can do anything with your Solr instances as everything is public. There are some ways to secure Solr pages by changing some settings in the web server, which is Jetty by default. However, the Solr documentation recommends to put Solr behind a reverse proxy that filters the requests. There are several reverse proxy implementations for Solr in Github, but I will use a different approach for Windows Azure here. Given that the MS Open Tech template includes a web role for the MVC dashboard, and two worker roles for running the Solr master and slave instances, we can make the Solr instances available in internal endpoints only and use the MVC application as a facade or reverse proxy to forward all the requests to these instances. The only public and visible face will be the MVC application in the web role. All the requests for Solr must go through this MVC application first, which can filter any request that looks malicious or any request that can damage the existing indexes. A simple way to do this is to allow only get operations and filter the rest. This is the approach I&rsquo;ve been taken and implemented as part of a fork created from the MS OpenTech project in Github. This fork is available <a href="https://github.com/pcibraro/Windows-Azure-Solr">here</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Unit Testing Improvements in ASP.NET Web API]]></title>
    <link href="http://cibrax.me/blog/2013/09/27/unit-testing-improvements-in-asp-dot-net-web-api/"/>
    <updated>2013-09-27T12:46:00-03:00</updated>
    <id>http://cibrax.me/blog/2013/09/27/unit-testing-improvements-in-asp-dot-net-web-api</id>
    <content type="html"><![CDATA[<p>A time ago I discussed some serious issues in ASP.NET Web API for testing controllers that were using the Request or UrlHelper instances because those required a valid HttpConfiguration instance. You could initialize the HttpConfiguration instace, but that required a lot of work and some ugly code as part of your tests.</p>

<p>The following method in a controller works to describe the problem,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="n">HttpResponseMessage</span> <span class="nf">Post</span><span class="p">(</span><span class="n">User</span> <span class="n">model</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">var</span> <span class="n">response</span> <span class="p">=</span> <span class="n">Request</span><span class="p">.</span><span class="n">CreateResponse</span><span class="p">(</span><span class="n">HttpStatusCode</span><span class="p">.</span><span class="n">Created</span><span class="p">,</span> <span class="n">user</span><span class="p">);</span>
</span><span class='line'>  <span class="kt">var</span> <span class="n">link</span> <span class="p">=</span> <span class="n">Url</span><span class="p">.</span><span class="n">Link</span><span class="p">(</span><span class="s">&quot;DefaultApi&quot;</span><span class="p">,</span> <span class="k">new</span> <span class="p">{</span> <span class="n">id</span> <span class="p">=</span> <span class="n">id</span><span class="p">,</span> <span class="n">controller</span> <span class="p">=</span> <span class="s">&quot;Users&quot;</span> <span class="p">});</span>
</span><span class='line'>  <span class="n">response</span><span class="p">.</span><span class="n">Headers</span><span class="p">.</span><span class="n">Location</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Uri</span><span class="p">(</span><span class="n">link</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">response</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The Request propery is being used to generate a content negotiated response, and the Url property to infer the new location for the resource. If you use ASP.NET Web API as it is today, you will have to write a lot of custom code to initialize the configuration instance as it is shown below.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="kt">var</span> <span class="n">controller</span> <span class="p">=</span> <span class="k">new</span> <span class="n">UserController</span><span class="p">();</span>
</span><span class='line'><span class="n">controller</span><span class="p">.</span><span class="n">Configuration</span> <span class="p">=</span> <span class="k">new</span> <span class="n">HttpConfiguration</span><span class="p">();</span>
</span><span class='line'><span class="kt">var</span> <span class="n">route</span> <span class="p">=</span> <span class="n">controller</span><span class="p">.</span><span class="n">Configuration</span><span class="p">.</span><span class="n">Routes</span><span class="p">.</span><span class="n">MapHttpRoute</span><span class="p">(</span>
</span><span class='line'>         <span class="n">name</span><span class="p">:</span> <span class="s">&quot;DefaultApi&quot;</span><span class="p">,</span>
</span><span class='line'>         <span class="n">routeTemplate</span><span class="p">:</span> <span class="s">&quot;api/{controller}/{id}&quot;</span><span class="p">,</span>
</span><span class='line'>         <span class="n">defaults</span><span class="p">:</span> <span class="k">new</span> <span class="p">{</span> <span class="n">id</span> <span class="p">=</span> <span class="n">RouteParameter</span><span class="p">.</span><span class="n">Optional</span> <span class="p">}</span>
</span><span class='line'><span class="p">);</span>
</span><span class='line'><span class="kt">var</span> <span class="n">routeData</span> <span class="p">=</span> <span class="k">new</span> <span class="n">HttpRouteData</span><span class="p">(</span><span class="n">route</span><span class="p">,</span>
</span><span class='line'>       <span class="k">new</span> <span class="n">HttpRouteValueDictionary</span>
</span><span class='line'>       <span class="p">{</span>
</span><span class='line'>          <span class="p">{</span> <span class="s">&quot;id&quot;</span><span class="p">,</span> <span class="s">&quot;1&quot;</span> <span class="p">},</span>
</span><span class='line'>          <span class="p">{</span> <span class="s">&quot;controller&quot;</span><span class="p">,</span> <span class="s">&quot;Users&quot;</span> <span class="p">}</span>
</span><span class='line'>       <span class="p">}</span>
</span><span class='line'><span class="p">);</span>
</span><span class='line'><span class="n">controller</span><span class="p">.</span><span class="n">Request</span> <span class="p">=</span> <span class="k">new</span> <span class="n">HttpRequestMessage</span><span class="p">(</span><span class="n">HttpMethod</span><span class="p">.</span><span class="n">Post</span><span class="p">,</span>
</span><span class='line'>  <span class="s">&quot;http://localhost:9091/&quot;</span><span class="p">);</span>
</span><span class='line'><span class="n">controller</span><span class="p">.</span><span class="n">Request</span><span class="p">.</span><span class="n">Properties</span>
</span><span class='line'>  <span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">HttpPropertyKeys</span><span class="p">.</span><span class="n">HttpConfigurationKey</span><span class="p">,</span> <span class="n">controller</span><span class="p">.</span><span class="n">Configuration</span><span class="p">);</span>
</span><span class='line'><span class="n">controller</span><span class="p">.</span><span class="n">Request</span><span class="p">.</span><span class="n">Properties</span>
</span><span class='line'>  <span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">HttpPropertyKeys</span><span class="p">.</span><span class="n">HttpRouteDataKey</span><span class="p">,</span> <span class="n">routeData</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Glenn Block wrote a very nice extension as part of the Web API Contrib project for making this configuration much more simpler. This extension is available here, <a href="https://github.com/WebApiContrib/WebAPIContrib/blob/master/src/WebApiContrib.Testing/ApiControllerExtensions.cs.">https://github.com/WebApiContrib/WebAPIContrib/blob/master/src/WebApiContrib.Testing/ApiControllerExtensions.cs.</a></p>

<p>However, we can left all this in the past with the new ASP.NET Web API vNext release. The introduction of the IHttpActionResult interface (Equivalent to ActionResult in ASP.NET MVC) has simplified a lot the unit testing story for controllers. A controller method can return now an implementation of IHttpActionResult, which internally uses the Request or the UrlHelper for link generation, so the unit test only cares about the returned IHttpActionResult instance.</p>

<p>The following code shows the same controller method using an instance of IHttpActionResult.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="n">CreatedAtRouteNegotiatedContentResult</span><span class="p">&lt;</span><span class="n">UserModel</span><span class="p">&gt;</span> <span class="n">Post</span><span class="p">(</span><span class="n">UserModel</span> <span class="n">user</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">user</span><span class="p">.</span><span class="n">Id</span> <span class="p">=</span> <span class="m">1</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kt">var</span> <span class="n">result</span> <span class="p">=</span> <span class="k">new</span> <span class="n">CreatedAtRouteNegotiatedContentResult</span><span class="p">&lt;</span><span class="n">UserModel</span><span class="p">&gt;(</span>
</span><span class='line'>    <span class="s">&quot;DefaultApi&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="k">new</span> <span class="n">Dictionary</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="kt">object</span><span class="p">&gt;</span> <span class="p">{</span> <span class="p">{</span> <span class="s">&quot;id&quot;</span><span class="p">,</span> <span class="n">user</span><span class="p">.</span><span class="n">Id</span> <span class="p">}</span> <span class="p">},</span>
</span><span class='line'>      <span class="n">user</span><span class="p">,</span>
</span><span class='line'>      <span class="k">this</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>CreatedAtRouteNegotiatedContentResult is an implementation also included in the framework for handling this scenario. A new resource is created and the location is set in the response message.</p>

<p>The code for the unit test is much simpler too.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="na">[TestMethod]</span>
</span><span class='line'><span class="k">public</span> <span class="k">void</span> <span class="nf">ShouldCreateUser</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">controller</span> <span class="p">=</span> <span class="k">new</span> <span class="n">UserController</span><span class="p">();</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">result</span> <span class="p">=</span> <span class="n">controller</span><span class="p">.</span><span class="n">Post</span><span class="p">(</span><span class="k">new</span> <span class="n">UserModel</span> <span class="p">{</span> <span class="n">Name</span> <span class="p">=</span> <span class="s">&quot;foo&quot;</span> <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">Assert</span><span class="p">.</span><span class="n">IsInstanceOfType</span><span class="p">(</span><span class="n">result</span><span class="p">.</span><span class="n">Content</span><span class="p">,</span> <span class="k">typeof</span><span class="p">(</span><span class="n">UserModel</span><span class="p">));</span>
</span><span class='line'>    <span class="n">Assert</span><span class="p">.</span><span class="n">IsNotNull</span><span class="p">(</span><span class="n">result</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The UrlHelper class has also been modified to make most of its methods virtual, so they can be mocked or overriden as part of an unit test. You can use this in case you still need to rely on the Url instance in the controller. For example, if you have a controller method like this one.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="n">HttpResponseMessage</span> <span class="nf">Post</span><span class="p">(</span><span class="n">UserModel</span> <span class="n">user</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">user</span><span class="p">.</span><span class="n">Id</span> <span class="p">=</span> <span class="m">1</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kt">var</span> <span class="n">response</span> <span class="p">=</span> <span class="k">new</span> <span class="n">HttpResponseMessage</span><span class="p">(</span><span class="n">HttpStatusCode</span><span class="p">.</span><span class="n">Created</span><span class="p">);</span>
</span><span class='line'>  <span class="kt">var</span> <span class="n">link</span> <span class="p">=</span> <span class="n">Url</span><span class="p">.</span><span class="n">Link</span><span class="p">(</span><span class="s">&quot;DefaultApi&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="k">new</span> <span class="p">{</span> <span class="n">id</span> <span class="p">=</span> <span class="n">user</span><span class="p">.</span><span class="n">Id</span><span class="p">,</span> <span class="n">controller</span> <span class="p">=</span> <span class="s">&quot;User&quot;</span> <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">response</span><span class="p">.</span><span class="n">Headers</span><span class="p">.</span><span class="n">Location</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Uri</span><span class="p">(</span><span class="n">link</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="n">response</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can create a custom class that derives from UrlHelper and overrides the Link method.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="na">[TestMethod]</span>
</span><span class='line'><span class="k">public</span> <span class="k">void</span> <span class="nf">ShouldCreateUser</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">var</span> <span class="n">controller</span> <span class="p">=</span> <span class="k">new</span> <span class="n">UserController</span><span class="p">();</span>
</span><span class='line'>  <span class="n">controller</span><span class="p">.</span><span class="n">Url</span> <span class="p">=</span> <span class="k">new</span> <span class="n">MyUrlHelper</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="kt">var</span> <span class="n">result</span> <span class="p">=</span> <span class="n">controller</span><span class="p">.</span><span class="n">Post</span><span class="p">(</span>
</span><span class='line'>    <span class="k">new</span> <span class="n">UserModel</span> <span class="p">{</span> <span class="n">Name</span> <span class="p">=</span> <span class="s">&quot;foo&quot;</span> <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">Assert</span><span class="p">.</span><span class="n">IsNotNull</span><span class="p">(</span><span class="n">result</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">MyUrlHelper</span> <span class="p">:</span> <span class="n">UrlHelper</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">public</span> <span class="k">override</span> <span class="kt">string</span> <span class="nf">Link</span><span class="p">(</span><span class="kt">string</span> <span class="n">routeName</span><span class="p">,</span> <span class="kt">object</span> <span class="n">routeValues</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="s">&quot;http://example.com/user/1&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using the Katana Authentication handlers with NancyFx]]></title>
    <link href="http://cibrax.me/blog/2013/07/29/using-the-katana-authentication-handlers-with-nancyfx/"/>
    <updated>2013-07-29T00:00:00-03:00</updated>
    <id>http://cibrax.me/blog/2013/07/29/using-the-katana-authentication-handlers-with-nancyfx</id>
    <content type="html"><![CDATA[<p>Once you write an OWIN Middleware service, it can be reused everywhere
as long as OWIN is supported. In my <a href="http://weblogs.asp.net/cibrax/archive/2013/07/26/writing-an-authenticationhandler-for-katana.aspx">last
post</a>,
I discussed how you could write an Authentication Handler in Katana for
Hawk (HMAC Authentication). Good news is NancyFx can be run as an OWIN
handler, so you can use many of existing middleware services, including
the ones that are ship with Katana.</p>

<p>Running NancyFx as a OWIN handler is pretty straightforward, and
discussed in detail as part of the NancyFx documentation
<a href="https://github.com/NancyFx/Nancy/wiki/Hosting-nancy-with-owin">here</a>.
After run the steps described there and you have the application
working, only a few more steps are required to register the additional
middleware services.</p>

<p>The example bellow shows how the Startup class is modified to include
Hawk authentication.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">Startup</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">void</span> <span class="nf">Configuration</span><span class="p">(</span><span class="n">IAppBuilder</span> <span class="n">app</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">app</span><span class="p">.</span><span class="n">UseHawkAuthentication</span><span class="p">(</span><span class="k">new</span> <span class="n">HawkAuthenticationOptions</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">Credentials</span> <span class="p">=</span> <span class="p">(</span><span class="n">id</span><span class="p">)</span> <span class="p">=&gt;</span>
</span><span class='line'>            <span class="p">{</span>
</span><span class='line'>                <span class="k">return</span> <span class="k">new</span> <span class="n">HawkCredential</span>
</span><span class='line'>                <span class="p">{</span>
</span><span class='line'>                    <span class="n">Id</span> <span class="p">=</span> <span class="s">&quot;dh37fgj492je&quot;</span><span class="p">,</span>
</span><span class='line'>                    <span class="n">Key</span> <span class="p">=</span> <span class="s">&quot;werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn&quot;</span><span class="p">,</span>
</span><span class='line'>                    <span class="n">Algorithm</span> <span class="p">=</span> <span class="s">&quot;hmacsha256&quot;</span><span class="p">,</span>
</span><span class='line'>                    <span class="n">User</span> <span class="p">=</span> <span class="s">&quot;steve&quot;</span>
</span><span class='line'>                <span class="p">};</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">app</span><span class="p">.</span><span class="n">UseNancy</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This code registers the Hawk Authentication Handler on top of the OWIN
pipeline, so it will try to authenticate the calls before the request
messages are passed over to NancyFx.</p>

<p>The authentication handlers in Katana set the user principal in the OWIN
environment using the key “server.User”. The following code shows how
you can get that principal in a NancyFx module,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">HomeModule</span> <span class="p">:</span> <span class="n">NancyModule</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">public</span> <span class="nf">HomeModule</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">Get</span><span class="p">[</span><span class="s">&quot;/&quot;</span><span class="p">]</span> <span class="p">=</span> <span class="n">x</span> <span class="p">=&gt;</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="kt">var</span> <span class="n">env</span> <span class="p">=</span> <span class="p">(</span><span class="n">IDictionary</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="kt">object</span><span class="p">&gt;)</span><span class="n">Context</span><span class="p">.</span><span class="n">Items</span><span class="p">[</span><span class="n">NancyOwinHost</span><span class="p">.</span><span class="n">RequestEnvironmentKey</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(!</span><span class="n">env</span><span class="p">.</span><span class="n">ContainsKey</span><span class="p">(</span><span class="s">&quot;server.User&quot;</span><span class="p">)</span> <span class="p">||</span> <span class="n">env</span><span class="p">[</span><span class="s">&quot;server.User&quot;</span><span class="p">]</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>          <span class="k">return</span> <span class="n">HttpStatusCode</span><span class="p">.</span><span class="n">Unauthorized</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="kt">var</span> <span class="n">identity</span> <span class="p">=</span> <span class="p">(</span><span class="n">ClaimsPrincipal</span><span class="p">)</span><span class="n">env</span><span class="p">[</span><span class="s">&quot;server.User&quot;</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">return</span> <span class="s">&quot;Hello &quot;</span> <span class="p">+</span> <span class="n">identity</span><span class="p">.</span><span class="n">Identity</span><span class="p">.</span><span class="n">Name</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Thanks to OWIN, you don’t know any details of how these cross cutting
concerns can be implemented in every possible web application framework.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Writing an AuthenticationHandler for Katana]]></title>
    <link href="http://cibrax.me/blog/2013/07/26/writing-an-authenticationhandler-for-katana/"/>
    <updated>2013-07-26T00:00:00-03:00</updated>
    <id>http://cibrax.me/blog/2013/07/26/writing-an-authenticationhandler-for-katana</id>
    <content type="html"><![CDATA[<p>As I discussed in my previous
<a href="http://weblogs.asp.net/cibrax/archive/2013/07/22/getting-started-with-owin-and-katana.aspx">post</a>,
Katana is pretty much organized in middleware services.  One of those
middleware services is authentication, which provides some built-in
implementations for existing OAuth providers such as Facebook, Twitter,
Google or Microsoft, and also an implementation for Forms authentication
with cookies.  All those implementations are currently distributed as
Nuget packages under the name of Microsoft.Owin.Security.*, where the
last part identifies the name of the implementation (e.g.
Microsoft.Owin.Security.Twitter).</p>

<p>Microsoft.Owin.Security is also the core project where you can find the
base classes for writing a new authentication handler, and the ones that
all the these implementations use.</p>

<p>At first glance, the core class that you will use to create a new
authentication handler is
Microsoft.Owin.Security.Infrastructure.AuthenticationHandler&lt;T>, where
T is class that derives from AuthenticationOptions and contains all the
properties for initializing the handler.</p>

<p>AuthenticationHandler&lt;T> derives from
Microsoft.Owin.Security.Infrastructure.AuthenticationHandler, which
provides the following definition.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">abstract</span> <span class="k">class</span> <span class="nc">AuthenticationHandler</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>   <span class="k">protected</span> <span class="n">OwinRequest</span> <span class="n">Request</span><span class="p">;</span>
</span><span class='line'>   <span class="k">protected</span> <span class="n">OwinResponse</span> <span class="n">Response</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>   <span class="k">protected</span> <span class="nf">AuthenticationHandler</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>   <span class="k">protected</span> <span class="k">virtual</span> <span class="n">Task</span> <span class="nf">ApplyResponseChallenge</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>   <span class="k">protected</span> <span class="k">virtual</span> <span class="n">Task</span> <span class="nf">ApplyResponseCore</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>   <span class="k">protected</span> <span class="k">virtual</span> <span class="n">Task</span> <span class="nf">ApplyResponseGrant</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>   <span class="k">protected</span> <span class="k">abstract</span> <span class="n">Task</span><span class="p">&lt;</span><span class="n">AuthenticationTicket</span><span class="p">&gt;</span> <span class="n">AuthenticateCore</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This class basically provides access to the current request/response
OWIN messages, and also a few methods that can be overridden as part of
the implementation.</p>

<ul>
<li>ApplyResponseChallenge: This method can be overridden to send a
authentication challenge when a middleware service in the upper
layer denies the execution (e.g 401 status code). For example, this
can be useful for basic authentication.</li>
<li>ApplyResponseCore: This method by default calls
ApplyResponseChallenge and ApplyResponseGrant. It can be changed to
make some additional processing of the Response message.</li>
<li>ApplyResponseGrant: This method is only useful for authentication
methods that needs to implement sign-in/sign-out concerns such as
OAuth or Forms authentication. You won’t be using this for some
authentication options such as basic or hmac authentication.</li>
<li>AuthenticateCore: This is the more important method, and the one
where all the main implementation of the authentication handler
lives. The AuthenticationTicket will contain the identity of the
authenticated user or null if the user couldn’t be authenticated.</li>
</ul>


<p>The AuthenticationOptions base class only contains the following
structure,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">abstract</span> <span class="k">class</span> <span class="nc">AuthenticationOptions</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">protected</span> <span class="nf">AuthenticationOptions</span><span class="p">(</span><span class="kt">string</span> <span class="n">authenticationType</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="n">AuthenticationMode</span> <span class="n">AuthenticationMode</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="kt">string</span> <span class="n">AuthenticationType</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="n">AuthenticationDescription</span> <span class="n">Description</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li>AuthenticationMode. It’s an enumeration with two possible values
Active/Passive. It basically identifies the http flow for the
authentication implementation. Some authentication methods like
Basic or HMac are Active, so it can be used directly against the
current request without requiring additional http redirections. Some
other methods like OAuth or Forms are not, so those have to
identified as Passive. This setting will affect the authentication
middleware behaves, so you have to set the correct value for it.</li>
<li>AuthenticatinType. It represents the authentication scheme. For
example, Basic.</li>
<li>AuthenticationDescription. It can be used to provide more
information about the authentication method.</li>
</ul>


<p>Only these two classes are used so far to create a new authentication
handler. However, you will also need a another class that acts as a
factory, and it is used to inject the handler into the OWIN pipeline.
That class is
Microsoft.Owin.Security.Infrastructure.AuthenticationMiddleware.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">abstract</span> <span class="k">class</span> <span class="nc">AuthenticationMiddleware</span><span class="p">&lt;</span><span class="n">TOptions</span><span class="p">&gt;</span> <span class="p">:</span> <span class="n">OwinMiddleware</span> <span class="k">where</span> <span class="n">TOptions</span> <span class="p">:</span> <span class="n">Microsoft</span><span class="p">.</span><span class="n">Owin</span><span class="p">.</span><span class="n">Security</span><span class="p">.</span><span class="n">AuthenticationOptions</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">public</span> <span class="nf">AuthenticationMiddleware</span><span class="p">(</span><span class="n">OwinMiddleware</span> <span class="n">next</span><span class="p">,</span> <span class="n">TOptions</span> <span class="n">options</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="n">TOptions</span> <span class="n">Options</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">protected</span> <span class="k">abstract</span> <span class="n">AuthenticationHandler</span><span class="p">&lt;</span><span class="n">TOptions</span><span class="p">&gt;</span> <span class="n">CreateHandler</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This class basically receives the Options that must be passed to the
AuthenticationHandler, and also contains a method CreateHandler where
the handler is actually created.</p>

<p>I will use the rest of this post to describe the implementation of a
handler for doing HMac authentication using Hawk.</p>

<p>The first step in the implementation is to create a custom
AuthenticationOptions class.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">HawkAuthenticationOptions</span> <span class="p">:</span> <span class="n">AuthenticationOptions</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">public</span> <span class="k">const</span> <span class="kt">string</span> <span class="n">Scheme</span> <span class="p">=</span> <span class="s">&quot;Hawk&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="nf">HawkAuthenticationOptions</span><span class="p">()</span>
</span><span class='line'>       <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="n">Scheme</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>   <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="n">Func</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="n">HawkCredential</span><span class="p">&gt;</span> <span class="n">Credentials</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The Credentials property is a callback that the authentication handler
implementation will use to resolve the user/key to verify the HMAC
received in the authorization header. In a Basic Authentication
implementation, you could potentially have a callback or a reference to
a repository to verify the username and password received in the
authorization header. I am also passing “Hawk” as part of the
constructor to set the authentication scheme associated to the handler.</p>

<p>The next step is to implement the AuthenticationHandler.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">HawkAuthenticationHandler</span> <span class="p">:</span> <span class="n">AuthenticationHandler</span><span class="p">&lt;</span><span class="n">HawkAuthenticationOptions</span><span class="p">&gt;</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">private</span> <span class="k">readonly</span> <span class="n">ILogger</span> <span class="n">logger</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="nf">HawkAuthenticationHandler</span><span class="p">(</span><span class="n">ILogger</span> <span class="n">logger</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="n">logger</span> <span class="p">=</span> <span class="n">logger</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">protected</span> <span class="k">override</span> <span class="n">Task</span><span class="p">&lt;</span><span class="n">AuthenticationTicket</span><span class="p">&gt;</span> <span class="n">AuthenticateCore</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>     <span class="n">AuthenticationHeaderValue</span> <span class="n">authorization</span> <span class="p">=</span> <span class="k">null</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>     <span class="k">if</span> <span class="p">(</span><span class="n">Request</span><span class="p">.</span><span class="n">GetHeader</span><span class="p">(</span><span class="s">&quot;authorization&quot;</span><span class="p">)</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
</span><span class='line'>     <span class="p">{</span>
</span><span class='line'>         <span class="n">authorization</span> <span class="p">=</span> <span class="n">AuthenticationHeaderValue</span><span class="p">.</span><span class="n">Parse</span><span class="p">(</span><span class="n">Request</span><span class="p">.</span><span class="n">GetHeader</span><span class="p">(</span><span class="s">&quot;authorization&quot;</span><span class="p">));</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>     <span class="k">if</span> <span class="p">(</span><span class="n">authorization</span> <span class="p">!=</span> <span class="k">null</span> <span class="p">&amp;&amp;</span>
</span><span class='line'>          <span class="p">!</span><span class="kt">string</span><span class="p">.</span><span class="n">Equals</span><span class="p">(</span><span class="n">authorization</span><span class="p">.</span><span class="n">Scheme</span><span class="p">,</span> <span class="n">HawkAuthenticationOptions</span><span class="p">.</span><span class="n">Scheme</span><span class="p">))</span>
</span><span class='line'>     <span class="p">{</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="n">logger</span><span class="p">.</span><span class="n">WriteInformation</span><span class="p">(</span><span class="kt">string</span><span class="p">.</span><span class="n">Format</span><span class="p">(</span><span class="s">&quot;Authorization skipped. Schema found {0}&quot;</span><span class="p">,</span>
</span><span class='line'>               <span class="n">authorization</span><span class="p">.</span><span class="n">Scheme</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>          <span class="k">return</span> <span class="n">Task</span><span class="p">.</span><span class="n">FromResult</span><span class="p">(</span><span class="n">EmptyTicket</span><span class="p">());</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">authorization</span> <span class="p">==</span> <span class="k">null</span> <span class="p">||</span>
</span><span class='line'>         <span class="kt">string</span><span class="p">.</span><span class="n">IsNullOrWhiteSpace</span><span class="p">(</span><span class="n">authorization</span><span class="p">.</span><span class="n">Scheme</span><span class="p">))</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="n">logger</span><span class="p">.</span><span class="n">WriteWarning</span><span class="p">(</span><span class="s">&quot;Authorization header not found&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>          <span class="k">return</span> <span class="n">Task</span><span class="p">.</span><span class="n">FromResult</span><span class="p">(</span><span class="n">EmptyTicket</span><span class="p">());</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="kt">string</span><span class="p">.</span><span class="n">IsNullOrWhiteSpace</span><span class="p">(</span><span class="n">authorization</span><span class="p">.</span><span class="n">Parameter</span><span class="p">))</span>
</span><span class='line'>          <span class="p">{</span>
</span><span class='line'>              <span class="k">this</span><span class="p">.</span><span class="n">logger</span><span class="p">.</span><span class="n">WriteWarning</span><span class="p">(</span><span class="s">&quot;Invalid header format&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>              <span class="k">return</span> <span class="n">Task</span><span class="p">.</span><span class="n">FromResult</span><span class="p">(</span><span class="n">EmptyTicket</span><span class="p">());</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>         <span class="k">if</span> <span class="p">(</span><span class="kt">string</span><span class="p">.</span><span class="n">IsNullOrWhiteSpace</span><span class="p">(</span><span class="n">Request</span><span class="p">.</span><span class="n">Host</span><span class="p">))</span>
</span><span class='line'>         <span class="p">{</span>
</span><span class='line'>              <span class="k">this</span><span class="p">.</span><span class="n">logger</span><span class="p">.</span><span class="n">WriteWarning</span><span class="p">(</span><span class="s">&quot;Missing Host header&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>              <span class="k">return</span> <span class="n">Task</span><span class="p">.</span><span class="n">FromResult</span><span class="p">(</span><span class="n">EmptyTicket</span><span class="p">());</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>          <span class="k">try</span>
</span><span class='line'>          <span class="p">{</span>
</span><span class='line'>              <span class="kt">var</span> <span class="n">principal</span> <span class="p">=</span> <span class="n">Hawk</span><span class="p">.</span><span class="n">Authenticate</span><span class="p">(</span><span class="n">authorization</span><span class="p">.</span><span class="n">Parameter</span><span class="p">,</span>
</span><span class='line'>                   <span class="n">Request</span><span class="p">.</span><span class="n">Host</span><span class="p">,</span>
</span><span class='line'>                   <span class="n">Request</span><span class="p">.</span><span class="n">Method</span><span class="p">,</span>
</span><span class='line'>                   <span class="n">Request</span><span class="p">.</span><span class="n">Uri</span><span class="p">,</span>
</span><span class='line'>                   <span class="k">this</span><span class="p">.</span><span class="n">Options</span><span class="p">.</span><span class="n">Credentials</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>              <span class="kt">var</span> <span class="n">identity</span> <span class="p">=</span> <span class="p">(</span><span class="n">ClaimsIdentity</span><span class="p">)((</span><span class="n">ClaimsPrincipal</span><span class="p">)</span><span class="n">principal</span><span class="p">).</span><span class="n">Identity</span><span class="p">;</span>
</span><span class='line'>              <span class="kt">var</span> <span class="n">ticket</span> <span class="p">=</span> <span class="k">new</span> <span class="n">AuthenticationTicket</span><span class="p">(</span><span class="n">identity</span><span class="p">,</span> <span class="p">(</span><span class="n">AuthenticationExtra</span><span class="p">)</span><span class="k">null</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>              <span class="k">return</span> <span class="n">Task</span><span class="p">.</span><span class="n">FromResult</span><span class="p">(</span><span class="n">ticket</span><span class="p">);</span>
</span><span class='line'>           <span class="p">}</span>
</span><span class='line'>           <span class="k">catch</span> <span class="p">(</span><span class="n">SecurityException</span> <span class="n">ex</span><span class="p">)</span>
</span><span class='line'>           <span class="p">{</span>
</span><span class='line'>                <span class="k">this</span><span class="p">.</span><span class="n">logger</span><span class="p">.</span><span class="n">WriteWarning</span><span class="p">(</span><span class="n">ex</span><span class="p">.</span><span class="n">Message</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>                <span class="k">return</span> <span class="n">Task</span><span class="p">.</span><span class="n">FromResult</span><span class="p">(</span><span class="n">EmptyTicket</span><span class="p">());</span>
</span><span class='line'>           <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">protected</span> <span class="k">override</span> <span class="n">Task</span> <span class="nf">ApplyResponseChallenge</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>         <span class="k">if</span> <span class="p">(</span><span class="n">Response</span><span class="p">.</span><span class="n">StatusCode</span> <span class="p">!=</span> <span class="m">401</span><span class="p">)</span>
</span><span class='line'>         <span class="p">{</span>
</span><span class='line'>              <span class="k">return</span> <span class="n">Task</span><span class="p">.</span><span class="n">FromResult</span><span class="p">&lt;</span><span class="kt">object</span><span class="p">&gt;(</span><span class="k">null</span><span class="p">);</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>         <span class="kt">var</span> <span class="n">ts</span> <span class="p">=</span> <span class="n">Hawk</span><span class="p">.</span><span class="n">ConvertToUnixTimestamp</span><span class="p">(</span><span class="n">DateTime</span><span class="p">.</span><span class="n">Now</span><span class="p">).</span><span class="n">ToString</span><span class="p">();</span>
</span><span class='line'>         <span class="kt">var</span> <span class="n">challenge</span> <span class="p">=</span> <span class="kt">string</span><span class="p">.</span><span class="n">Format</span><span class="p">(</span><span class="s">&quot;ts=\&quot;{0}\&quot; ntp=\&quot;{1}\&quot;&quot;</span><span class="p">,</span>
</span><span class='line'>                <span class="n">ts</span><span class="p">,</span> <span class="s">&quot;pool.ntp.org&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>         <span class="n">Response</span><span class="p">.</span><span class="n">AddHeader</span><span class="p">(</span><span class="s">&quot;WWW-Authenticate&quot;</span><span class="p">,</span> <span class="n">HawkAuthenticationOptions</span><span class="p">.</span><span class="n">Scheme</span> <span class="p">+</span> <span class="s">&quot; &quot;</span> <span class="p">+</span> <span class="n">challenge</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="n">Task</span><span class="p">.</span><span class="n">FromResult</span><span class="p">&lt;</span><span class="kt">object</span><span class="p">&gt;(</span><span class="k">null</span><span class="p">);</span>
</span><span class='line'>     <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>     <span class="k">private</span> <span class="k">static</span> <span class="n">AuthenticationTicket</span> <span class="nf">EmptyTicket</span><span class="p">()</span>
</span><span class='line'>     <span class="p">{</span>
</span><span class='line'>         <span class="k">return</span> <span class="k">new</span> <span class="nf">AuthenticationTicket</span><span class="p">(</span><span class="k">null</span><span class="p">,</span> <span class="p">(</span><span class="n">AuthenticationExtra</span><span class="p">)</span><span class="k">null</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The implementation is Active, so only overrides the AuthenticationCore
and ApplyResponseChallenge methods. The AuthenticationCore
implementation tries to locate a Authorization Header with a format that
follows the Hawk specification to authenticate the call. If an
Authorization header is not found or it can not be parsed, an
AuthenticationTicket instance with an empty identity is returned.
Otherwise, the identity is set in the ticket and returned as part of the
task. This implementation also uses the logging facilities provided by
Katana.</p>

<p>The last step is to implement the AuthenticationMiddleware class.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">HawkAuthenticationMiddleware</span> <span class="p">:</span> <span class="n">AuthenticationMiddleware</span><span class="p">&lt;</span><span class="n">HawkAuthenticationOptions</span><span class="p">&gt;</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">private</span> <span class="k">readonly</span> <span class="n">ILogger</span> <span class="n">logger</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="nf">HawkAuthenticationMiddleware</span><span class="p">(</span>
</span><span class='line'>        <span class="n">OwinMiddleware</span> <span class="n">next</span><span class="p">,</span>
</span><span class='line'>        <span class="n">IAppBuilder</span> <span class="n">app</span><span class="p">,</span>
</span><span class='line'>        <span class="n">HawkAuthenticationOptions</span> <span class="n">options</span><span class="p">)</span> <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="n">next</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>         <span class="k">this</span><span class="p">.</span><span class="n">logger</span> <span class="p">=</span> <span class="n">app</span><span class="p">.</span><span class="n">CreateLogger</span><span class="p">&lt;</span><span class="n">HawkAuthenticationHandler</span><span class="p">&gt;();</span>
</span><span class='line'>     <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>     <span class="k">protected</span> <span class="k">override</span> <span class="n">AuthenticationHandler</span><span class="p">&lt;</span><span class="n">HawkAuthenticationOptions</span><span class="p">&gt;</span> <span class="n">CreateHandler</span><span class="p">()</span>
</span><span class='line'>     <span class="p">{</span>
</span><span class='line'>         <span class="k">return</span> <span class="k">new</span> <span class="nf">HawkAuthenticationHandler</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="n">logger</span><span class="p">);</span>
</span><span class='line'>     <span class="p">}</span>
</span><span class='line'> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This implementation only overrides the CreateHandler method to return a
new HawkAuthenticationHandler instance. As that instance relies on the
Katana logger, the logger instance is first created from the IAppBuilder
instance injected in the constructor.</p>

<p>Once you have the AuthenticationMiddleware implementation completed, you
will want to inject it in the OWIN pipeline to use it in an existing
application. An extension method can be provided to make this task
easier for the developer.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">static</span> <span class="k">class</span> <span class="nc">HawkAuthenticationExtensions</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">IAppBuilder</span> <span class="nf">UseHawkAuthentication</span><span class="p">(</span><span class="k">this</span> <span class="n">IAppBuilder</span> <span class="n">app</span><span class="p">,</span> <span class="n">HawkAuthenticationOptions</span> <span class="n">options</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">app</span><span class="p">.</span><span class="n">Use</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">HawkAuthenticationMiddleware</span><span class="p">),</span> <span class="n">app</span><span class="p">,</span> <span class="n">options</span><span class="p">);</span>
</span><span class='line'>        <span class="n">app</span><span class="p">.</span><span class="n">UseStageMarkerAuthenticate</span><span class="p">();</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">app</span><span class="p">;</span>
</span><span class='line'>     <span class="p">}</span>
</span><span class='line'> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The following example shows how this extension is used to register the
HawkAuthenticationMiddleware service in an application that uses Web API
with OWIN</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">Startup</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>     <span class="k">public</span> <span class="k">void</span> <span class="nf">Configuration</span><span class="p">(</span><span class="n">IAppBuilder</span> <span class="n">app</span><span class="p">)</span>
</span><span class='line'>     <span class="p">{</span>
</span><span class='line'>         <span class="n">app</span><span class="p">.</span><span class="n">SetLoggerFactory</span><span class="p">(</span><span class="k">new</span> <span class="n">ConsoleLoggerFactory</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'>         <span class="kt">var</span> <span class="n">config</span> <span class="p">=</span> <span class="k">new</span> <span class="n">HttpConfiguration</span><span class="p">();</span>
</span><span class='line'>         <span class="n">config</span><span class="p">.</span><span class="n">Routes</span><span class="p">.</span><span class="n">MapHttpRoute</span><span class="p">(</span><span class="s">&quot;Default&quot;</span><span class="p">,</span> <span class="s">&quot;api/{controller}&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>         <span class="n">app</span><span class="p">.</span><span class="n">UseHawkAuthentication</span><span class="p">(</span><span class="k">new</span> <span class="n">HawkAuthenticationOptions</span>
</span><span class='line'>         <span class="p">{</span>
</span><span class='line'>             <span class="n">Credentials</span> <span class="p">=</span> <span class="p">(</span><span class="n">id</span><span class="p">)</span> <span class="p">=&gt;</span>
</span><span class='line'>             <span class="p">{</span>
</span><span class='line'>                 <span class="k">return</span> <span class="k">new</span> <span class="n">HawkCredential</span>
</span><span class='line'>                 <span class="p">{</span>
</span><span class='line'>                     <span class="n">Id</span> <span class="p">=</span> <span class="s">&quot;dh37fgj492je&quot;</span><span class="p">,</span>
</span><span class='line'>                     <span class="n">Key</span> <span class="p">=</span> <span class="s">&quot;werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn&quot;</span><span class="p">,</span>
</span><span class='line'>                     <span class="n">Algorithm</span> <span class="p">=</span> <span class="s">&quot;hmacsha256&quot;</span><span class="p">,</span>
</span><span class='line'>                     <span class="n">User</span> <span class="p">=</span> <span class="s">&quot;steve&quot;</span>
</span><span class='line'>                 <span class="p">};</span>
</span><span class='line'>              <span class="p">}</span>
</span><span class='line'>         <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">app</span><span class="p">.</span><span class="n">UseWebApi</span><span class="p">(</span><span class="n">config</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>     <span class="p">}</span>
</span><span class='line'> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>All the code provided as part of this example for Hawk can be found in
the <a href="https://github.com/pcibraro/hawknet">HawkNet github project</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Getting started with Owin and Katana]]></title>
    <link href="http://cibrax.me/blog/2013/07/22/getting-started-with-owin-and-katana/"/>
    <updated>2013-07-22T00:00:00-03:00</updated>
    <id>http://cibrax.me/blog/2013/07/22/getting-started-with-owin-and-katana</id>
    <content type="html"><![CDATA[<h2>Introduction</h2>

<p>The .NET ecosystem offers today a lot of alternatives for developing web
applications. You can either use any of the frameworks supported by
Microsoft with ASP.NET such as Forms, MVC or Web API, or any other open
source alternative like FubuMVC, ServiceStack, NancyFx or OpenRasta to
name a few. From an architecture standpoint, all these frameworks have
three main layers in common (in spite of the difference with the
implementation details), hosting, middleware, and application.</p>

<p>The hosting layer is responsible for managing the underline process,
where the http connections are established and managed, and also to
materialize those connections into request/response objects that are
sent to the upper layers. For example, the hosting layer could be
ASP.NET running in IIS, or it could also be a console application that
uses the http listener directly.</p>

<p>The middleware layer provides common infrastructure services, which runs
at low level in the http stack, such as security, caching, or any other
concern that can be handled at this level.</p>

<p>The application layer is where the applications or services are
implemented using the features available in the framework.</p>

<p>However, the distinction between the middleware and application layers
is not always clear, which causes that many of the middleware services
end up being implemented in the application layer. For example, you
could implement middleware services for security in ASP.NET MVC using
filters, which rely on features specific to the application level in
that framework. This make almost impossible to reuse all these services
across all the available frameworks, so you will find different
implementations of the same services for the different frameworks. To
give an example, basic authentication is something that could be
implemented as middleware service and reused, but today is implemented
differently in each framework.</p>

<p>Someone would suggest that a ASP.NET Http Module could be a good option
for implementing a middleware service, but that’s not necessarily true
as it would only work when the hosting layer uses ASP.NET.</p>

<p>This exact problem is what <a href="http://owin.org/spec/owin-1.0.0.html">OWIN
specification</a> tries to address by
providing a common abstraction for any http-aware service or application
with minimal dependencies on existing frameworks or implementations.  At
very core level, OWIN defines a handler, which is represented as an
application delegate,</p>

<p>using AppFunc = Func&lt; \
        IDictionary&lt;string, object>, // Environment \
        Task>; // Done</p>

<p>The idea is to represent the three layers discussed above as a set of
handlers using the “chain of responsibility” pattern. The environment
argument is a dictionary that the different handlers use to exchange
values, and the next handler in the chain is represented with the task
argument. Having said that, the first handler in the chain would be
responsible for the hosting layer, and it should populate the
environment with keys that describe the received http request message,
such as scheme, port, request path, headers, etc. All those common
headers are discussed as part of the specification.</p>

<p>Katana is a Microsoft implementation of the OWIN specification, which
includes handlers for the hosting and middleware layers. It’s an open
source project, which can be found in this
<a href="http://katanaproject.codeplex.com/SourceControl/latest">location</a>. All
the investment that Microsoft has done so far for ASP.NET in the
different application frameworks (i.e. MVC or Web API), it’s now being
refactored as OWIN handlers that can be reused across different
application frameworks. For example, cookie authentication or even OAuth
are being implemented as middleware services that can be reused not only
by ASP.NET web apps but also for other application frameworks in the
open source world.</p>

<p>The application layer is also implemented as another OWIN handler, which
is responsible for setting up all the infrastructure required to handle
the request/response at the application level. You will find application
handlers for ASP.NET MVC, ASP.NET Web API, SignalR, or NancyFx to give
an example. </p>

<h2>Gettting Started with OWIN and Katana</h2>

<p>The easiest way to get started with OWIN is to use the assembly
distributed as nuget package. You will find a single nuget package for
this called “OWIN”. This assembly only contains an interface
IAppBuilder, which can be used to configure all the handlers that you
want to use in your web application. This is a very low level interface
that you won’t have to implement yourself if you use Katana.</p>

<p>In addition to the “OWIN” assembly, you will find two additional nuget
packages</p>

<ul>
<li>Owin.Extensions: Provides a set of very useful extensions methods
for the IAppBuilder interface that you can use to configure the
handlers.</li>
<li>Owin.Types: Provides a set of wrappers to represent the environment
dictionary as a typed object representing the request and response
messages.</li>
</ul>


<p>You can implement your first OWIN handler using these three packages
(You will not able to run it without the hosting handlers provided by
Katana).</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">MyMiddleware</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">Func</span><span class="p">&lt;</span><span class="n">IDictionary</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="kt">object</span><span class="p">&gt;,</span> <span class="n">Task</span><span class="p">&gt;</span> <span class="n">next</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="nf">MyMiddleware</span><span class="p">(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">IDictionary</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="kt">object</span><span class="p">&gt;,</span> <span class="n">Task</span><span class="p">&gt;</span> <span class="n">next</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="n">next</span> <span class="p">=</span> <span class="n">next</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="n">Task</span> <span class="nf">Invoke</span><span class="p">(</span><span class="n">IDictionary</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="kt">object</span><span class="p">&gt;</span> <span class="n">env</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">headers</span> <span class="p">=</span> <span class="p">(</span><span class="n">IDictionary</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="kt">string</span><span class="p">[]&gt;)</span><span class="n">env</span><span class="p">[</span><span class="s">&quot;owin.RequestHeaders&quot;</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">var</span> <span class="n">url</span> <span class="p">=</span> <span class="kt">string</span><span class="p">.</span><span class="n">Format</span><span class="p">(</span><span class="s">&quot;{0}://{1}{2}{3}&quot;</span><span class="p">,</span>
</span><span class='line'>                <span class="p">(</span><span class="kt">string</span><span class="p">)</span><span class="n">env</span><span class="p">[</span><span class="s">&quot;owin.RequestScheme&quot;</span><span class="p">],</span>
</span><span class='line'>                <span class="n">headers</span><span class="p">[</span><span class="s">&quot;host&quot;</span><span class="p">].</span><span class="n">First</span><span class="p">(),</span>
</span><span class='line'>                <span class="p">(</span><span class="kt">string</span><span class="p">)</span><span class="n">env</span><span class="p">[</span><span class="s">&quot;owin.RequestPathBase&quot;</span><span class="p">],</span>
</span><span class='line'>                <span class="p">(</span><span class="kt">string</span><span class="p">)</span><span class="n">env</span><span class="p">[</span><span class="s">&quot;owin.RequestPath&quot;</span><span class="p">]);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">((</span><span class="kt">string</span><span class="p">)</span><span class="n">env</span><span class="p">[</span><span class="s">&quot;owin.RequestQueryString&quot;</span><span class="p">]</span> <span class="p">!=</span> <span class="s">&quot;&quot;</span><span class="p">)</span>
</span><span class='line'>      <span class="n">url</span> <span class="p">+=</span> <span class="s">&quot;?&quot;</span> <span class="p">+</span> <span class="p">(</span><span class="kt">string</span><span class="p">)</span><span class="n">env</span><span class="p">[</span><span class="s">&quot;owin.RequestQueryString&quot;</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;The received URL is {0}&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="n">next</span><span class="p">(</span><span class="n">env</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is a low level handler that sends the request url to the console.
As you can see, it relies on some existing properties in the
environment, which should have been set by Katana in the hosting layer.
The handler also receives the next handler to call in the chain as part
of the constructor.</p>

<p>The entry point in any Katana application must be a class that receives
the IAppBuilder interface as argument to configure all the handlers, as
it is shown below,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'> <span class="k">public</span> <span class="k">class</span> <span class="nc">Startup</span>
</span><span class='line'> <span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">void</span> <span class="nf">Configuration</span><span class="p">(</span><span class="n">IAppBuilder</span> <span class="n">app</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>       <span class="n">app</span><span class="p">.</span><span class="n">UseType</span><span class="p">&lt;</span><span class="n">MyMiddleware</span><span class="p">&gt;();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>UseType is one the extension methods provided by “Owin.Extensions” to
configure a new handler in the pipeline. You can also other extension
methods to define a handler on the fly using delegates as this one,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="n">app</span><span class="p">.</span><span class="n">UseHandlerAsync</span><span class="p">(</span><span class="k">async</span> <span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span> <span class="p">=&gt;</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">res</span><span class="p">.</span><span class="n">ContentType</span> <span class="p">=</span> <span class="s">&quot;text/plain&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="k">await</span> <span class="n">res</span><span class="p">.</span><span class="n">WriteAsync</span><span class="p">(</span><span class="s">&quot;Hello World&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>There is one more nuget package that you will find useful to create OWIN
handlers, which is “Microsoft.Owin”. This is a package provided as part
of Katana (It’s still a pre-release), which extends the Owin Request and
Response classes with more properties and methods, and also helper
methods to deal with these classes.</p>

<h2>Hosting an application with Katana</h2>

<p>Katana provides three options to host a web application.</p>

<p>​1. OwinHost.exe. It’s a command tool that you can use to run the
application. You can use multiple command arguments to specify the
assembly with the entry point for configuring the IAppBuilder or other
configuration settings such as the port number or tracing. This is tool
is available as part of the nuget package “OwinHost”.</p>

<p>​2. .NET application. There is a WebApp class that you can use to
self-host a web application in any regular .NET application such as
console app or a windows service. This class is available as part of the
“Microsoft.Owin.Hosting” assembly.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">using</span> <span class="p">(</span><span class="n">WebApp</span><span class="p">.</span><span class="n">Start</span><span class="p">&lt;</span><span class="n">Startup</span><span class="p">&gt;(</span><span class="k">new</span> <span class="n">StartOptions</span> <span class="p">{</span> <span class="n">Port</span> <span class="p">=</span> <span class="m">5000</span> <span class="p">}))</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>   <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Press Enter to quit.&quot;</span><span class="p">);</span>
</span><span class='line'>   <span class="n">Console</span><span class="p">.</span><span class="n">ReadKey</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>You need to pass the startup entry as argument to the static method
“Start”.</p>

<p>​3. ASP.NET. You need to reference the nuget package
“Microsoft.Owin.Hosting.SystemWeb” (Pre-Release) from your web
application project, and include the Startup class in that project as
well.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Pushing ETW events through SignalR]]></title>
    <link href="http://cibrax.me/blog/2013/06/03/pushing-etw-events-through-signalr/"/>
    <updated>2013-06-03T00:00:00-03:00</updated>
    <id>http://cibrax.me/blog/2013/06/03/pushing-etw-events-through-signalr</id>
    <content type="html"><![CDATA[<p>ETW or Event Tracing for Windows is a very efficient pub/sub built-in
mechanism that runs in Kernel Mode for doing event tracing. That implies
there is just a little overhead in using this feature compared to other
traditional tracing solutions that are I/O bound and drop the traces in
different storages like files or databases for example. As it is a
built-in mechanism in Windows, many of the operating systems services
and components make good use of it. You can not only troubleshoot your
application but also many of the OS components involved in the execution
of that application.</p>

<p>In ETW, you have applications publishing events in queues (or providers)
and other applications consuming events from those queues in real-time
through ETW sessions. When an event is published in a provider, it goes
nowhere unless there is session collecting events on that queue. (The
events are not persisted).</p>

<p>The adoption of ETW in .NET application was pretty low as it was very
hard to configure and use. However, things might change now that .NET
4.5 supports a new EventSource class for publishing events easily in any
.NET application. Another way to publish events in the past was to use
.NET diagnostics infrastructure with the trace listener for ETW,
“EventProviderTraceListener”.</p>

<p>About this last one, it can be easily configured and associated to a
trace source as it is shown bellow,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="p">&lt;</span><span class="n">system</span><span class="p">.</span><span class="n">diagnostics</span><span class="p">&gt;</span>
</span><span class='line'>  <span class="p">&lt;</span><span class="n">sources</span><span class="p">&gt;</span>
</span><span class='line'>    <span class="p">&lt;</span><span class="n">source</span> <span class="n">name</span><span class="p">=</span><span class="s">&quot;MyConsoleApp&quot;</span> <span class="n">switchValue</span><span class="p">=</span><span class="s">&quot;Verbose&quot;</span><span class="p">&gt;</span>
</span><span class='line'>      <span class="p">&lt;</span><span class="n">listeners</span><span class="p">&gt;</span>
</span><span class='line'>        <span class="p">&lt;</span><span class="k">add</span> <span class="n">name</span><span class="p">=</span><span class="s">&quot;ETWListener&quot;</span> <span class="n">type</span><span class="p">=</span><span class="s">&quot;System.Diagnostics.Eventing.EventProviderTraceListener, System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;</span>
</span><span class='line'>               <span class="n">initializeData</span><span class="p">=</span><span class="s">&quot;13D5F7EF-9404-47ea-AF13-85484F09F2A7&quot;</span> <span class="p">/&gt;</span>
</span><span class='line'>      <span class="p">&lt;/</span><span class="n">listeners</span><span class="p">&gt;</span>
</span><span class='line'>    <span class="p">&lt;/</span><span class="n">source</span><span class="p">&gt;</span>
</span><span class='line'>  <span class="p">&lt;/</span><span class="n">sources</span><span class="p">&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">&lt;</span><span class="n">trace</span> <span class="n">autoflush</span><span class="p">=</span><span class="s">&quot;true&quot;</span><span class="p">/&gt;</span>
</span><span class='line'><span class="p">&lt;/</span><span class="n">system</span><span class="p">.</span><span class="n">diagnostics</span><span class="p">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The trace listener is associated to a GUID through the initializeData
attribute. That identifier is used by ETW and associated to the
provider, so it’s the one you will use to collect the events in a
session.</p>

<p>Once the listener is configured, you can start publishing events in that
provider through a the trace source.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="n">TraceSource</span> <span class="n">myTraceSource</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TraceSource</span><span class="p">(</span><span class="s">&quot;MyConsoleApp&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">myTraceSource</span><span class="p">.</span><span class="n">TraceEvent</span><span class="p">(</span><span class="n">TraceEventType</span><span class="p">.</span><span class="n">Error</span><span class="p">,</span> <span class="m">1</span><span class="p">,</span> <span class="s">&quot;Tracing Error Message.&quot;</span><span class="p">);</span>
</span><span class='line'><span class="n">myTraceSource</span><span class="p">.</span><span class="n">TraceEvent</span><span class="p">(</span><span class="n">TraceEventType</span><span class="p">.</span><span class="n">Warning</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="s">&quot;Tracing Warning Message.&quot;</span><span class="p">);</span>
</span><span class='line'><span class="n">myTraceSource</span><span class="p">.</span><span class="n">TraceEvent</span><span class="p">(</span><span class="n">TraceEventType</span><span class="p">.</span><span class="n">Information</span><span class="p">,</span> <span class="m">3</span><span class="p">,</span> <span class="s">&quot;Tracing Information.&quot;</span><span class="p">);</span>
</span><span class='line'><span class="n">myTraceSource</span><span class="p">.</span><span class="n">TraceEvent</span><span class="p">(</span><span class="n">TraceEventType</span><span class="p">.</span><span class="n">Verbose</span><span class="p">,</span> <span class="m">4</span><span class="p">,</span> <span class="s">&quot;Tracing Verbose Message.&quot;</span><span class="p">);</span>
</span><span class='line'><span class="n">myTraceSource</span><span class="p">.</span><span class="n">TraceEvent</span><span class="p">(</span><span class="n">TraceEventType</span><span class="p">.</span><span class="n">Critical</span><span class="p">,</span> <span class="m">5</span><span class="p">,</span> <span class="s">&quot;Tracing Critical Message.&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">myTraceSource</span><span class="p">.</span><span class="n">Close</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>Listening for those events in a ETW session is a different story. The
standard procedure is to use a set of tools for starting an ETW session
and dump the events into a binary file with a proprietary format (these
are “etl” files), that can be imported in the event log viewer or an
specific tool for this kind of file. You also have a tool for converting
“etl” files to more user readable formats like xml or cvs. However, you
can also use the ETW unmanaged API to start a new session and subscribe
to the events as it was done with the <a href="http://archive.msdn.microsoft.com/EventTraceWatcher">EventTraceWatcher
implementation</a> in
this sample.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="kt">var</span> <span class="n">providerId</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Guid</span><span class="p">(</span><span class="s">&quot;13D5F7EF-9404-47ea-AF13-85484F09F2A7&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="k">using</span> <span class="p">(</span><span class="n">EventTraceWatcher</span> <span class="n">watcher</span> <span class="p">=</span> <span class="k">new</span> <span class="n">EventTraceWatcher</span><span class="p">(</span><span class="s">&quot;MySession&quot;</span><span class="p">,</span> <span class="n">providerId</span><span class="p">))</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">watcher</span><span class="p">.</span><span class="n">EventArrived</span> <span class="p">+=</span> <span class="k">delegate</span><span class="p">(</span><span class="kt">object</span> <span class="n">sender</span><span class="p">,</span> <span class="n">EventArrivedEventArgs</span> <span class="n">e</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">Error</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">Console</span><span class="p">.</span><span class="n">Error</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">Error</span><span class="p">);</span>
</span><span class='line'>      <span class="n">Environment</span><span class="p">.</span><span class="n">Exit</span><span class="p">(-</span><span class="m">1</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Dump properties (key/value)</span>
</span><span class='line'>    <span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">p</span> <span class="k">in</span> <span class="n">e</span><span class="p">.</span><span class="n">Properties</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Event&quot;</span><span class="p">,</span> <span class="s">&quot;\t&quot;</span> <span class="p">+</span> <span class="n">p</span><span class="p">.</span><span class="n">Key</span> <span class="p">+</span> <span class="s">&quot; -- &quot;</span> <span class="p">+</span> <span class="n">p</span><span class="p">.</span><span class="n">Value</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Start listening</span>
</span><span class='line'>    <span class="n">watcher</span><span class="p">.</span><span class="n">Start</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Listening...Press &lt;Enter&gt; to exit&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="n">Console</span><span class="p">.</span><span class="n">ReadLine</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>You use the EventTraceWatcher to subscribe to events generated by an ETW
provider, which are received as part of an event. What’s really
interesting about this code is that it runs out of process. You could be
collecting the events in a completely different application in the same
host and doing whatever you want with those events like persisting them
in a database for example. The performance of the application generating
the events would not be affected at all.</p>

<p>Now, imagine that you have a service running in one of your servers,
which can be used to start a new ETW session and publish those events
via SignalR. In that way, you can connect with a browser to the SignalR
hub created by that service and get the events realtime, which
represents an interesting way to see what’s going on your server at a
given time.</p>

<p>You can do an slight change to the code using the EventTraceWatcher to
publish the events to a SignalR hub as it is shown bellow,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">class</span> <span class="nc">Program</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">(</span><span class="kt">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">string</span> <span class="n">url</span> <span class="p">=</span> <span class="s">&quot;http://localhost:8080&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">using</span> <span class="p">(</span><span class="n">WebApplication</span><span class="p">.</span><span class="n">Start</span><span class="p">&lt;</span><span class="n">Startup</span><span class="p">&gt;(</span><span class="n">url</span><span class="p">))</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Server running on {0}&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="kt">var</span> <span class="n">hubConnection</span> <span class="p">=</span> <span class="k">new</span> <span class="n">HubConnection</span><span class="p">(</span><span class="s">&quot;http://localhost:8080/&quot;</span><span class="p">);</span>
</span><span class='line'>            <span class="kt">var</span> <span class="n">serverHub</span> <span class="p">=</span> <span class="n">hubConnection</span><span class="p">.</span><span class="n">CreateHubProxy</span><span class="p">(</span><span class="s">&quot;EventsHub&quot;</span><span class="p">);</span>
</span><span class='line'>            <span class="n">hubConnection</span><span class="p">.</span><span class="n">Start</span><span class="p">().</span><span class="n">Wait</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>            <span class="kt">var</span> <span class="n">providerId</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Guid</span><span class="p">(</span><span class="s">&quot;13D5F7EF-9404-47ea-AF13-85484F09F2A7&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">using</span> <span class="p">(</span><span class="n">EventTraceWatcher</span> <span class="n">watcher</span> <span class="p">=</span> <span class="k">new</span> <span class="n">EventTraceWatcher</span><span class="p">(</span><span class="s">&quot;MySession&quot;</span><span class="p">,</span> <span class="n">providerId</span><span class="p">))</span>
</span><span class='line'>            <span class="p">{</span>
</span><span class='line'>                <span class="n">watcher</span><span class="p">.</span><span class="n">EventArrived</span> <span class="p">+=</span> <span class="k">delegate</span><span class="p">(</span><span class="kt">object</span> <span class="n">sender</span><span class="p">,</span> <span class="n">EventArrivedEventArgs</span> <span class="n">e</span><span class="p">)</span>
</span><span class='line'>                <span class="p">{</span>
</span><span class='line'>                    <span class="k">if</span> <span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">Error</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
</span><span class='line'>                    <span class="p">{</span>
</span><span class='line'>                        <span class="n">Console</span><span class="p">.</span><span class="n">Error</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">Error</span><span class="p">);</span>
</span><span class='line'>                        <span class="n">Environment</span><span class="p">.</span><span class="n">Exit</span><span class="p">(-</span><span class="m">1</span><span class="p">);</span>
</span><span class='line'>                    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>                    <span class="c1">// Dump properties (key/value)</span>
</span><span class='line'>                    <span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">p</span> <span class="k">in</span> <span class="n">e</span><span class="p">.</span><span class="n">Properties</span><span class="p">)</span>
</span><span class='line'>                    <span class="p">{</span>
</span><span class='line'>                        <span class="n">serverHub</span><span class="p">.</span><span class="n">Invoke</span><span class="p">(</span><span class="s">&quot;PushEvent&quot;</span><span class="p">,</span> <span class="s">&quot;\t&quot;</span> <span class="p">+</span> <span class="n">p</span><span class="p">.</span><span class="n">Key</span> <span class="p">+</span> <span class="s">&quot; -- &quot;</span> <span class="p">+</span> <span class="n">p</span><span class="p">.</span><span class="n">Value</span><span class="p">).</span><span class="n">Wait</span><span class="p">();</span>
</span><span class='line'>                    <span class="p">}</span>
</span><span class='line'>                <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>                <span class="c1">// Start listening</span>
</span><span class='line'>                <span class="n">watcher</span><span class="p">.</span><span class="n">Start</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>                <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Listening...Press &lt;Enter&gt; to exit&quot;</span><span class="p">);</span>
</span><span class='line'>                <span class="n">Console</span><span class="p">.</span><span class="n">ReadLine</span><span class="p">();</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">Console</span><span class="p">.</span><span class="n">ReadLine</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Startup</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">void</span> <span class="nf">Configuration</span><span class="p">(</span><span class="n">IAppBuilder</span> <span class="n">app</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="c1">// Turn cross domain on </span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">config</span> <span class="p">=</span> <span class="k">new</span> <span class="n">HubConfiguration</span> <span class="p">{</span> <span class="n">EnableCrossDomain</span> <span class="p">=</span> <span class="k">true</span> <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// This will map out to http://localhost:8080/signalr by default</span>
</span><span class='line'>        <span class="n">app</span><span class="p">.</span><span class="n">MapHubs</span><span class="p">(</span><span class="n">config</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">EventsHub</span> <span class="p">:</span> <span class="n">Hub</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">void</span> <span class="nf">PushEvent</span><span class="p">(</span><span class="kt">string</span> <span class="n">message</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Event: &quot;</span> <span class="p">+</span> <span class="n">message</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">Clients</span><span class="p">.</span><span class="n">All</span><span class="p">.</span><span class="n">PushEvent</span><span class="p">(</span><span class="n">message</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This uses SignalR hosted in a console application with OWIN, so it could
be literally moved to a windows service as well. Every time an event is
captured from the ETW session, it is published in the SignalR hub.</p>

<p>On the other side, you can also use SignalR to subscribe to the same hub
and receive the generated messages at real time.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">messages</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#messages&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">connection</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">hubConnection</span><span class="p">(</span><span class="s1">&#39;http://localhost:8080&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">connection</span><span class="p">.</span><span class="nx">start</span><span class="p">()</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">done</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Connected, transport = &quot;</span> <span class="o">+</span> <span class="nx">connection</span><span class="p">.</span><span class="nx">transport</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
</span><span class='line'>            <span class="p">})</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">fail</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Could not connect&#39;</span><span class="p">);</span> <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">proxy</span> <span class="o">=</span> <span class="nx">connection</span><span class="p">.</span><span class="nx">createHubProxy</span><span class="p">(</span><span class="s1">&#39;EventsHub&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">proxy</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;PushEvent&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">message</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">messages</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="nx">message</span> <span class="o">+</span> <span class="s2">&quot;&lt;br&gt;&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The code is available at Github,
<a href="https://github.com/pcibraro/RealtimeTracing">https://github.com/pcibraro/RealtimeTracing</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[IP Throttling in ASP.NET Web API]]></title>
    <link href="http://cibrax.me/blog/2013/05/22/ip-throttling-in-asp-net-web-api/"/>
    <updated>2013-05-22T00:00:00-03:00</updated>
    <id>http://cibrax.me/blog/2013/05/22/ip-throttling-in-asp-net-web-api</id>
    <content type="html"><![CDATA[<p>Some Web APIs use the client IP address to enforce Service Level
Agreements such as limit the number of calls in a period of time. The
client IP address can be used as a replacement for an authentication key
sometimes when a previous registration of client applications is not
required.</p>

<p>This is relatively simple to implement in a message handler,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">IPThrottlingMessageHandler</span> <span class="p">:</span> <span class="n">DelegatingHandler</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">IIPRepository</span> <span class="n">repository</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">maxRequestsHour</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="nf">IPThrottlingMessageHandler</span><span class="p">(</span><span class="n">IIPRepository</span> <span class="n">repository</span><span class="p">,</span> <span class="kt">int</span> <span class="n">maxRequestsHour</span> <span class="p">=</span> <span class="m">150</span><span class="p">)</span>
</span><span class='line'>            <span class="p">:</span> <span class="k">base</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="n">repository</span> <span class="p">=</span> <span class="n">repository</span><span class="p">;</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="n">maxRequestsHour</span> <span class="p">=</span> <span class="n">maxRequestsHour</span><span class="p">;</span>
</span><span class='line'>   <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="k">public</span> <span class="nf">IPThrottlingMessageHandler</span><span class="p">(</span><span class="n">HttpMessageHandler</span> <span class="n">inner</span><span class="p">,</span> <span class="n">IIPRepository</span> <span class="n">repository</span><span class="p">,</span> <span class="kt">int</span> <span class="n">maxRequestsHour</span> <span class="p">=</span> <span class="m">150</span><span class="p">)</span>
</span><span class='line'>            <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>     <span class="k">this</span><span class="p">.</span><span class="n">repository</span> <span class="p">=</span> <span class="n">repository</span><span class="p">;</span>
</span><span class='line'>     <span class="k">this</span><span class="p">.</span><span class="n">maxRequestsHour</span> <span class="p">=</span> <span class="n">maxRequestsHour</span><span class="p">;</span>
</span><span class='line'>   <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="k">protected</span> <span class="k">override</span> <span class="n">System</span><span class="p">.</span><span class="n">Threading</span><span class="p">.</span><span class="n">Tasks</span><span class="p">.</span><span class="n">Task</span><span class="p">&lt;</span><span class="n">HttpResponseMessage</span><span class="p">&gt;</span> <span class="n">SendAsync</span><span class="p">(</span><span class="n">HttpRequestMessage</span> <span class="n">request</span><span class="p">,</span> <span class="n">System</span><span class="p">.</span><span class="n">Threading</span><span class="p">.</span><span class="n">CancellationToken</span> <span class="n">cancellationToken</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>     <span class="kt">var</span> <span class="n">ip</span> <span class="p">=</span> <span class="n">GetClientIp</span><span class="p">(</span><span class="n">request</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">ip</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>         <span class="k">return</span> <span class="nf">ToResponse</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">HttpStatusCode</span><span class="p">.</span><span class="n">Forbidden</span><span class="p">,</span> <span class="s">&quot;The client ip couldn&#39;t be found&quot;</span><span class="p">);</span>
</span><span class='line'>       <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>       <span class="k">if</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="n">repository</span><span class="p">.</span><span class="n">Increment</span><span class="p">(</span><span class="n">DateTime</span><span class="p">.</span><span class="n">Now</span><span class="p">.</span><span class="n">Hour</span><span class="p">,</span> <span class="n">ip</span><span class="p">)</span> <span class="p">&gt;</span> <span class="k">this</span><span class="p">.</span><span class="n">maxRequestsHour</span><span class="p">)</span>
</span><span class='line'>       <span class="p">{</span>
</span><span class='line'>          <span class="k">return</span> <span class="nf">ToResponse</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">HttpStatusCode</span><span class="p">.</span><span class="n">Forbidden</span><span class="p">,</span> <span class="s">&quot;Quota exceeded&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>       <span class="k">return</span> <span class="k">base</span><span class="p">.</span><span class="n">SendAsync</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">cancellationToken</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">private</span> <span class="kt">string</span> <span class="nf">GetClientIp</span><span class="p">(</span><span class="n">HttpRequestMessage</span> <span class="n">request</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>     <span class="k">if</span> <span class="p">(</span><span class="n">request</span><span class="p">.</span><span class="n">Properties</span><span class="p">.</span><span class="n">ContainsKey</span><span class="p">(</span><span class="s">&quot;MS_HttpContext&quot;</span><span class="p">))</span>
</span><span class='line'>     <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">((</span><span class="n">HttpContextWrapper</span><span class="p">)</span><span class="n">request</span><span class="p">.</span><span class="n">Properties</span><span class="p">[</span><span class="s">&quot;MS_HttpContext&quot;</span><span class="p">]).</span><span class="n">Request</span><span class="p">.</span><span class="n">UserHostAddress</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>     <span class="k">else</span> <span class="nf">if</span> <span class="p">(</span><span class="n">request</span><span class="p">.</span><span class="n">Properties</span><span class="p">.</span><span class="n">ContainsKey</span><span class="p">(</span><span class="n">RemoteEndpointMessageProperty</span><span class="p">.</span><span class="n">Name</span><span class="p">))</span>
</span><span class='line'>     <span class="p">{</span>
</span><span class='line'>        <span class="n">RemoteEndpointMessageProperty</span> <span class="n">prop</span><span class="p">;</span>
</span><span class='line'>        <span class="n">prop</span> <span class="p">=</span> <span class="p">(</span><span class="n">RemoteEndpointMessageProperty</span><span class="p">)</span><span class="n">request</span><span class="p">.</span><span class="n">Properties</span><span class="p">[</span><span class="n">RemoteEndpointMessageProperty</span><span class="p">.</span><span class="n">Name</span><span class="p">];</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">prop</span><span class="p">.</span><span class="n">Address</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>          <span class="k">return</span> <span class="k">null</span><span class="p">;</span>
</span><span class='line'>       <span class="p">}</span>
</span><span class='line'>   <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="k">private</span> <span class="k">static</span> <span class="n">Task</span><span class="p">&lt;</span><span class="n">HttpResponseMessage</span><span class="p">&gt;</span> <span class="n">ToResponse</span><span class="p">(</span><span class="n">HttpRequestMessage</span> <span class="n">request</span><span class="p">,</span> <span class="n">HttpStatusCode</span> <span class="n">code</span><span class="p">,</span> <span class="kt">string</span> <span class="n">message</span><span class="p">)</span>
</span><span class='line'>   <span class="p">{</span>
</span><span class='line'>       <span class="kt">var</span> <span class="n">tsc</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TaskCompletionSource</span><span class="p">&lt;</span><span class="n">HttpResponseMessage</span><span class="p">&gt;();</span>
</span><span class='line'>
</span><span class='line'>       <span class="kt">var</span> <span class="n">response</span> <span class="p">=</span> <span class="n">request</span><span class="p">.</span><span class="n">CreateResponse</span><span class="p">(</span><span class="n">code</span><span class="p">);</span>
</span><span class='line'>       <span class="n">response</span><span class="p">.</span><span class="n">ReasonPhrase</span> <span class="p">=</span> <span class="n">message</span><span class="p">;</span>
</span><span class='line'>       <span class="n">response</span><span class="p">.</span><span class="n">Content</span> <span class="p">=</span> <span class="k">new</span> <span class="n">StringContent</span><span class="p">(</span><span class="n">message</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>       <span class="n">tsc</span><span class="p">.</span><span class="n">SetResult</span><span class="p">(</span><span class="n">response</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="n">tsc</span><span class="p">.</span><span class="n">Task</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This handler uses a repository to store the number of calls with a given
IP in one hour. If the number of requests per hour exceeds the quota, an
error response is returned to the client.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Authentication in Web APIs. Keys, OAuth or HMAC]]></title>
    <link href="http://cibrax.me/blog/2013/05/21/authentication-in-web-apis-keys-oauth-or-hmac/"/>
    <updated>2013-05-21T00:00:00-03:00</updated>
    <id>http://cibrax.me/blog/2013/05/21/authentication-in-web-apis-keys-oauth-or-hmac</id>
    <content type="html"><![CDATA[<p>Most of the Web APIs available out there in the web nowadays use some
kind of authentication for identifying client applications. Although
they implement authentication in different ways, they can be typically
categorized in three main groups, services that use Keys, OAuth or HMAC.</p>

<p>Keys is the first scenario and probably the simplest one. Every client
application is identified with a simple and fixed application key. This
authentication mechanism is perhaps a bit weak, but the data that the
service has to offer is not sensitive at all. The data is available for
everyone with a key, and it’s pretty much used for public services such
as Google maps or a search for public pictures in Instagram for example.
The only purpose of the key is to identify clients and apply different
SLA (service level agreements) such as api quotas, availability, etc.</p>

<p>HMAC is typically used for consuming sensitive data that is only
consumed by his owner and not shared with anyone else. This kind of
authentication is typically used in multitenant applications, where a
tenant is the owner of the data. This model fits real well with cloud
computing where a vendor such as AWS or Windows Azure use a key for
identifying the tenant and provide the right services and private data.
No matter which client application is used to consume the services and
data, the main purpose of the key is to identify the tenant. Hawk is new
specification born in this area to standardize how HMAC
authentication.  </p>

<p>OAuth is last one and probably the most complicated one. It was born
with the idea of delegating authorization in the web 2.0. The service
who owns the data can use OAuth to share that data with other services
or applications without compromising the owner credentials.</p>

<p>The analogy given by Eran Hammer Lahav in this post &ldquo;<a href="http://www.hueniverse.com/hueniverse/2007/09/explaining-oaut.html">Explaining
OAuth</a>&rdquo;
is very close to what the specification tries to address,</p>

<p><em>&ldquo;Many luxury cars today come with a valet key. It is a special key you
give the parking attendant and unlike your regular key, will not allow
the car to drive more than a mile or two. Some valet keys will not open
the trunk, while others will block access to your onboard cell phone
address book. Regardless of what restrictions the valet key imposes, the
idea is very clever. You give someone limited access to your car with a
special key, while using another key to unlock everything else.&rdquo;</em></p>

<p>This kind of authentication makes a lot of sense in social media
services like Twitter, Facebook, Windows Live or Google to name a few,
where the service owns some private data like contacts or pictures that
can shared with other applications without putting the user credentials
into risk.</p>

<p>OAuth assigns a key to every different client application allowed to
consume the data, so the access can easily be revoked by disabling the
key associated that client application.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Giving temporary access to your ASP.NET Web API with Hawk]]></title>
    <link href="http://cibrax.me/blog/2013/03/08/giving-temporary-access-to-your-asp-net-web-api-with-hawk/"/>
    <updated>2013-03-08T00:00:00-03:00</updated>
    <id>http://cibrax.me/blog/2013/03/08/giving-temporary-access-to-your-asp-net-web-api-with-hawk</id>
    <content type="html"><![CDATA[<p>One of the features supported by Hawk, an HTTP authentication protocol
based on HMAC, is to provide read-only access to a Web API for a short
period time.  That’s performed through a token called “bewit” that a Web
API can provide to a client. That token is only valid for Http GET calls
and it can be used for a limited period of time.</p>

<p>I already implemented this feature in my <a href="https://github.com/pcibraro/hawknet">Hawk port for
.NET</a>. A bewit token can be
generated as it is shown below,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="kt">var</span> <span class="n">credential</span> <span class="p">=</span> <span class="k">new</span> <span class="n">HawkCredential</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>     <span class="n">Id</span> <span class="p">=</span> <span class="s">&quot;dh37fgj492je&quot;</span><span class="p">,</span>
</span><span class='line'>     <span class="n">Key</span> <span class="p">=</span> <span class="s">&quot;werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn&quot;</span><span class="p">,</span>
</span><span class='line'>     <span class="n">Algorithm</span> <span class="p">=</span> <span class="s">&quot;hmacsha256&quot;</span><span class="p">,</span>
</span><span class='line'>     <span class="n">User</span> <span class="p">=</span> <span class="s">&quot;steve&quot;</span>
</span><span class='line'> <span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="kt">var</span> <span class="n">bewit</span> <span class="p">=</span> <span class="n">Hawk</span><span class="p">.</span><span class="n">GetBewit</span><span class="p">(</span><span class="s">&quot;localhost&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="k">new</span> <span class="nf">Uri</span><span class="p">(</span><span class="s">&quot;http://localhost:8091/Api/HelloWorld&quot;</span><span class="p">),</span>
</span><span class='line'>  <span class="n">credential</span><span class="p">,</span>
</span><span class='line'>  <span class="m">60000</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The GetBewit method expects the following arguments,</p>

<ul>
<li>The host name</li>
<li>The complete request URI</li>
<li>The Hawk credentials with information about the key and algorithm to
use</li>
<li>A time-to-live setting in seconds for the token</li>
</ul>


<p>That token is an string representation that you can add as a additional
query string in the Web API call.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">new</span> <span class="nf">HttpRequestMessage</span><span class="p">(</span><span class="n">HttpMethod</span><span class="p">.</span><span class="n">Get</span><span class="p">,</span>
</span><span class='line'>  <span class="s">&quot;http://localhost:8091/Api/HelloWorld?bewit=&quot;</span> <span class="p">+</span> <span class="n">bewit</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>In that way, you can share a link to your Web API with a limited access
for a period of time to someone without having to share any security
credentials.</p>

<p>On the service side is as simple as configuring the HawkMessageHandler
as part of the Web API configuration,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="kt">var</span> <span class="n">handler</span> <span class="p">=</span> <span class="k">new</span> <span class="n">HawkMessageHandler</span><span class="p">((</span><span class="n">id</span><span class="p">)</span> <span class="p">=&gt;</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>     <span class="k">return</span> <span class="k">new</span> <span class="n">HawkCredential</span>
</span><span class='line'>     <span class="p">{</span>
</span><span class='line'>           <span class="n">Id</span> <span class="p">=</span> <span class="n">id</span><span class="p">,</span>
</span><span class='line'>           <span class="n">Key</span> <span class="p">=</span> <span class="s">&quot;werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn&quot;</span><span class="p">,</span>
</span><span class='line'>           <span class="n">Algorithm</span> <span class="p">=</span> <span class="s">&quot;hmacsha256&quot;</span><span class="p">,</span>
</span><span class='line'>           <span class="n">User</span> <span class="p">=</span> <span class="s">&quot;steve&quot;</span>
</span><span class='line'>       <span class="p">};</span>
</span><span class='line'> <span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="n">config</span><span class="p">.</span><span class="n">MessageHandlers</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">handler</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The handler will automatically detect a bewit token in the query string,
and it will performed all the required validations.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ASP.NET Web API Logging and Troubleshooting]]></title>
    <link href="http://cibrax.me/blog/2013/03/01/asp-net-web-api-logging-and-troubleshooting/"/>
    <updated>2013-03-01T00:00:00-03:00</updated>
    <id>http://cibrax.me/blog/2013/03/01/asp-net-web-api-logging-and-troubleshooting</id>
    <content type="html"><![CDATA[<p>ASP.NET ships with two built-in mechanisms for doing logging and
troubleshooting.  Chasing errors without knowing these two mechanisms
might be a daunting task, specially if they happen in the runtime
pipeline much before a message gets to a handler or a controller.</p>

<p>The first mechanism is the error policy. You can configure the error
policy preferences as part of the configuration object
(HttpConfiguration) in the IncludeErrorDetailPolicy property. This is
just an enum that instructs Web API about how to deal with exceptions.</p>

<p>The possible values for this enum are,</p>

<ul>
<li>Default: It’s uses the customErrors configuration settings if you
are using ASP.NET as host or LocalOnly for self-host.</li>
<li>LocalOnly: Only includes error details for local requests</li>
<li>Always: Always includes error details</li>
<li>Never: Never includes error details</li>
</ul>


<p>When an exception happens, Web API will check the value on this setting
for including details about the exception in the response message or
not. For example, if Always is enabled, Web API will serialize the
exception details as part of the message that you get as response.</p>

<p>The second mechanism is Tracing. Tracing is a service that you can
inject as part of the configuration object as well. The default
implementation does do anything.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Register</span><span class="p">(</span><span class="n">HttpConfiguration</span> <span class="n">config</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">config</span><span class="p">.</span><span class="n">Services</span><span class="p">.</span><span class="n">Replace</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">ITraceWriter</span><span class="p">),</span> <span class="k">new</span> <span class="n">MyTracer</span><span class="p">());</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>MyTracer is a custom implementation of the ITraceWriter service, which
Web API uses for tracing purposes. This is a general tracing mechanism,
so Web API will call it for logging everything and not just errors.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">MyTracer</span> <span class="p">:</span> <span class="n">ITraceWriter</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">void</span> <span class="nf">Trace</span><span class="p">(</span><span class="n">HttpRequestMessage</span> <span class="n">request</span><span class="p">,</span> <span class="kt">string</span> <span class="n">category</span><span class="p">,</span> <span class="n">TraceLevel</span> <span class="n">level</span><span class="p">,</span>
</span><span class='line'>        <span class="n">Action</span><span class="p">&lt;</span><span class="n">TraceRecord</span><span class="p">&gt;</span> <span class="n">traceAction</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">TraceRecord</span> <span class="n">rec</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TraceRecord</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">category</span><span class="p">,</span> <span class="n">level</span><span class="p">);</span>
</span><span class='line'>        <span class="n">traceAction</span><span class="p">(</span><span class="n">rec</span><span class="p">);</span>
</span><span class='line'>        <span class="n">WriteTrace</span><span class="p">(</span><span class="n">rec</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">protected</span> <span class="k">void</span> <span class="nf">WriteTrace</span><span class="p">(</span><span class="n">TraceRecord</span> <span class="n">rec</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">message</span> <span class="p">=</span> <span class="kt">string</span><span class="p">.</span><span class="n">Format</span><span class="p">(</span><span class="s">&quot;{0};{1};{2}&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="n">rec</span><span class="p">.</span><span class="n">Operator</span><span class="p">,</span> <span class="n">rec</span><span class="p">.</span><span class="n">Operation</span><span class="p">,</span> <span class="n">rec</span><span class="p">.</span><span class="n">Message</span><span class="p">);</span>
</span><span class='line'>        <span class="n">System</span><span class="p">.</span><span class="n">Diagnostics</span><span class="p">.</span><span class="n">Trace</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">rec</span><span class="p">.</span><span class="n">Category</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>If any of these two work for you, you can still use an Error Filter. 
Tugberk has written a blog post about how to integrate ELMAH with an
Error Filter in Web API
<a href="http://www.tugberkugurlu.com/archive/asp-net-web-api-and-elmah-integration">here</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Message Handlers per Route in ASP.NET Web API]]></title>
    <link href="http://cibrax.me/blog/2013/02/25/message-handlers-per-route-in-asp-net-web-api/"/>
    <updated>2013-02-25T00:00:00-03:00</updated>
    <id>http://cibrax.me/blog/2013/02/25/message-handlers-per-route-in-asp-net-web-api</id>
    <content type="html"><![CDATA[<p>Message Handlers are one of the core components for message processing
in Web API. They use an asynchronous model for processing messages, so
they receive a request message and returns a Task with the corresponding
response.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">protected</span> <span class="k">internal</span> <span class="k">abstract</span> <span class="n">Task</span><span class="p">&lt;</span><span class="n">HttpResponseMessage</span><span class="p">&gt;</span> <span class="n">SendAsync</span><span class="p">(</span><span class="n">HttpRequestMessage</span> <span class="n">request</span><span class="p">,</span>
</span><span class='line'> <span class="n">CancellationToken</span> <span class="n">cancellationToken</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>In most cases, a message handler does something and delegates some other
work to the rest of the handlers configured in the pipeline. For
example, a handler for security checks the Auth Http header, and
delegates the call the handlers configured out of the box by Web API,
which eventually will call a controller method. The framework also
provides a base class to make delegation implicit, DelegatingHandler,
which receives the next handler to call as part of the constructor.</p>

<p>The following example shows a message handler implementation for basic
authentication,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">BasicAuthHandler</span> <span class="p">:</span> <span class="n">DelegatingHandler</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>   <span class="n">Func</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="kt">string</span><span class="p">,</span> <span class="n">IPrincipal</span><span class="p">&gt;</span> <span class="n">auth</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>   <span class="k">public</span> <span class="nf">BasicAuthHandler</span><span class="p">(</span><span class="n">HttpMessageHandler</span> <span class="n">innerHandler</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="kt">string</span><span class="p">,</span> <span class="n">IPrincipal</span><span class="p">&gt;</span> <span class="n">auth</span><span class="p">)</span>
</span><span class='line'>       <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="n">innerHandler</span><span class="p">)</span>
</span><span class='line'>   <span class="p">{</span>
</span><span class='line'>       <span class="k">this</span><span class="p">.</span><span class="n">auth</span> <span class="p">=</span> <span class="n">auth</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">protected</span> <span class="k">override</span> <span class="n">System</span><span class="p">.</span><span class="n">Threading</span><span class="p">.</span><span class="n">Tasks</span><span class="p">.</span><span class="n">Task</span><span class="p">&lt;</span><span class="n">HttpResponseMessage</span><span class="p">&gt;</span> <span class="n">SendAsync</span><span class="p">(</span><span class="n">HttpRequestMessage</span> <span class="n">request</span><span class="p">,</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="n">System</span><span class="p">.</span><span class="n">Threading</span><span class="p">.</span><span class="n">CancellationToken</span> <span class="n">cancellationToken</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>         <span class="k">if</span> <span class="p">(</span><span class="n">request</span><span class="p">.</span><span class="n">Headers</span><span class="p">.</span><span class="n">Authorization</span> <span class="p">!=</span> <span class="k">null</span> <span class="p">&amp;&amp;</span>
</span><span class='line'>             <span class="p">!</span><span class="kt">string</span><span class="p">.</span><span class="n">Equals</span><span class="p">(</span><span class="n">request</span><span class="p">.</span><span class="n">Headers</span><span class="p">.</span><span class="n">Authorization</span><span class="p">.</span><span class="n">Scheme</span><span class="p">,</span> <span class="s">&quot;basic&quot;</span><span class="p">,</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="n">StringComparison</span><span class="p">.</span><span class="n">InvariantCultureIgnoreCase</span><span class="p">))</span>
</span><span class='line'>         <span class="p">{</span>
</span><span class='line'>              <span class="k">return</span> <span class="k">base</span><span class="p">.</span><span class="n">SendAsync</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">cancellationToken</span><span class="p">);</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="n">request</span><span class="p">.</span><span class="n">Headers</span><span class="p">.</span><span class="n">Authorization</span> <span class="p">==</span> <span class="k">null</span> <span class="p">||</span>
</span><span class='line'>              <span class="kt">string</span><span class="p">.</span><span class="n">IsNullOrWhiteSpace</span><span class="p">(</span><span class="n">request</span><span class="p">.</span><span class="n">Headers</span><span class="p">.</span><span class="n">Authorization</span><span class="p">.</span><span class="n">Scheme</span><span class="p">))</span>
</span><span class='line'>          <span class="p">{</span>
</span><span class='line'>              <span class="k">return</span> <span class="nf">ChallengeResponse</span><span class="p">(</span><span class="n">request</span><span class="p">);</span>
</span><span class='line'>           <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>          <span class="kt">var</span> <span class="n">authToken</span> <span class="p">=</span> <span class="n">request</span><span class="p">.</span><span class="n">Headers</span><span class="p">.</span><span class="n">Authorization</span><span class="p">.</span><span class="n">Parameter</span><span class="p">;</span>
</span><span class='line'>          <span class="kt">var</span> <span class="n">decodedToken</span> <span class="p">=</span> <span class="n">Encoding</span><span class="p">.</span><span class="n">UTF8</span><span class="p">.</span><span class="n">GetString</span><span class="p">(</span><span class="n">Convert</span><span class="p">.</span><span class="n">FromBase64String</span><span class="p">(</span><span class="n">authToken</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>          <span class="kt">var</span> <span class="n">username</span> <span class="p">=</span> <span class="n">decodedToken</span><span class="p">.</span><span class="n">Substring</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="n">decodedToken</span><span class="p">.</span><span class="n">IndexOf</span><span class="p">(</span><span class="s">&quot;:&quot;</span><span class="p">));</span>
</span><span class='line'>          <span class="kt">var</span> <span class="n">password</span> <span class="p">=</span> <span class="n">decodedToken</span><span class="p">.</span><span class="n">Substring</span><span class="p">(</span><span class="n">decodedToken</span><span class="p">.</span><span class="n">IndexOf</span><span class="p">(</span><span class="s">&quot;:&quot;</span><span class="p">)</span> <span class="p">+</span> <span class="m">1</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>          <span class="kt">var</span> <span class="n">principal</span> <span class="p">=</span> <span class="k">this</span><span class="p">.</span><span class="n">auth</span><span class="p">(</span><span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="n">principal</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span>
</span><span class='line'>          <span class="p">{</span>
</span><span class='line'>              <span class="k">return</span> <span class="nf">ToResponse</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">HttpStatusCode</span><span class="p">.</span><span class="n">Unauthorized</span><span class="p">,</span> <span class="s">&quot;Invalid credentials&quot;</span><span class="p">);</span>
</span><span class='line'>           <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>          <span class="n">Thread</span><span class="p">.</span><span class="n">CurrentPrincipal</span> <span class="p">=</span> <span class="n">principal</span><span class="p">;</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="n">HttpContext</span><span class="p">.</span><span class="n">Current</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
</span><span class='line'>             <span class="n">HttpContext</span><span class="p">.</span><span class="n">Current</span><span class="p">.</span><span class="n">User</span> <span class="p">=</span> <span class="n">principal</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>          <span class="k">return</span> <span class="k">base</span><span class="p">.</span><span class="n">SendAsync</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">cancellationToken</span><span class="p">);</span>
</span><span class='line'>   <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="k">private</span> <span class="k">static</span> <span class="n">Task</span><span class="p">&lt;</span><span class="n">HttpResponseMessage</span><span class="p">&gt;</span> <span class="n">ChallengeResponse</span><span class="p">(</span><span class="n">HttpRequestMessage</span> <span class="n">request</span><span class="p">)</span>
</span><span class='line'>   <span class="p">{</span>
</span><span class='line'>       <span class="kt">var</span> <span class="n">tsc</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TaskCompletionSource</span><span class="p">&lt;</span><span class="n">HttpResponseMessage</span><span class="p">&gt;();</span>
</span><span class='line'>
</span><span class='line'>       <span class="kt">var</span> <span class="n">response</span> <span class="p">=</span> <span class="n">request</span><span class="p">.</span><span class="n">CreateResponse</span><span class="p">(</span><span class="n">HttpStatusCode</span><span class="p">.</span><span class="n">Unauthorized</span><span class="p">);</span>
</span><span class='line'>        <span class="n">response</span><span class="p">.</span><span class="n">Headers</span><span class="p">.</span><span class="n">WwwAuthenticate</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">AuthenticationHeaderValue</span><span class="p">(</span><span class="s">&quot;basic&quot;</span><span class="p">,</span> <span class="s">&quot;realm=localhost&quot;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>       <span class="n">tsc</span><span class="p">.</span><span class="n">SetResult</span><span class="p">(</span><span class="n">response</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>       <span class="k">return</span> <span class="n">tsc</span><span class="p">.</span><span class="n">Task</span><span class="p">;</span>
</span><span class='line'>     <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>     <span class="k">private</span> <span class="k">static</span> <span class="n">Task</span><span class="p">&lt;</span><span class="n">HttpResponseMessage</span><span class="p">&gt;</span> <span class="n">ToResponse</span><span class="p">(</span><span class="n">HttpRequestMessage</span> <span class="n">request</span><span class="p">,</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="n">HttpStatusCode</span> <span class="n">code</span><span class="p">,</span> <span class="kt">string</span> <span class="n">message</span><span class="p">)</span>
</span><span class='line'>     <span class="p">{</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">tsc</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TaskCompletionSource</span><span class="p">&lt;</span><span class="n">HttpResponseMessage</span><span class="p">&gt;();</span>
</span><span class='line'>
</span><span class='line'>         <span class="kt">var</span> <span class="n">response</span> <span class="p">=</span> <span class="n">request</span><span class="p">.</span><span class="n">CreateResponse</span><span class="p">(</span><span class="n">code</span><span class="p">);</span>
</span><span class='line'>         <span class="n">response</span><span class="p">.</span><span class="n">ReasonPhrase</span> <span class="p">=</span> <span class="n">message</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>         <span class="n">tsc</span><span class="p">.</span><span class="n">SetResult</span><span class="p">(</span><span class="n">response</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>         <span class="k">return</span> <span class="n">tsc</span><span class="p">.</span><span class="n">Task</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>A good thing about Message Handler is that you can configure them
globally or per route. In this case, if you want to enable basic
authentication for some routes only, it’s a matter of configuring this
handler in the routes you want to have protected.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="n">config</span><span class="p">.</span><span class="n">Routes</span><span class="p">.</span><span class="n">MapHttpRoute</span><span class="p">(</span>
</span><span class='line'>   <span class="s">&quot;BasicAuth&quot;</span><span class="p">,</span>
</span><span class='line'>   <span class="s">&quot;MyController&quot;</span><span class="p">,</span>
</span><span class='line'>   <span class="k">new</span> <span class="p">{</span> <span class="n">controller</span> <span class="p">=</span> <span class="s">&quot;MyController&quot;</span> <span class="p">},</span>
</span><span class='line'>   <span class="k">null</span><span class="p">,</span>
</span><span class='line'>   <span class="k">new</span> <span class="nf">BasicAuthHandler</span><span class="p">(</span><span class="k">new</span> <span class="n">HttpControllerDispatcher</span><span class="p">(</span><span class="n">config</span><span class="p">),</span> <span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">p</span><span class="p">)</span> <span class="p">=&gt;</span>
</span><span class='line'>   <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="k">new</span> <span class="nf">GenericPrincipal</span><span class="p">(</span><span class="k">new</span> <span class="n">GenericIdentity</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="k">new</span> <span class="kt">string</span><span class="p">[]</span> <span class="p">{}));</span>
</span><span class='line'>   <span class="p">}));</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, the Inner Handler is a built-in handler provided by Web
API, HttpControllerDispatcher, which does all the magic for processing
the request and pass it over to the controller action. You can also
inject any other dependency as part of the constructor. One thing to
consider is that message handlers are singleton if you configure them
this way, so make sure to inject the dependencies in the right way for
avoiding memory leaks (If you have to use a repository for example, you
might want to inject a factory or pass a delegate for resolving the
dependencies from a DI container).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Multitenant domain routing with AWS Route 53]]></title>
    <link href="http://cibrax.me/blog/2013/02/12/multitenant-domain-routing-with-aws-route-53/"/>
    <updated>2013-02-12T00:00:00-03:00</updated>
    <id>http://cibrax.me/blog/2013/02/12/multitenant-domain-routing-with-aws-route-53</id>
    <content type="html"><![CDATA[<p>A common requirement in SaaS applications is the ability to route
requests to different tenants based on a URL routing strategy.</p>

<p>In most cases, a domain prefix is good enough to identify tenants (e.g.
mytenant.xxxxx.com). That approach typically relies on CName records for
mapping the prefixes or tenants and the domain name to an URL where the
application is actually hosted. Many cloud providers support the idea of
mapping custom domains to their web hosted services, so this approach
with CName works just fine.</p>

<p>An evident problem is that you would require a different CName record
per prefix or tenant. If you have to create those records manually, this
approach simply does not scale as the number of tenants increase.</p>

<p>An alternative is to use a wildcard CName, and route all the requests
that match that wildcard to the hosted application in the cloud. For
example, *.xxxxxx.com to your web application url.</p>

<p>Many DNS servers don’t support wildcards in CName such as the ones
offered by free for GoDaddy or NameCheap. However, AWS Route 53 supports
wildcards and also an API to manage almost everything in the DNS tables.</p>

<p>Configuring AWS Route 53 is relatively easy. Assuming that you already
have a AWS account, you need to create first a hosted zone, which
represents the association of a domain name with a set of name servers
provided by Route 53. Once you specified the domain name (e.g
cibrax.me), and the hosted zone is created. Route53 will show you a list
of name servers you need to use. If you already own a domain in other
place like GoDaddy or NameCheap, you need to go there and update the
list of name servers associated to that domain.</p>

<p>Afterwards, you need to create a resource record set, which is basically
the CName record containing the wildcard or prefix you want to use.
Here, you can specify the CNAme record and the mapped URL. For example,
*.cibrax.me goes to <a href="http://www.xxxxxxxx.com">www.xxxxxxxx.com</a>.</p>

<p>That’s all from the point of view of DNS configuration. The rest is part
of the implementation of your web application.</p>
]]></content>
  </entry>
  
</feed>
