<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">STSeverin&amp;#39;s blog</title><subtitle type="html">A blog about federated identity and identity management</subtitle><id>http://blogs.msdn.com/b/stseverin/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/stseverin/" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/b/stseverin/atom.aspx" /><generator uri="http://telligent.com" version="5.6.50428.7875">Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><updated>2012-12-29T22:09:00Z</updated><entry><title>Just a simple integration test for AAL and the JWT Handler</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/stseverin/archive/2013/03/26/integration-test-for-aal-and-the-jwt-handler.aspx" /><id>http://blogs.msdn.com/b/stseverin/archive/2013/03/26/integration-test-for-aal-and-the-jwt-handler.aspx</id><published>2013-03-26T13:00:00Z</published><updated>2013-03-26T13:00:00Z</updated><content type="html">&lt;p&gt;Here I’ll do my best to create a simple integration test involving the Windows Azure Authentication Library Beta on the client side and the JWT Handler (or if you prefer the full name, JSON Web Token Handler For the Microsoft .Net Framework 4.5, Developer Preview) on the service side. While I could’ve mocked the communication with Windows Azure Active Directory Preview , I decided not to do it in this post as it gives a bit of meat to the story. Rather than explaining all the bits and pieces, which is being done extensively as I write, for example &lt;a href="http://technet.microsoft.com/library/en-us/hh967619"&gt;here&lt;/a&gt; on Windows Azure Active Directory, &lt;a href="http://www.cloudidentity.com/blog/2012/11/20/introducing-the-developer-preview-of-the-json-web-token-handler-for-the-microsoft-net-framework-4-5-2/"&gt;here&lt;/a&gt; on JWT Handler and &lt;a href="http://msdn.microsoft.com/en-us/library/jj573266"&gt;here&lt;/a&gt; about Windows Azure Authentication Library, I’ll go straight to work with a step-by-step tutorial. Bare in mind that this is neither a post on how to write effective integration tests, nor is it about TDD. Also be aware that it is based on preview libraries.&lt;/p&gt;  &lt;p&gt;The idea here is that the integration test client mimics some sort of a server-side client application that consumes a REST API, both registered as Service Principals within the same AAD tenant. Let’s say for example that the client application is a long-running server-side process that are polling an API for changes, as described in this &lt;a href="http://http://code.msdn.microsoft.com/AAL-Server-to-Server-9aafccc1"&gt;example&lt;/a&gt; (which inspired me to write this post). The API only allows access to requests that can present an OAuth2 bearer token that can be properly validated. So before the client can successfully make an API call it needs to aquire an access token from &lt;a href="http://msdn.microsoft.com/en-us/library/hh147631.aspx"&gt;ACS&lt;/a&gt;, which it does by utilizing the AAL. The client then adds the aquired token to the HTTP request’s authorization header before making the call. The functionality under test here is the token validation part, or rather how we enable the token validation taking place. &lt;/p&gt;  &lt;p&gt;So here it goes:&lt;/p&gt; &lt;strong&gt;Create a Windows Azure AD tenant&lt;/strong&gt;: &lt;a title="https://activedirectory.windowsazure.com/Signup/QuickSignup.aspx?ru=https://activedirectory.windowsazure.com/default.aspx&amp;amp;culture=en-us&amp;amp;ali=1" href="https://activedirectory.windowsazure.com/Signup/QuickSignup.aspx?ru=https://activedirectory.windowsazure.com/default.aspx&amp;amp;culture=en-us&amp;amp;ali=1"&gt;here&lt;/a&gt; Get the Powershell CmdLets that we’ll need:&amp;#160; &lt;br /&gt;64-bit: &lt;a title="http://go.microsoft.com/fwlink/p/?linkid=236297" href="http://go.microsoft.com/fwlink/p/?linkid=236297"&gt;http://go.microsoft.com/fwlink/p/?linkid=236297&lt;/a&gt;   &lt;br /&gt;32-bit: &lt;a title="http://go.microsoft.com/fwlink/p/?linkid=236298" href="http://go.microsoft.com/fwlink/p/?linkid=236298"&gt;http://go.microsoft.com/fwlink/p/?linkid=236298&lt;/a&gt;&amp;#160; &lt;p&gt;&lt;strong&gt;Start Visual Studio 2012&lt;/strong&gt; and create a new unit test project, targeting .NET Framework 4.5. In this tutorial I chose to use MS-Test.     &lt;br /&gt;You may call the solution and project whatever you like.     &lt;br /&gt;&lt;strong&gt;     &lt;br /&gt;Add Nuget packages for&lt;/strong&gt;     &lt;br /&gt;Microsoft.IdentityModel.Tokens.JWT     &lt;br /&gt;Microsoft.WindowsAzure.ActiveDirectory.Authentication     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Add a reference to      &lt;br /&gt;&lt;/strong&gt;System.IdentityModel     &lt;br /&gt;System.Net.Http     &lt;br /&gt;System.Web.Http     &lt;br /&gt;System.Windows.Forms (needed because we’ll make use of the AssertionCredential class (part of Windows.Azure.ActiveDirectory.Authentication)     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Add an app.config file&lt;/strong&gt; to the project and replace with the following content. Notice all the placeholder values that we will fill on the way:&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a9b47968-2519-4328-9fb9-4592b182bf95" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;xml&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000"&gt;version&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;=&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;1.0&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000"&gt;encoding&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;=&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;utf-8&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; ?&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;configuration&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;appSettings&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;add&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000"&gt;key&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;=&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;Audiences&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000"&gt;value&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;=&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;service/localhost@PLACEHOLDER_FOR_TENANT_ID&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;add&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000"&gt;key&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;=&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;Issuers&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000"&gt;value&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;=&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;00000001-0000-0000-c000-000000000000@PLACEHOLDER_FOR_TENANT_ID,https://sts.windows.net/PLACEHOLDER_FOR_TENANT_ID&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;add&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000"&gt;key&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;=&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;ClientSymmetricKey&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000"&gt;value&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;=&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;PLACEHOLDER_FOR_CLIENT_SYMMETRIC_KEY&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;add&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000"&gt;key&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;=&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;ServiceSymmetricKey&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000"&gt;value&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;=&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;PLACEHOLDER_FOR_SERVICE_SYMMETRIC_KEY&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;add&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000"&gt;key&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;=&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;Tenant&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000"&gt;value&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;=&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;https://accounts.accesscontrol.windows.net/PLACEHOLDER_FOR_TENANT_ID&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;add&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000"&gt;key&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;=&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;ServiceRealm&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000"&gt;value&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;=&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;service/localhost@PLACEHOLDER_FOR_TENANT_ID&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;add&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000"&gt;key&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;=&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;Resource&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000"&gt;value&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;=&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;IntegrationTestClient/localhost@PLACEHOLDER_FOR_TENANT_ID&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;appSettings&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;configuration&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;   &lt;br /&gt;Save and compile the project!     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Switch over to Powershell or Powershell ISE&lt;/strong&gt;, and run&amp;#160; &lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ce0ea775-7a4c-4e92-b30e-20ec206502d9" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#5f9ea0"&gt;Import-Module&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800000"&gt;msonline&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#5f9ea0"&gt;-Force&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#5f9ea0"&gt;Import-Module&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800000"&gt;msonlineextended&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#5f9ea0"&gt;-Force&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#008000"&gt;#When prompted for credentials, login with the same account you used when creating the tenant&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#5f9ea0"&gt;Connect-MsolService&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;If you successfully signed in with the tenant administrator credentials, you will have full access to your tenant from within the Powershell host.    &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Provision the REST service; &lt;/strong&gt;i.e. register it as a Service Principal within your tenant.&lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2b13485d-05ac-49fe-8527-33f6614e4fff" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;   &lt;span style="color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#5f9ea0"&gt;New-MsolServicePrincipal&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#5f9ea0"&gt;-ServicePrincipalNames&lt;/span&gt;&lt;span style="color:#000000"&gt; @(&lt;/span&gt;&lt;span style="color:#800000"&gt;&amp;quot;service/localhost&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;) &lt;/span&gt;&lt;span style="color:#5f9ea0"&gt;DisplayName&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800000"&gt;&amp;quot;Service&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#5f9ea0"&gt;-Usage&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800000"&gt;Sign&lt;/span&gt;&lt;/li&gt; &lt;li&gt;   &lt;span style="color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;In the App.config file, replace PLACEHOLDER_FOR_SERVICE_SYMMETRIC_KEY with the symmetric key that was returned.&lt;/p&gt; &lt;strong&gt;   &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Provision the integration test client&lt;/p&gt;    &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:633cfc56-d487-4077-8f16-81fc2178f643" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;     &lt;span style="color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#5f9ea0"&gt;New-MsolServicePrincipal&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#5f9ea0"&gt;-ServicePrincipalNames&lt;/span&gt;&lt;span style="color:#000000"&gt; @(&lt;/span&gt;&lt;span style="color:#800000"&gt;&amp;quot;IntegrationTestClient/localhost&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;) &lt;/span&gt;&lt;span style="color:#5f9ea0"&gt;-DisplayName&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800000"&gt;&amp;quot;Integration test client&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#5f9ea0"&gt;Usage&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800000"&gt;Verify&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/strong&gt;  &lt;p&gt;In the app.config file, replace PLACEHOLDER_FOR_CLIENT_SYMMETRIC_KEY with the symmetric key that was returned.&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;That’s it, we’re done with Powershell, so you may close it down.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;It is time to look up your Tenant Id. &lt;/strong&gt;All you need to accomplish this is to point your browser to the URL of your Tenant’s federation metadata; &lt;a href="https://accounts.accesscontrol.windows.net/placeholder_for_your_tenant/FederationMetadata/2007-06/FederationMetadata.xml"&gt;https://accounts.accesscontrol.windows.net/&lt;strong&gt;placeholder_for_your_tenant&lt;/strong&gt;/FederationMetadata/2007-06/FederationMetadata.xml&lt;/a&gt;     &lt;br /&gt;where placeholder_for_your_tenant usually goes something like your_tenant_name.onmicrosoft.com. Now from the page returned, copy the GUID-value inside the entityID. then jump over to the App.config file in Visual Studio and replace all six occurences of PLACEHOLDER_FOR_TENANT_ID with the copied value.     &lt;br /&gt;    &lt;br /&gt;From now on we turn all our attention to the project in Visual Studio.&lt;/p&gt;  &lt;p&gt;Without further ado, here are the raw code as it is. No effort has been made on refactoring whatsoever as I leave that to the reader.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The integration test class&lt;/strong&gt;&lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:6525800a-3d11-4466-b383-0a329b9cfe53" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Configuration;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Net;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Net.Http;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Net.Http.Headers;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Web.Http;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Microsoft.VisualStudio.TestTools.UnitTesting;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Microsoft.WindowsAzure.ActiveDirectory.Authentication;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;namespace&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; IntegrationTests&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestClass&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;When_calling_the_service&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpConfiguration&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; config;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpServer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; server;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpClient&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; client;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;AssertionCredential&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; assertionCredential;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;AuthenticationContext&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; authContext;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestInitialize&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; With_a_valid_token()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;config = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpConfiguration&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;config.Routes.MapHttpRoute(name: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Default&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                       &lt;span style="background:#ffffff;color:#000000"&gt;routeTemplate: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;api/{controller}/{action}/{id}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                       &lt;span style="background:#ffffff;color:#000000"&gt;defaults: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; { id = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;RouteParameter&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Optional });&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;config.MessageHandlers.Add(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;JWTMessageHandler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;());&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;config.MessageHandlers.Add(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;JustReturnsOkMessageHandler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;());&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;server = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpServer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(config);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;client = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpClient&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(server);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; token = AcquireToken();&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;client.DefaultRequestHeaders.Authorization = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;AuthenticationHeaderValue&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Bearer&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, token.Assertion);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestMethod&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; It_should_return_http_status_code_200()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Always use SSL with bearer tokens!&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; task = client.GetAsync(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;https://doesntmatterwhatgoesherereally&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;task.Wait();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; response = task.Result;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Assert&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.AreEqual(response.StatusCode, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpStatusCode&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.OK);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestCleanup&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; CleanUp()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;server.Dispose();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;client.Dispose();&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;AssertionCredential&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; AcquireToken()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; serviceRealm = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConfigurationManager&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.AppSettings[&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;ServiceRealm&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;];&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; resource = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConfigurationManager&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.AppSettings[&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Resource&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;];&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; symmetricKey = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConfigurationManager&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.AppSettings[&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;ClientSymmetricKey&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;];&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; credential = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;SymmetricKeyCredential&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(resource, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Convert&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.FromBase64String(symmetricKey));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;authContext = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;AuthenticationContext&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConfigurationManager&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.AppSettings[&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Tenant&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;]);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;assertionCredential = authContext.AcquireToken(serviceRealm, credential);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; assertionCredential;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;JWTMessageHandler&lt;/strong&gt;, added to the HttpConfiguration MessageHandler collection above&lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:58cb5a11-d207-4fa0-880e-540cca271178" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Collections.Generic;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Configuration;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Linq;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Net;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Net.Http;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Threading.Tasks;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;namespace&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; IntegrationTests&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;JWTMessageHandler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DelegatingHandler&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; JWTMessageHandler()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; JWTMessageHandler(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpMessageHandler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; innerHandler)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;base&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(innerHandler)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;protected&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpResponseMessage&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; SendAsync(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpRequestMessage&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; request, System.Threading.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;CancellationToken&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; cancellationToken)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; jwtHandler = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;CustomJWTHandler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;();&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; token;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (!request.TryGetToken(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;out&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; token))&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpStatusCode&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; statusCode = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpStatusCode&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Unauthorized;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpResponseMessage&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;.Factory.StartNew(() =&amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpResponseMessage&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(statusCode));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;System.Threading.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Thread&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.CurrentPrincipal = jwtHandler.ValidateToken(token);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;catch&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (System.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Exception&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpStatusCode&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; statusCode = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpStatusCode&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.BadRequest;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; httpResponseMessage = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpResponseMessage&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(statusCode);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;httpResponseMessage.ReasonPhrase = &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Something went wrong validating the token!&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpResponseMessage&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;.Factory.StartNew(() =&amp;gt; httpResponseMessage);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;base&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.SendAsync(request, cancellationToken);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;As a precaution I would also add a message handler for making sure the call is made over HTTPS, as we are dealing with bearer tokens here.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;HttpRequestMethodExtensions&lt;/strong&gt;, just for the convenience when trying to extract the token above.&lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8974ae94-0665-4bd2-a83d-fb7dc247e0ef" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Collections.Generic;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Net.Http;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Linq;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;namespace&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; IntegrationTests&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpRequestMessageExtensions&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; TryGetToken(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpRequestMessage&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; @this, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;out&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; token)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;token = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; authorizationHeaders;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (!@this.Headers.TryGetValues(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Authorization&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;out&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; authorizationHeaders) || authorizationHeaders.Count() &amp;gt; 1)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; bearer = authorizationHeaders.ElementAt(0);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;token = bearer.ToLower().StartsWith(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;bearer &amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;) ? bearer.Substring(7) : bearer;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;CustomJWTHandler&lt;/strong&gt;, wraps the call to the JWTSecurityTokenHandler, that valildates the token on line 27.&lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5f7c1eeb-ee92-4e8c-97fa-cad5e027afe6" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Collections.Generic;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Configuration;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Microsoft.IdentityModel.Tokens.JWT;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.ServiceModel.Security.Tokens;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;namespace&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; IntegrationTests&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;CustomJWTHandler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Security.Claims.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ClaimsPrincipal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ValidateToken(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; jwt)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; issuers = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;List&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; audiences = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;List&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;();&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;issuers.AddRange(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConfigurationManager&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.AppSettings[&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Issuers&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;].Split(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;[] { &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; }));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;audiences.AddRange(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConfigurationManager&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.AppSettings[&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Audiences&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;].Split(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;[] { &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; }));&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; tokenValidationParameters = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TokenValidationParameters&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;AllowedAudiences = audiences,&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;ValidIssuers = issuers,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;SigningToken = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;BinarySecretSecurityToken&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(System.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Convert&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.FromBase64String(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConfigurationManager&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.AppSettings[&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;ServiceSymmetricKey&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;])),&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;ValidateIssuer = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;ValidateNotBefore = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;ValidateExpiration = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;ValidateSignature = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;true&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;JWTSecurityTokenHandler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;().ValidateToken(jwt, tokenValidationParameters);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;JustReturnsOkMessageHandler &lt;/strong&gt;below is just a dummy message handler that returns OK.&amp;#160; As we aren’t actually hosting a real Web Api REST service in this test scenario, we would have gotten a 404 NotFound in response whenever the &lt;strong&gt;CustomJwtSecurityTokenHandler&lt;/strong&gt; class succeeds to validate the JWT token. So we add this to the MessageHandler collection as well. &lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ae10bfba-faeb-4cb5-8e63-f243a6e00493" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Net;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Net.Http;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Threading;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Threading.Tasks;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;namespace&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; IntegrationTests&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;JustReturnsOkMessageHandler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DelegatingHandler&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; JustReturnsOkMessageHandler()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; JustReturnsOkMessageHandler(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpMessageHandler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; innerHandler)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;base&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(innerHandler)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;protected&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpResponseMessage&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; SendAsync(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpRequestMessage&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; request,&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                                               &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;CancellationToken&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; cancellationToken)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;base&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.SendAsync(request, cancellationToken).ContinueWith&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpResponseMessage&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;((responseTask) =&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpResponseMessage&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; response = responseTask.Result;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;response.StatusCode = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;HttpStatusCode&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.OK;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; response;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now when all the code is in place it’s time to compile and run the integration test. All you need is an Internet connection! &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10405446" width="1" height="1"&gt;</content><author><name>StSeverin</name><uri>http://blogs.msdn.com/stefan.severin_4000_hotmail.com/ProfileUrlRedirect.ashx</uri></author><category term="Windows Azure Active Directory Developer Preview" scheme="http://blogs.msdn.com/b/stseverin/archive/tags/Windows+Azure+Active+Directory+Developer+Preview/" /><category term="Windows Azure Authentication Beta" scheme="http://blogs.msdn.com/b/stseverin/archive/tags/Windows+Azure+Authentication+Beta/" /><category term="JSON Web Token Handler For the Microsoft .Net Framework 4.5 Developer Preview" scheme="http://blogs.msdn.com/b/stseverin/archive/tags/JSON+Web+Token+Handler+For+the+Microsoft+-Net+Framework+4-5+Developer+Preview/" /></entry><entry><title>Get started with Windows Azure AD Developer Preview today!</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/stseverin/archive/2013/02/18/get-started-with-windows-azure-active-directory-developer-preview-today.aspx" /><id>http://blogs.msdn.com/b/stseverin/archive/2013/02/18/get-started-with-windows-azure-active-directory-developer-preview-today.aspx</id><published>2013-02-18T09:46:00Z</published><updated>2013-02-18T09:46:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;br /&gt;Here comes my own favorite (nonexhaustive) list of links and resources which&amp;nbsp;helped me getting my head around Windows Azure Active Directory Developer Preview.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Sign up for a Windows Azure AD Dev Preview Tenant. You'll definitely need this to get yourself started! &lt;br /&gt;&lt;a href="http://g.microsoftonline.com/0AX00sv/5"&gt;http://g.microsoftonline.com/0AX00sv/5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vittorio Bertocci's MSDN blog. In-depth blog posts, tutorials, announcements, and much more. &lt;br /&gt;All delivered with a personal and unmistakable touch. What Vittorio doesn't know on these subjects is not worth mentioning! &lt;br /&gt;&lt;a href="http://blogs.msdn.com/b/vbertocci"&gt;http://blogs.msdn.com/b/vbertocci&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Windows Azure Team Blog. Great Place for interesting blogs, videos, announcements, and more! &lt;br /&gt;&lt;a title="http://blogs.msdn.com/b/windowsazure/" href="http://blogs.msdn.com/b/windowsazure/"&gt;http://blogs.msdn.com/b/windowsazure/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Windows Azure AD Graph. All about what you can do with this new cool REST API! &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hh974476.aspx"&gt;http://msdn.microsoft.com/en-us/library/hh974476.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Windows Azure Authentication Library. Library for client application developers &lt;br /&gt;for authenticating users and aquiring access tokens etc. Downloadable as a Nuget package! &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/jj573266"&gt;http://msdn.microsoft.com/en-us/library/jj573266&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Microsoft Token Validation Extension for Microsoft .Net Framework 4.5. Takes care of the &lt;a href="http://blogs.msdn.com/b/vbertocci/archive/2012/11/20/introducing-the-developer-preview-of-the-json-web-token-handler-for-the-microsoft-net-framework-4-5.aspx"&gt;JWT handling&lt;/a&gt;. &lt;br /&gt;Easy to use both with and without WIF! &lt;br /&gt;&lt;a href="https://nuget.org/packages/System.IdentityModel.Tokens.ValidatingIssuerNameRegistry/4.5.0"&gt;https://nuget.org/packages/System.IdentityModel.Tokens.ValidatingIssuerNameRegistry/4.5.0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;SSO how-to guide. &lt;br /&gt;&lt;a href="https://www.windowsazure.com/en-us/develop/net/how-to-guides/web-sso/"&gt;https://www.windowsazure.com/en-us/develop/net/how-to-guides/web-sso/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Integrate! App developer Resources. &lt;br /&gt;&lt;a href="https://activedirectory.windowsazure.com/Develop/"&gt;https://activedirectory.windowsazure.com/Develop/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Integrating Multi-Tenant Cloud Applications! &lt;br /&gt;Tutorial &amp;amp; sample application. &lt;br /&gt;&lt;a href="http://www.windowsazure.com/en-us/develop/net/tutorials/multitenant-apps-for-active-directory/"&gt;http://www.windowsazure.com/en-us/develop/net/tutorials/multitenant-apps-for-active-directory/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Developer Code Samples. Just enter windows + azure + active + directory and hit the Search button! &lt;br /&gt;&lt;a href="http://code.msdn.microsoft.com/"&gt;http://code.msdn.microsoft.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Fabrikam Expense Tracking Application. An online demo app with links to code on GitHub. &lt;br /&gt;&lt;a href="https://aadexpensedemo.cloudapp.net/"&gt;https://aadexpensedemo.cloudapp.net/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Windows Azure AD community forum. Get social with this! &lt;br /&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en-us/WindowsAzureAD/threads"&gt;http://social.msdn.microsoft.com/Forums/en-us/WindowsAzureAD/threads&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10394785" width="1" height="1"&gt;</content><author><name>StSeverin</name><uri>http://blogs.msdn.com/stefan.severin_4000_hotmail.com/ProfileUrlRedirect.ashx</uri></author><category term="Windows Azure Active Directory Developer Preview" scheme="http://blogs.msdn.com/b/stseverin/archive/tags/Windows+Azure+Active+Directory+Developer+Preview/" /><category term="Windows Azure AD Developer Preview" scheme="http://blogs.msdn.com/b/stseverin/archive/tags/Windows+Azure+AD+Developer+Preview/" /></entry><entry><title>Exploring AD FS on Windows Server 2012, Part 3</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/stseverin/archive/2013/01/15/exploring-ad-fs-2-1-on-windows-server-2012-part-3.aspx" /><id>http://blogs.msdn.com/b/stseverin/archive/2013/01/15/exploring-ad-fs-2-1-on-windows-server-2012-part-3.aspx</id><published>2013-01-15T11:41:00Z</published><updated>2013-01-15T11:41:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In &lt;a href="http://blogs.msdn.com/b/stseverin/archive/2013/01/14/exploring-ad-fs-2-1-on-windows-server-2012-part-2.aspx" target="_blank"&gt;part two&lt;/a&gt;, we downloaded a sample ASP.NET MVC 4 application to be used as an internal RP and established a trust relationship with the federation server which in this lab plays the role of an IdP STS. In this post we will make the final changes to the AD FS configuration and the RP so that it will retrieve the claims that it relies on, when authenticated users request the application. &lt;br /&gt; &lt;br /&gt;Let's continue from where we left off in part two.&lt;/p&gt;
&lt;p&gt;Step 1: Run the application from within the IDE or point a IE browser to &lt;a href="https://rp.contoso.com/mvcapplication/"&gt;https://rp.contoso.com/mvcapplication/&lt;/a&gt;. The Admin page requires the user to be authenticated.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1.1 On the first page click on the Admin link and then the Login button.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;1.2 You should now be prompted to log on with a domain user. (Create a domain user account in the AD, if you haven't done so already. Don't forget to set Display name, Department, and Email address for the user). &lt;br /&gt;1.3 The browser should display an error stating that fs.contoso.com is unreachable. &lt;br /&gt;This is expected behavior as we haven't yet set up the relying party trust on the IdP STS side. Verify this issue by opening up the event viewer on ContosoServer and look for an error under Application and Services log --&amp;gt; AD FS --&amp;gt; Admin, saying something like "The requested relying party trust '&lt;a href="https://rp.contoso.com/mvcapplication/'"&gt;https://rp.contoso.com/mvcapplication/'&lt;/a&gt; is unspecified or unsupported".&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Step 2: Create a Relying Party Trust in AD FS: Over at ContosoServer, there are two ways to accomplish this. Either we do it manually with the &lt;a href="http://technet.microsoft.com/en-us/library/dd807132%28v=ws.10%29.aspx" target="_blank"&gt;Add Relying Party Trust wizard&lt;/a&gt; in the AD FS Management UI or by using the Powershell cmdlet &lt;a href="http://technet.microsoft.com/en-us/library/jj553803.aspx" target="_blank"&gt;Add-ADFSRelyingPartyTrust&lt;/a&gt;, as I am showing here:&lt;/p&gt;
&lt;div style="padding: 5px; border: 1px solid black; overflow: auto; list-style-type: disc;"&gt;
&lt;table border="0" cellspacing="0" cellpadding="5"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="Top"&gt;
&lt;div style="background: #cecece; padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt; 001 &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td valign="Top" nowrap="nowrap"&gt;
&lt;div style="background: #fcfcfc; padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span&gt;Add-ADFSRelyingPartyTrust&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-Name rp.contoso.com -MetadataUrl &lt;a href="https://rp.contoso.com/mvcapplication/federationmetadata/2007-06/federationmetadata.xml"&gt;https://rp.contoso.com/mvcapplication/federationmetadata/2007-06/federationmetadata.xml&lt;/a&gt; MonitoringEnabled $true -AutoUpdateEnabled $true&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;If you get an error saying: "The underlying Connection was closed: Could not establish trust relationship for the SSL/TLS secure channel." you need to install the SSL cert that we configured on ContosoClient into the Trusted Root Certification Authorities store on ContosoServer. &lt;br /&gt;If it still fails, check that Static Content is enabled on ContosoClient: Add Remove Programs --&amp;gt; Turn Windows Features on or off --&amp;gt; Internet Information Services --&amp;gt; World Wide Web Services --&amp;gt; Common HTTP Features --&amp;gt; Static Content &lt;br /&gt; &lt;br /&gt;Another way of generating the Relying Party Trust is to use the -MetadataFile parameter and point to the FederationMetadata.xml file on disk on ContosoClient, such as &lt;a href="file://\\ContosoClient\[Shared_folder]\MvcApplication\FederationMetadata\2007-06\FederationMetadata.xml"&gt;\\ContosoClient\[Shared_folder]\MvcApplication\FederationMetadata\2007-06\FederationMetadata.xml&lt;/a&gt;. The problem with this approach is that the Relying Party Trust can't be automatically updated by monitoring any changes in the RP's federation metadata.&lt;/p&gt;
&lt;p&gt;If you try to log on again, it still won't work. In the event log on ContosoServer you would see an access denied exception. We explicitly need to permit users to access the RP.&lt;/p&gt;
&lt;p&gt;Step 3: Create a Claims rule set (issuance authorization rule) and assign it to the relying party: The same goes with this one. You can either do this manually or use AD FS cmdlets. In this case &lt;a href="http://technet.microsoft.com/en-us/library/jj590804.aspx" target="_blank"&gt;New-ADFSClaimRuleSet&lt;/a&gt; and &lt;a href="http://technet.microsoft.com/en-us/library/jj590799.aspx" target="_blank"&gt;Set-ADFSRelyingPartyTrust&lt;/a&gt;.&lt;/p&gt;
&lt;div style="padding: 5px; border: 1px solid black; overflow: auto; list-style-type: disc;"&gt;
&lt;table border="0" cellspacing="0" cellpadding="5"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="Top"&gt;
&lt;div style="background: #cecece; padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt; 001 &lt;br /&gt;002 &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td valign="Top" nowrap="nowrap"&gt;
&lt;div style="background: #fcfcfc; padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span&gt;$claimRuleSet&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;New-ADFSClaimRuleSet&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span&gt;-ClaimRule&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;' =&amp;gt; issue(Type = "http://schemas.microsoft.com/authorization/claims/permit", Value = "true");'&lt;/span&gt; &lt;br /&gt;&lt;span&gt;Set-ADFSRelyingPartyTrust&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-TargetName&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;rp.contoso.com&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-IssuanceAuthorizationRules&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;$claimRuleSet&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ClaimRulesString&lt;/span&gt; &lt;span style="background-color: #ffffff;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;By applying the above rule to the Relying Party Trust we permit all users to access our RP application.&lt;/p&gt;
&lt;p&gt;The expected behavior when trying to log on now is that the authentication process will succeed, but the security token will not contain the claims that the RP relies on.&lt;/p&gt;
&lt;p&gt;Step 4: Transform the LDAP attributes that the relying party requires from Active Directory into claims. We need to transform the user account attributes that we retrieve from the attribute store Active Directory. Run these two cmdlets in Powershell ISE 3.0 on ContosoServer to add a new claims rule set (issuance transform rule) relying party trust configuration.&lt;/p&gt;
&lt;div style="padding: 5px; border: 1px solid black; overflow: auto; list-style-type: disc;"&gt;
&lt;table border="0" cellspacing="0" cellpadding="5"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="Top"&gt;
&lt;div style="background: #cecece; padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt; 001 &lt;br /&gt;002 &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td valign="Top" nowrap="nowrap"&gt;
&lt;div style="background: #fcfcfc; padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span&gt;$claimRuleSet&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span&gt;New-ADFSClaimRuleSet&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span&gt;-ClaimRule&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;'c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"] =&amp;gt; issue(store = "Active Directory", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress", "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", "http://schemas.microsoft.com/ws/2008/06/identity/claims/role"), query = ";mail,displayName,department;{0}", param = c.Value);'&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt; &lt;br /&gt;&lt;span&gt;Set-ADFSRelyingPartyTrust&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-TargetName&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;rp.contoso.com&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-IssuanceTransformRules&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;$claimRuleSet&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ClaimRulesString&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;Step 5: Update the RP application on ContosoClient: Modify the AdminController.cs, AccountModel.cs and the Index.cshtml (under Views--&amp;gt;Admin) so that the retrieved claims are displayed. One way of authorizing access to protected resources within the RP is to derive from &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.claims.claimsauthorizationmanager.aspx" target="_blank"&gt;ClaimsAuthorizationManager&lt;/a&gt; and override the &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.claims.claimsauthorizationmanager.checkaccess.aspx" target="_blank"&gt;CheckAccess&lt;/a&gt; method where we would and write our access control rules, not shown here. This customized class can then be added to the processing pipeline before the requests ever reach the RP internal logic, either declaratively or programmatically as described on the &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.claims.claimsauthorizationmanager.aspx" target="_blank"&gt;ClaimsAuthorizationManager&lt;/a&gt; page.&lt;/p&gt;
&lt;p&gt;Ok, now finally when we run the application we should be able to reach the Admin page! &lt;br /&gt; &lt;br /&gt;This concludes this series on how to set up an internal claims-based solution lab with ADFS on Windows Server 2012 with a claims-aware ASP.NET MVC 4.0 application as the RP. The purpose of these blog posts is just to illustrate one specific lab(!) scenario and we merely scratched the surface of the &lt;a href="http://en.wikipedia.org/wiki/Claims-based_identity" target="_blank"&gt;claims-based identity&lt;/a&gt; problem domain.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10385088" width="1" height="1"&gt;</content><author><name>StSeverin</name><uri>http://blogs.msdn.com/stefan.severin_4000_hotmail.com/ProfileUrlRedirect.ashx</uri></author><category term="Windows Server 2012" scheme="http://blogs.msdn.com/b/stseverin/archive/tags/Windows+Server+2012/" /><category term="Powershell 3.0" scheme="http://blogs.msdn.com/b/stseverin/archive/tags/Powershell+3-0/" /><category term="claims-based identity" scheme="http://blogs.msdn.com/b/stseverin/archive/tags/claims_2D00_based+identity/" /><category term="ADFS" scheme="http://blogs.msdn.com/b/stseverin/archive/tags/ADFS/" /></entry><entry><title>Exploring AD FS on Windows Server 2012, part 2</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/stseverin/archive/2013/01/14/exploring-ad-fs-2-1-on-windows-server-2012-part-2.aspx" /><id>http://blogs.msdn.com/b/stseverin/archive/2013/01/14/exploring-ad-fs-2-1-on-windows-server-2012-part-2.aspx</id><published>2013-01-14T15:14:00Z</published><updated>2013-01-14T15:14:00Z</updated><content type="html">&lt;p&gt;In &lt;a href="http://blogs.msdn.com/b/stseverin/archive/2012/12/29/deploying-adfs-2-1-on-windows-server-2012-using-powershell.aspx"&gt;part 1&lt;/a&gt; the focus was on the initial setup of an AD FS lab/test Environment on Windows Server 2012, using Powershell 3.0 scripts. In this post, part 2, we'll continue by introducing an application that will rely on claims being issued by this federation server. The federation server is going to play the role of an IdP STS within the Contoso domain, so that we can enable internal Web SSO. The final claims-based solution will be tied together in part 3 in this series. &lt;br /&gt; &lt;br /&gt;For the purpose of illustration, we need to connect an &lt;a href="http://msdn.microsoft.com/en-us/library/ee748466.aspx" target="_blank"&gt;RP&lt;/a&gt; with the STS. When I say &amp;ldquo;connect&amp;rdquo;, in this particular example, I mean to have the &lt;a href="http://en.wikipedia.org/wiki/Integrated_Windows_Authentication" target="_blank"&gt;IWA&lt;/a&gt; authentication process externalized from the RP to the IdP STS.&amp;nbsp; Under the hood, this will be done by utilizing &lt;a href="http://msdn.microsoft.com/en-us/library/hh291066.aspx" target="_blank"&gt;WIF&lt;/a&gt;, now a first-class citizen in &lt;a href="http://msdn.microsoft.com/en-us/library/vstudio/w0x726c2.aspx" target="_blank"&gt;.NET framework 4.5&lt;/a&gt;,&amp;nbsp; and which abstracts away the &lt;a href="http://docs.oasis-open.org/wsfed/federation/v1.2/os/ws-federation-1.2-spec-os.html" target="_blank"&gt;WS-Federation specification&lt;/a&gt;. &lt;br /&gt; &lt;br /&gt;Just to make it a bit more challenging, the RP, which in this case will be a simple ASP.NET MVC 4 web application, will be hosted in &lt;a href="http://www.iis.net/learn/get-started/whats-new-in-iis-8" target="_blank"&gt;IIS 8&lt;/a&gt; on another VM within the same domain. The VM is also going to be a Windows 8 dev box. &lt;br /&gt;I used &lt;a href="http://technet.microsoft.com/en-us/library/hh857623.aspx"&gt;Client Hyper-V&lt;/a&gt; on my physical machine with &lt;a href="http://windows.microsoft.com/en-US/windows-8/meet"&gt;Windows 8&lt;/a&gt; Pro to bring the virtualization part together. There are plenty of tutorials on this subject out there. These &lt;a href="http://www.petri.co.il/using-windows-8-client-hyper-v-part-1.htm" target="_blank"&gt;blog posts&lt;/a&gt; by &lt;a href="http://www.petri.co.il/author/jeff-hicks"&gt;Jeff Hicks&lt;/a&gt; helped me along the way.&amp;nbsp; &lt;br /&gt;The goal is also to make use of Powershell 3.0 as much as possible.&lt;/p&gt;
&lt;p&gt;We still have plenty of things to walk through until we have a working claims-based solution, so let's get started. But just to summarize what we have so for: &lt;br /&gt;- A VM with a fresh install of Windows Server 2012, and with the machine, named ContosoServer, configured as a DC for the domain contoso.com. &lt;br /&gt;- An AD FS farm currently with only one federation server, fs.contoso.com &lt;br /&gt;- A service account, SVC-ADFS, which the AD FS windows service runs under. &lt;br /&gt;- The AD FS configuration stored locally in two SQL Server 2012 databases. &lt;br /&gt;- Three self-signed certificates; one for service communications, another for token-decryption and the third for token-signing. &lt;br /&gt; &lt;br /&gt;&lt;span style="color: #ff0000;"&gt;Note:&lt;/span&gt; As already mentioned in the &lt;a href="http://blogs.msdn.com/b/stseverin/archive/2012/12/29/deploying-adfs-2-1-on-windows-server-2012-using-powershell.aspx" target="_blank"&gt;first part&lt;/a&gt;, this slimlined setup might be convenient for a small lab or PoC, but is not by any means to be concidered best practice for production scenarios.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;Prerequisities for the new VM machine which will host the RP application: &lt;br /&gt;Windows 8 pro installed &lt;br /&gt;Computer renamed to ContosoClient &lt;br /&gt;Added as a computer in the domain contoso.com &lt;br /&gt;IIS 8 &lt;br /&gt;Powershell 3.0 ISE &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd831853.aspx"&gt;Visual Studio 2012&lt;/a&gt; &lt;br /&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/e21bf653-dfe1-4d81-b3d3-795cb104066e"&gt;Identity and Access Tool&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Step 1: Create DNS recourse records, host (A), for fs.contoso.com and rp.contoso.com: In order to translate the domain and host names to IP addresses (forward resolution), we need to create A records in the DNS. Run the following powershell cmdlets on the ContosoServer and verify that they where indeed created.&lt;/p&gt;
&lt;div style="padding: 5px; border: 1px solid black; overflow: auto; list-style-type: disc;"&gt;
&lt;table border="0" cellspacing="0" cellpadding="5"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="Top"&gt;
&lt;div style="background: #cecece; padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt; 001 &lt;br /&gt;002 &lt;br /&gt;003 &lt;br /&gt;004 &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td valign="Top" nowrap="nowrap"&gt;
&lt;div style="background: #fcfcfc; padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span&gt;Add-DnsServerResourceRecordA&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-IPv4Address&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;[The&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;IP&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;ContosoServer]&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-Name&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;"fs"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-ZoneName&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;contoso.com&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt; &lt;br /&gt;&lt;span&gt;Add-DnsServerResourceRecordA&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-IPv4Address&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;[The&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;IP&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;ContosoClient]&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-Name&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;"rp"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-ZoneName&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;contoso.com&lt;/span&gt; &lt;br /&gt;&lt;span&gt;#Verify&lt;/span&gt; &lt;br /&gt;&lt;span&gt;Get-DnsServerResourceRecord&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-ZoneName&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;contoso.com&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;Where-Object&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;$_&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;RecordType&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-eq&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;"A"&lt;/span&gt;&lt;span&gt;}&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Step 2: Create self-signed SSL certificate for rp.contoso.com. Run this on ContosoClient:&lt;/p&gt;
&lt;div style="padding: 5px; border: 1px solid black; overflow: auto; list-style-type: disc;"&gt;
&lt;table border="0" cellspacing="0" cellpadding="5"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="Top"&gt;
&lt;div style="background: #cecece; padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: xx-small;"&gt;001&lt;/span&gt; &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td valign="Top" nowrap="nowrap"&gt;
&lt;div style="background: #fcfcfc; padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span&gt;New-SelfSignedCertificate&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-DnsName&lt;/span&gt;&lt;span&gt; rp.&lt;/span&gt;&lt;span&gt;contoso.com&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-CertStoreLocation&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;Cert:\LocalMachine\My&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Make note of the thumbprint!&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Step 3: Assign the SSL certificate to Default Web Site: Run this in Powershell 3.0 ISE on ContosoClient:&lt;/p&gt;
&lt;div style="padding: 5px; border: 1px solid black; overflow: auto; list-style-type: disc;"&gt;
&lt;table border="0" cellspacing="0" cellpadding="5"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="Top"&gt;
&lt;div style="background: #cecece; padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt; 001 &lt;br /&gt;002 &lt;br /&gt;003 &lt;br /&gt;004 &lt;br /&gt;005 &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td valign="Top" nowrap="nowrap"&gt;
&lt;div style="background: #fcfcfc; padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span&gt;#Run this if https for the default web site has not been enabled already &lt;/span&gt; &lt;br /&gt;&lt;span&gt;New-WebBinding&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-Name&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;"Default Web Site"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-IP&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;"*"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-Port&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;443&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-Protocol&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;https&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt; &lt;br /&gt; &lt;br /&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;iis:&lt;/span&gt; &lt;br /&gt;&lt;span&gt;get-item&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;cert:\LocalMachine\MY\[the&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;thumbprint&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;above]&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;new-item&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span&gt;0.0.0.0!443&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;Step 4: Download and modify the &lt;a href="http://www.asp.net/mvc/mvc4" target="_blank"&gt;ASP.NET MVC 4&lt;/a&gt; sample: &lt;br /&gt; &lt;br /&gt;Let's imagine a web application that relies on the following three claims being issued by the STS. The STS will gather the claims from its attribute store Active Directory. &lt;br /&gt;- The user's name, for greeting the user (corresponding LDAP attribute: [Display Name]) &lt;br /&gt;- A role, used for access control decisions (for simplicity this will mapped to the LDAP attribute [Department] &lt;br /&gt;- An email address [--&amp;gt;LDAP: EmailAddresses] for personalization of the site and sending out newsletters by mail&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.1 To save some time and effort, let's download the &lt;a href="http://code.msdn.microsoft.com/vstudio/Claims-Aware-MVC-523e079b" target="_blank"&gt;ClaimsAwareMvcApplication&lt;/a&gt; from the &lt;a href="http://msdn.microsoft.com/en-us/library/hh545413.aspx" target="_blank"&gt;WIF Code Sample Index&lt;/a&gt;. Be sure to read through the description about the sample. &lt;br /&gt;4.2 Open up Visual Studio 2012 with administrator rights and open the solution from within the IDE. &lt;br /&gt;4.3 Open up the Project properties window and change to the "Web" tab.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;4.4 Select "Use local IIS Web server" and unselect "Use IIS Express"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;4.5 Change the "Project Url" to &lt;a title="https://localhost/MvcApplication" href="https://localhost/mvcapplication"&gt;https://localhost/mvcapplication&lt;/a&gt; and click Create Virtual Directory.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;4.6 Now select the "Use Custom Web Server" and enter &lt;a title="https://rp.contoso.com/webapplication2" href="https://rp.contoso.com/mvcapplication"&gt;https://rp.contoso.com/mvcapplication&lt;/a&gt; into the textbox. This way we don't get a warning in IE when we run the application from within the IDE as the SSL certificate's common name will be the same (rp.contoso.com).&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;4.7 Save these settings and close the properties window.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now let's pause here a bit and consider the fact that we are using self-signed SSL certificates in this lab. What we need to do in order to successfully establish the trust between the RP and the STS, is to install the SSL cert that we configured on ContosoServer into the Trusted Root Certification Authorities store on ContosoClient. See &lt;a href="http://technet.microsoft.com/en-us/library/cc731386%28v=ws.10%29.aspx" target="_blank"&gt;Export a server certificate&lt;/a&gt; and &lt;a href="http://technet.microsoft.com/en-us/library/cc732785%28v=ws.10%29.aspx" target="_blank"&gt;Import a server certificate&lt;/a&gt; for examples on how to do this.&lt;/p&gt;
&lt;p&gt;Step 5: Establish the trust relationship (on the RP side)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;5.1 Write-click on the project node in the Solution Explorer window and select "Identity and Access...". If you can't find it, install the &lt;a href="http://visualstudiogallery.msdn.microsoft.com/e21bf653-dfe1-4d81-b3d3-795cb104066e"&gt;Identity and Access Tool&lt;/a&gt;, then retry.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;5.2 Select "Use a business identity provider (e.g. ADFS2)" &lt;br /&gt;5.3 Enter the path to the STS: &lt;a title="https://fs.contoso.com/federationmetadata/2007-06/federationmetadata.xml" href="https://fs.contoso.com/federationmetadata/2007-06/federationmetadata.xml"&gt;https://fs.contoso.com/federationmetadata/2007-06/federationmetadata.xml&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;5.4 Enter the realm for the RP: &lt;a title="https://rp.contoso.com/mvcapplication/" href="https://rp.contoso.com/mvcapplication/"&gt;https://rp.contoso.com/mvcapplication/&lt;/a&gt; &lt;br /&gt;5.5 Select the Configuration tab. Enter &lt;a title="https://rp.contoso.com/mvcapplication/" href="https://rp.contoso.com/mvcapplication/"&gt;https://rp.contoso.com/mvcapplication/&lt;/a&gt; into the realm and audience text boxes, and select the "Generate a controller". Press Ok to save and Close. &lt;br /&gt;5.6 If you see a popup window that is displayed saying "Conflicting code...", select the "Use the existing authentication code" alternative and save by clicking Ok. Ignore the warning.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Also I needed to do the following changes, some of them probably because we started out from an already configured claims-aware application:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;5.9 Open Web.Config and verify that only &lt;a title="https://rp.contoso.com/mvcapplication/" href="https://rp.contoso.com/mvcapplication/"&gt;https://rp.contoso.com/mvcapplication/&lt;/a&gt; is present under the AudienceUris tag, also check that trustedIssuers only have one trusted issuer: &lt;a title="http://fs.contoso.com/adfs/services/trust" href="http://fs.contoso.com/adfs/services/trust"&gt;http://fs.contoso.com/adfs/services/trust&lt;/a&gt;. Save and Close.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;5.10 Update the FederationMetadata.xml file. Select "Show all files" in the Solution Explorer window, open the FederationMetadata.xml file (under FederationMetadata/2007-06) and remove any EndpointReference that doesn't have the address &lt;a title="https://rp.contoso.com/mvcapplication/" href="https://rp.contoso.com/mvcapplication/"&gt;https://rp.contoso.com/mvcapplication/&lt;/a&gt;. &lt;br /&gt;5.11 Save and close the file. Rebuild solution.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Great, you made it this far! In &lt;a href="http://blogs.msdn.com/b/stseverin/archive/2013/01/15/exploring-ad-fs-2-1-on-windows-server-2012-part-3.aspx" target="_blank"&gt;part 3&lt;/a&gt;, we'll tie the whole claims-based solution together and make this lab scenario work by performing the necessary changes to the AD FS configuration and the RP.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10384754" width="1" height="1"&gt;</content><author><name>StSeverin</name><uri>http://blogs.msdn.com/stefan.severin_4000_hotmail.com/ProfileUrlRedirect.ashx</uri></author><category term="Windows Server 2012" scheme="http://blogs.msdn.com/b/stseverin/archive/tags/Windows+Server+2012/" /><category term="Powershell 3.0" scheme="http://blogs.msdn.com/b/stseverin/archive/tags/Powershell+3-0/" /><category term="claims-based identity" scheme="http://blogs.msdn.com/b/stseverin/archive/tags/claims_2D00_based+identity/" /><category term="ADFS" scheme="http://blogs.msdn.com/b/stseverin/archive/tags/ADFS/" /></entry><entry><title>Exploring AD FS on Windows Server 2012, part 1</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/stseverin/archive/2012/12/29/deploying-adfs-2-1-on-windows-server-2012-using-powershell.aspx" /><id>http://blogs.msdn.com/b/stseverin/archive/2012/12/29/deploying-adfs-2-1-on-windows-server-2012-using-powershell.aspx</id><published>2012-12-29T21:09:00Z</published><updated>2012-12-29T21:09:00Z</updated><content type="html">&lt;p&gt;As we apparently are in the age of &lt;a href="http://en.wikipedia.org/wiki/DevOps" target="_blank"&gt;DevOps&lt;/a&gt;, where automation of repetitive administrative tasks seem to be in the vogue, I would like to join in with a series of posts about how to streamline the deployment and administration of AD FS on &lt;a href="http://www.microsoft.com/en-us/server-cloud/windows-server/" target="_blank"&gt;Windows Server 2012&lt;/a&gt;.&amp;#160; &lt;br /&gt;    &lt;br /&gt; My twist to the story is that I would like to deploy an AD FS farm in a test/lab environment with the AD FS configuration stored in a SQL Server database. Initially the one and only AD FS instance will serve as an IdP STS to enable internal Web SSO, and so only be used for authentication of internal users accessing internal applications (see &lt;a href="http://blogs.msdn.com/b/stseverin/archive/2013/01/14/exploring-ad-fs-2-1-on-windows-server-2012-part-2.aspx" target="_blank"&gt;part two&lt;/a&gt;). &lt;/p&gt;  &lt;p&gt;I will make use of &lt;a href="http://technet.microsoft.com/en-us/library/hh857339.aspx" target="_blank"&gt;Powershell 3.0&lt;/a&gt; to write scripts that I might be able to reuse in other environments later.     &lt;br /&gt;    &lt;br /&gt;Luckily for me, I already have a fresh install of Windows Server 2012 on a VM and the machine has been promoted to be the domain controller on a fictional domain called Contoso.com. On top of that I have installed an instance of &lt;a href="http://www.microsoft.com/sqlserver/en/us/editions.aspx" target="_blank"&gt;SQL Server 2012&lt;/a&gt;.&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;In this post the focus will be on setting the scene for later adventures with AD FS. So be prepared for some initial AD FS deployment stuff, presented in a step-by-step manner.&lt;/p&gt;  &lt;p&gt;First a disclaimer: This lab worked on my machine (VM) and is here for conceptual illustration only. It is not intended to be used in a production environment. Also, it might just not work on your machine! For the full disclaimer, see my blog's About page.&lt;/p&gt;  &lt;p&gt;Step 1: Log on to the server with appropriate administration rights.    &lt;br /&gt;Step 2: Start the Powershell ISE 3.0 tool, run as Administrator .     &lt;br /&gt;Step 3: Adjust the &lt;a href="http://technet.microsoft.com/en-us/library/ee176961.aspx" target="_blank"&gt;execution policy&lt;/a&gt; for Powershell 3.0, if needed.&amp;#160;&amp;#160; &lt;br /&gt;Step 4: Create some order in the AD: This script creates two OUs right under Contoso [Adfs Administration --&amp;gt;Service Accounts].&amp;#160;&amp;#160; &lt;/p&gt;  &lt;div style="padding: 5px; border: 1px solid black; overflow: auto; list-style-type: disc;"&gt;   &lt;table cellspacing="0" cellpadding="5" border="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="Top"&gt;           &lt;div style="background: rgb(206, 206, 206); padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt; 001                &lt;br /&gt;002                 &lt;br /&gt;003                 &lt;br /&gt;004                 &lt;br /&gt;005                 &lt;br /&gt;006                 &lt;br /&gt;007                 &lt;br /&gt;008                 &lt;br /&gt;009                 &lt;br /&gt;010                 &lt;br /&gt;011                 &lt;br /&gt;012                 &lt;br /&gt;013                 &lt;br /&gt;014                 &lt;br /&gt;015                 &lt;br /&gt;016                 &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;         &lt;/td&gt;          &lt;td valign="Top" nowrap="nowrap"&gt;           &lt;div style="background: rgb(252, 252, 252); padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span&gt;$domain&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&amp;quot;dc=contoso,dc=com&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;                 &lt;br /&gt;&lt;span&gt;$ouAdmin&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&amp;quot;ou=Adfs Administration&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;                 &lt;br /&gt;&lt;span&gt;$ouServiceAccounts&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&amp;quot;ou=Service Accounts&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;                 &lt;br /&gt;                &lt;br /&gt;&lt;span&gt;$ldapConnection&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;[ADSI]&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&amp;quot;LDAP://$domain&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;                 &lt;br /&gt;                &lt;br /&gt;&lt;span&gt;$newAdminOu&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;$ldapConnection&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Create&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;quot;OrganizationalUnit&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;$ouAdmin&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;                 &lt;br /&gt;&lt;span&gt;$newAdminOu&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SetInfo&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;                 &lt;br /&gt;                &lt;br /&gt;&lt;span&gt;Set-ADOrganizationalUnit&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&amp;quot;$ouAdmin,$domain&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;-ProtectedFromAccidentalDeletion&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;$True&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;                 &lt;br /&gt;                &lt;br /&gt;&lt;span&gt;$ouAdminPath&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;[ADSI]&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;$newAdminOu&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;                 &lt;br /&gt;&lt;span&gt;$newAccountOu&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;$ouAdminPath&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Create&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;quot;OrganizationalUnit&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;$ouServiceAccounts&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;                 &lt;br /&gt;&lt;span&gt;$newAccountOu&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SetInfo&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;                 &lt;br /&gt;                &lt;br /&gt;&lt;span&gt;Set-ADOrganizationalUnit&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&amp;quot;$ouServiceAccounts,$ouAdmin,$domain&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;-ProtectedFromAccidentalDeletion&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;$True&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Step 5: Create the service account for the AD FS farm. When running this script, it will ask you to come up with a password for the service account called SVC-ADFS. Don't worry about the account's rights for now. It will automatically be assigned when installing the ADFS farm.&lt;/p&gt;  &lt;div style="padding: 5px; border: 1px solid black; overflow: auto; list-style-type: disc;"&gt;   &lt;table cellspacing="0" cellpadding="5" border="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="Top"&gt;           &lt;div style="background: rgb(206, 206, 206); padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt; 001                &lt;br /&gt;002                 &lt;br /&gt;003                 &lt;br /&gt;004                 &lt;br /&gt;005                 &lt;br /&gt;006                 &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;         &lt;/td&gt;          &lt;td valign="Top" nowrap="nowrap"&gt;           &lt;div style="background: rgb(252, 252, 252); padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span&gt;$dnsRoot&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Get-ADDomain&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;dnsroot&lt;/span&gt;                 &lt;br /&gt;&lt;span&gt;$pwd&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;read-host&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&amp;quot;Enter strong password&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;-AsSecureString&lt;/span&gt;                 &lt;br /&gt;&lt;span&gt;$upn&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&amp;quot;SVC-ADFS&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&amp;quot;@&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;$dnsRoot&lt;/span&gt;                 &lt;br /&gt;&lt;span&gt;New-ADUser&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;–Name&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&amp;quot;SVC-ADFS&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;–SamAccountName&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;SVC-ADFS&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;–DisplayName&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;SVC-ADFS&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;-Description&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&amp;quot;Service account for ADFS farm&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;-userprincipalname&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;$upn&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;`                 &lt;br /&gt;&lt;span&gt;-Path&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&amp;quot;OU=Service Accounts,OU=ADFS Administration,DC=contoso,DC=com&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;–Enabled&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;$true&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;–ChangePasswordAtLogon&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;$False&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;-PasswordNeverExpires&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;$true&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;`                 &lt;br /&gt;&lt;span&gt;-AccountPassword&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;$pwd&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160; &lt;br /&gt;Step 6: Configure the Service Principal Name, SPN, for AD FS service account. The following one-liner does just this, after verifying no duplicates already exist.&amp;#160; &lt;/p&gt;  &lt;div style="padding: 5px; border: 1px solid black; overflow: auto; list-style-type: disc;"&gt;   &lt;table cellspacing="0" cellpadding="5" border="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="Top"&gt;           &lt;div style="background: rgb(206, 206, 206); padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt; 001                &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;         &lt;/td&gt;          &lt;td valign="Top" nowrap="nowrap"&gt;           &lt;div style="background: rgb(252, 252, 252); padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span&gt;setspn&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;-S&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;host/contososerver.contoso.com&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;contoso\svc-adfs&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Step 7: Ok so now, let's add AD FS, which now is a role in Windows Server 2012.    &lt;br /&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding: 5px; border: 1px solid black; overflow: auto; list-style-type: disc;"&gt;   &lt;table cellspacing="0" cellpadding="5" border="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="Top"&gt;           &lt;div style="background: rgb(206, 206, 206); padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt; 001                &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;         &lt;/td&gt;          &lt;td valign="Top" nowrap="nowrap"&gt;           &lt;div style="background: rgb(252, 252, 252); padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span&gt;Install-WindowsFeature&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;AD-Federation-Services&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;  &lt;p&gt;That's all there is to that. It will automatically add the web server role with IIS 8, for you.&amp;#160; &lt;/p&gt;  &lt;p&gt;Step 8: Create a self-signed SSL cert. Among the improved set of PowerShell commandlets that are being shipped with Windows Server 2012 we find one called &lt;a href="http://technet.microsoft.com/en-us/library/hh848633.aspx" target="_blank"&gt;New-SelfSignedCertificate&lt;/a&gt;. Its purpose is to create self-signed certificates for testing purposes. Note that Life is made simplier now that we are able to set the common name right. Let's make use of it.&lt;/p&gt;  &lt;div style="padding: 5px; border: 1px solid black; overflow: auto; list-style-type: disc;"&gt;   &lt;table cellspacing="0" cellpadding="5" border="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="Top"&gt;           &lt;div style="background: rgb(206, 206, 206); padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt;001                &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;         &lt;/td&gt;          &lt;td valign="Top" nowrap="nowrap"&gt;           &lt;div style="background: rgb(252, 252, 252); padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span&gt;New-SelfSignedCertificate&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;-DnsName&lt;/span&gt;&lt;span&gt; fs.&lt;/span&gt;&lt;span&gt;contoso.com&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;-CertStoreLocation&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;Cert:\LocalMachine\My&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;  &lt;p&gt;Make note of the thumbprint that was written out to the host, because we will need it in the upcoming steps.&lt;/p&gt;  &lt;p&gt;Step 9: Associate the self-signed cert with port 443 for Default Web Site.&lt;/p&gt;  &lt;div style="padding: 5px; border: 1px solid black; overflow: auto; list-style-type: disc;"&gt;   &lt;table cellspacing="0" cellpadding="5" border="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="Top"&gt;           &lt;div style="background: rgb(206, 206, 206); padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt; 001                &lt;br /&gt;002                 &lt;br /&gt;003                 &lt;br /&gt;004                 &lt;br /&gt;005                 &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;         &lt;/td&gt;          &lt;td valign="Top" nowrap="nowrap"&gt;           &lt;div style="background: rgb(252, 252, 252); padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span&gt;#Run this if https for the default web site has not been enabled already&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&lt;span&gt;New-WebBinding&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;-Name&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&amp;quot;Default Web Site&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;-IP&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;-Port&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;443&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;-Protocol&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;https&lt;/span&gt;                 &lt;br /&gt;                &lt;br /&gt;&lt;span&gt;#Associate the cert with the SSL port 443 of the default web site&lt;/span&gt;                 &lt;br /&gt;&lt;span&gt;get-item&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;cert:\LocalMachine\MY\[The&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;cert&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;thumbprint&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;previous&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;step]&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;new-item&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;0.0.0.0!443&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;  &lt;p&gt;   &lt;br /&gt;Step 10:&amp;#160; Finally, we are ready to create the farm and its first federation server node. When asked credentials, supply the credentials for CONTOSO\SVC-ADFS.&lt;/p&gt;  &lt;div style="padding: 5px; border: 1px solid black; overflow: auto; list-style-type: disc;"&gt;   &lt;table cellspacing="0" cellpadding="5" border="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="Top"&gt;           &lt;div style="background: rgb(206, 206, 206); padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt; 001                &lt;br /&gt;002                 &lt;br /&gt;003                 &lt;br /&gt;004                 &lt;br /&gt;005                 &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;         &lt;/td&gt;          &lt;td valign="Top" nowrap="nowrap"&gt;           &lt;div style="background: rgb(252, 252, 252); padding: 5px;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span&gt;$serviceAccountCredentials&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;Get-Credential&lt;/span&gt;                 &lt;br /&gt;&lt;span&gt;Install-AdfsFarm&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;-CertificateThumbprint&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;[The&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;certificate&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;thumbnail from the previous step]&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;`                 &lt;br /&gt;&lt;span&gt;&amp;#160; &lt;/span&gt;&lt;span&gt;-FederationServiceName &lt;/span&gt;&lt;span&gt;fs.contoso.com&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;`                 &lt;br /&gt;&lt;span&gt;&amp;#160; &lt;/span&gt;&lt;span&gt;-ServiceAccountCredential&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;$serviceAccountCredentials&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;`                 &lt;br /&gt;&lt;span&gt;&amp;#160; &lt;/span&gt;&lt;span&gt;-SQLConnectionString&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&amp;quot;Data Source=.;Integrated Security=True&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;You should now be able to see&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Two newly created databases in SQL Server: AdfsArtifactStore and AdfsConfiguration&lt;/li&gt;    &lt;li&gt;The service account CONTOSO\SVC-ADFS has been assigned approriate SQL Server rights&lt;/li&gt;    &lt;li&gt;A new web app under default web site: adfs/ls&lt;/li&gt;    &lt;li&gt;A new Windows service: AD FS Windows Service which runs under the account CONTOSO\SVC-ADFS.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;That's it for this time folks. I'll be back with more posts on AD FS on Windows Server 2012. Until then: Happy New Year!    &lt;br /&gt;    &lt;br /&gt;--&amp;gt; &lt;a href="http://blogs.msdn.com/b/stseverin/archive/2013/01/14/exploring-ad-fs-2-1-on-windows-server-2012-part-2.aspx" target="_blank"&gt;Part 2&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10381164" width="1" height="1"&gt;</content><author><name>StSeverin</name><uri>http://blogs.msdn.com/stefan.severin_4000_hotmail.com/ProfileUrlRedirect.ashx</uri></author><category term="Windows Server 2012" scheme="http://blogs.msdn.com/b/stseverin/archive/tags/Windows+Server+2012/" /><category term="Powershell 3.0" scheme="http://blogs.msdn.com/b/stseverin/archive/tags/Powershell+3-0/" /><category term="claims-based identity" scheme="http://blogs.msdn.com/b/stseverin/archive/tags/claims_2D00_based+identity/" /><category term="ADFS" scheme="http://blogs.msdn.com/b/stseverin/archive/tags/ADFS/" /></entry></feed>