summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build.proj3
-rw-r--r--doc/Configuration.htm167
-rw-r--r--doc/README.html4
-rw-r--r--doc/WebFarms.htm25
-rw-r--r--lib/DotNetOpenAuth.BuildTasks.dllbin21504 -> 56832 bytes
-rw-r--r--lib/DotNetOpenAuth.BuildTasks.pdbbin60928 -> 142848 bytes
-rw-r--r--lib/DotNetOpenAuth.BuildTasks.targets1
-rw-r--r--samples/OpenIdOfflineProvider/OpenIdOfflineProvider.csproj10
-rw-r--r--samples/OpenIdOfflineProvider/Properties/AssemblyInfo.cs15
-rw-r--r--src/DotNetOpenAuth.Test/Messaging/HttpRequestInfoTests.cs56
-rw-r--r--src/DotNetOpenAuth/Messaging/HttpRequestInfo.cs66
-rw-r--r--src/DotNetOpenAuth/OpenId/Provider/StandardProviderApplicationStore.cs6
-rw-r--r--tools/Publish.targets10
-rw-r--r--tools/sandcastle.targets27
14 files changed, 161 insertions, 229 deletions
diff --git a/build.proj b/build.proj
index 8e34a8d..4b86b49 100644
--- a/build.proj
+++ b/build.proj
@@ -21,7 +21,6 @@
<DirtyDirectories Include="
$(ProjectRoot)\bin;
$(ProjectRoot)\**\obj;
- $(ProjectRoot)\doc\api;
$(ProjectRoot)\drops;
$(ProjectRoot)\src\PrecompiledWeb;
" />
@@ -198,6 +197,7 @@
<DropLibFiles Include="@(DropLibSourceFiles->'$(DropLibDirectory)\%(RecurisveDir)%(FileName)%(Extension)')"/>
<DropSamplesFiles Include="@(DropSamplesSourceFiles->'$(DropSamplesDirectory)\%(RecursiveDir)%(FileName)%(Extension)')"/>
<DropSamplesRefreshFiles Include="@(DropSamplesRefreshSourceFiles->'$(DropSamplesDirectory)\%(RecursiveDir)%(FileName).refresh')"/>
+ <DropSamplesToolsProjects Include="$(DropSamplesDirectory)\OpenIdOfflineProvider\OpenIdOfflineProvider.csproj" />
<DropSpecsFiles Include="@(DropSpecsSourceFiles->'$(DropSpecsDirectory)\%(RecursiveDir)%(FileName)%(Extension)')"/>
<AllDropSources Include="
@@ -227,6 +227,7 @@
<ItemGroup>
<SampleProjectTargets Include="$(DropSamplesDirectory)\**\*.csproj" />
</ItemGroup>
+ <FixupShippingToolSamples Projects="@(DropSamplesToolsProjects)" />
<ChangeProjectReferenceToAssemblyReference Projects="@(SampleProjectTargets)"
ProjectReference="..\..\src\$(ProductName)\$(ProductName).csproj" Reference="..\..\Bin\$(ProductName).dll" />
</Target>
diff --git a/doc/Configuration.htm b/doc/Configuration.htm
deleted file mode 100644
index 9346c9f..0000000
--- a/doc/Configuration.htm
+++ /dev/null
@@ -1,167 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" >
-<head>
- <title>Web.config file configuration of DotNetOpenId</title>
-<style>
-#id_text_to_colorize{width:600px;height:120px}
-.linenos {padding-right: 5px;background: #ccc}
-.code {padding-left: 5px;}
-.highlight { background: #ffffff; }
-.highlight .c { color: #408080; font-style: italic } /* Comment */
-.highlight .err { border: 1px solid #FF0000 } /* Error */
-.highlight .k { color: #008000; font-weight: bold } /* Keyword */
-.highlight .o { color: #666666 } /* Operator */
-.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */
-.highlight .cp { color: #BC7A00 } /* Comment.Preproc */
-.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */
-.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */
-.highlight .gd { color: #A00000 } /* Generic.Deleted */
-.highlight .ge { font-style: italic } /* Generic.Emph */
-.highlight .gr { color: #FF0000 } /* Generic.Error */
-.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
-.highlight .gi { color: #00A000 } /* Generic.Inserted */
-.highlight .go { color: #808080 } /* Generic.Output */
-.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
-.highlight .gs { font-weight: bold } /* Generic.Strong */
-.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
-.highlight .gt { color: #0040D0 } /* Generic.Traceback */
-.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
-.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
-.highlight .kp { color: #008000 } /* Keyword.Pseudo */
-.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
-.highlight .kt { color: #B00040 } /* Keyword.Type */
-.highlight .m { color: #666666 } /* Literal.Number */
-.highlight .s { color: #BA2121 } /* Literal.String */
-.highlight .na { color: #7D9029 } /* Name.Attribute */
-.highlight .nb { color: #008000 } /* Name.Builtin */
-.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
-.highlight .no { color: #880000 } /* Name.Constant */
-.highlight .nd { color: #AA22FF } /* Name.Decorator */
-.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */
-.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
-.highlight .nf { color: #0000FF } /* Name.Function */
-.highlight .nl { color: #A0A000 } /* Name.Label */
-.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
-.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
-.highlight .nv { color: #19177C } /* Name.Variable */
-.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
-.highlight .w { color: #bbbbbb } /* Text.Whitespace */
-.highlight .mf { color: #666666 } /* Literal.Number.Float */
-.highlight .mh { color: #666666 } /* Literal.Number.Hex */
-.highlight .mi { color: #666666 } /* Literal.Number.Integer */
-.highlight .mo { color: #666666 } /* Literal.Number.Oct */
-.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
-.highlight .sc { color: #BA2121 } /* Literal.String.Char */
-.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
-.highlight .s2 { color: #BA2121 } /* Literal.String.Double */
-.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
-.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
-.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
-.highlight .sx { color: #008000 } /* Literal.String.Other */
-.highlight .sr { color: #BB6688 } /* Literal.String.Regex */
-.highlight .s1 { color: #BA2121 } /* Literal.String.Single */
-.highlight .ss { color: #19177C } /* Literal.String.Symbol */
-.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
-.highlight .vc { color: #19177C } /* Name.Variable.Class */
-.highlight .vg { color: #19177C } /* Name.Variable.Global */
-.highlight .vi { color: #19177C } /* Name.Variable.Instance */
-.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */
-</style>
-</head>
-<body>
-
- <p>DotNetOpenId can be configured in some aspects inside your web project&#39;s
- web.config file.&nbsp; To do this, add the below &lt;sectionGroup&gt; within the
- &lt;configSections&gt; of your Web.config file:</p>
- <div class="highlight"><pre><span class="nt">&lt;configSections&gt;</span>
- <span class="nt">&lt;sectionGroup</span> <span class="na">name=</span><span
- class="s">&quot;dotNetOpenId&quot;</span><span class="nt">&gt;</span>
- <span class="nt">&lt;section</span> <span class="na">name=</span><span
- class="s">&quot;relyingParty&quot;</span> <span class="na">type=</span><span
- class="s">&quot;DotNetOpenId.Configuration.RelyingPartySection&quot;</span> <span
- class="na">requirePermission=</span><span class="s">&quot;false&quot;</span> <span
- class="na">allowLocation=</span><span class="s">&quot;true&quot;</span><span
- class="nt">/&gt;</span>
- <span class="nt">&lt;section</span> <span class="na">name=</span><span
- class="s">&quot;provider&quot;</span> <span class="na">type=</span><span class="s">&quot;DotNetOpenId.Configuration.ProviderSection&quot;</span> <span
- class="na">requirePermission=</span><span class="s">&quot;false&quot;</span> <span
- class="na">allowLocation=</span><span class="s">&quot;true&quot;</span><span
- class="nt">/&gt;</span>
- <span class="nt">&lt;section</span> <span class="na">name=</span><span
- class="s">&quot;untrustedWebRequest&quot;</span> <span class="na">type=</span><span
- class="s">&quot;DotNetOpenId.Configuration.UntrustedWebRequestSection&quot;</span> <span
- class="na">requirePermission=</span><span class="s">&quot;false&quot;</span> <span
- class="na">allowLocation=</span><span class="s">&quot;false&quot;</span><span
- class="nt">/&gt;</span>
- <span class="nt">&lt;/sectionGroup&gt;</span>
-<span class="nt">&lt;/configSections&gt;</span></pre></div>
- <p>If you do not already have a configSections element in your Web.config file, add
- it at the very top, as the first child of the root &lt;configuration&gt; tag.</p>
- <p>Following is an example of every possible configuration setting, where each
- demonstrate value happens to be the default that would be used if it wasn&#39;t set
- in the .config file.&nbsp; Keep in mind that every setting below is optional, so
- you need only include those elements that you wish to change in your own copy of
- Web.config.&nbsp; The &lt;dotNetOpenId&gt; node below should show up as a peer node to
- system.web in your Web.config file.</p>
- <div class="highlight"><pre><span class="nt">&lt;dotNetOpenId&gt;</span>
- <span class="nt">&lt;relyingParty&gt;</span>
- <span class="nt">&lt;security</span> <span class="na">minimumHashBitLength=</span><span
- class="s">&quot;160&quot;</span> <span class="na">maximumHashBitLength=</span><span
- class="s">&quot;256&quot;</span>
- <span class="na">requireSsl=</span><span class="s">&quot;false&quot;</span> <span
- class="na">minimumRequiredOpenIdVersion=</span><span class="s">&quot;V10&quot;</span> <span
- class="nt">/&gt;</span>
- <span class="nt">&lt;store</span> <span class="na">type=</span><span class="s">&quot;SomeSite.CustomRPStore, SomeSite&quot;</span> <span
- class="nt">/&gt;</span>
- <span class="nt">&lt;/relyingParty&gt;</span>
- <span class="nt">&lt;provider&gt;</span>
- <span class="nt">&lt;security</span> <span class="na">minimumHashBitLength=</span><span
- class="s">&quot;160&quot;</span> <span class="na">maximumHashBitLength=</span><span
- class="s">&quot;256&quot;</span> <span class="nt">/&gt;</span>
- <span class="nt">&lt;store</span> <span class="na">type=</span><span class="s">&quot;SomeSite.CustomProviderStore, SomeSite&quot;</span> <span
- class="nt">/&gt;</span>
- <span class="nt">&lt;/provider&gt;</span>
- <span class="nt">&lt;untrustedWebRequest</span> <span class="na">readWriteTimeout=</span><span
- class="s">&quot;00:00:00.800&quot;</span> <span class="na">timeout=</span><span
- class="s">&quot;00:00:10&quot;</span> <span class="na">maximumBytesToRead=</span><span
- class="s">&quot;1048576&quot;</span> <span class="na">maximumRedirections=</span><span
- class="s">&quot;10&quot;</span><span class="nt">&gt;</span>
- <span class="nt">&lt;whitelistHosts&gt;</span>
- <span class="nt">&lt;add</span> <span class="na">name=</span><span
- class="s">&quot;localhost&quot;</span> <span class="nt">/&gt;</span>
- <span class="nt">&lt;add</span> <span class="na">name=</span><span
- class="s">&quot;127.0.0.1&quot;</span> <span class="nt">/&gt;</span>
- <span class="nt">&lt;/whitelistHosts&gt;</span>
- <span class="nt">&lt;whitelistHostsRegex&gt;</span>
- <span class="nt">&lt;add</span> <span class="na">name=</span><span
- class="s">&quot;^(.*\.)?goodsite.com&quot;</span> <span class="nt">/&gt;</span>
- <span class="nt">&lt;/whitelistHostsRegex&gt;</span>
- <span class="nt">&lt;blacklistHosts&gt;</span>
- <span class="nt">&lt;add</span> <span class="na">name=</span><span
- class="s">&quot;internalfinancialserver&quot;</span> <span class="nt">/&gt;</span>
- <span class="nt">&lt;add</span> <span class="na">name=</span><span
- class="s">&quot;www.evilsite.com&quot;</span> <span class="nt">/&gt;</span>
- <span class="nt">&lt;/blacklistHosts&gt;</span>
- <span class="nt">&lt;blacklistHostsRegex&gt;</span>
- <span class="nt">&lt;add</span> <span class="na">name=</span><span
- class="s">&quot;^(.*\.)?evilsite.com&quot;</span> <span class="nt">/&gt;</span>
- <span class="nt">&lt;/blacklistHostsRegex&gt;</span>
- <span class="nt">&lt;/untrustedWebRequest&gt;</span>
-<span class="nt">&lt;/dotNetOpenId&gt;</span>
-</pre></div>
-
- <p>All these configuration values are also configurable at runtime using the object
- model of the library.&nbsp; Using the Web.config file allows changes to be made
- without recompiling the web site.&nbsp; In the case of OpenIdRelyingParty and
- OpenIdProvider, it also allows you to setup your configuration just once, in
- your .config file, and have it apply to every instance of OpenIdRelyingParty or
- OpenIdProvider instead of you having to set up that configuration everywhere you
- instantiate these types.</p>
- <p>By using the ASP.NET &lt;location&gt; element, you can set some configuration settings
- for OpenIdRelyingParty or OpenIdProvider based on which directory or web page in
- your project is instantiating them.&nbsp; This would allow you to, for example,
- use enhanced SSL security requirements at just the administrator log in screen
- while allowing non-SSL OpenIDs for ordinary users.</p>
-
-</body>
-</html>
diff --git a/doc/README.html b/doc/README.html
index 7877d72..a82d848 100644
--- a/doc/README.html
+++ b/doc/README.html
@@ -4,8 +4,8 @@
<p>DotNetOpenAuth is a .NET library that enables OpenID, OAuth and InfoCard support
to be easily added to your web and/or desktop applications.&nbsp; </p>
<p>The project site for this library is hosted at
- <a href="http://dotnetopenid.googlecode.com/">
- http://dotnetopenid.googlecode.com/</a>.&nbsp; Please visit that web site for
+ <a href="http://dotnetopenauth.net/">
+ http://dotnetopenauth.net/</a>.&nbsp; Please visit that web site for
documentation, support and maintenance releases.</p>
<p>As with any library that is used for security-sensitive purposes such as
authentication and authorization, you should periodically check the project web
diff --git a/doc/WebFarms.htm b/doc/WebFarms.htm
index 44447e7..5ae924d 100644
--- a/doc/WebFarms.htm
+++ b/doc/WebFarms.htm
@@ -7,21 +7,26 @@
<h3>
Non-ASP.NET web servers</h3>
<p>
- DotNetOpenId works without being a part of an ASP.NET web site.&nbsp; The
- ASP.NET controls may not be used in this context, but the programmatic access to
- the OpenIdProvider and OpenIdRelyingParty classes will work correctly if you
- call the method overloads that do not require a current ASP.NET context.&nbsp;
- The xml doc comments indicate which methods require an ASP.NET context and which
- methods may be used without one.</p>
+ DotNetOpenAuth works without being a part of an ASP.NET web site.&nbsp; The ASP.NET
+ controls may not be used in this context, but the programmatic access to the OpenIdProvider
+ and OpenIdRelyingParty classes will work correctly if you call the method overloads
+ that do not require a current ASP.NET context.&nbsp; The xml doc comments indicate
+ which methods require an ASP.NET context and which methods may be used without one.</p>
<h3>
Proxy servers</h3>
<p>
- If your web servers need to use proxy servers to make outbound requests, you
- will need to configure your .NET AppDomain to default to the proxy server you
- require so that DotNetOpenId will use it.&nbsp;
+ If your web servers need to use proxy servers to make outbound requests, you will
+ need to configure your .NET AppDomain to default to the proxy server you require
+ so that DotNetOpenAuth will use it.&nbsp;
</p>
<p>
- To set the default web proxy, set the System.Net.WebRequest.DefaultWebProxy
+ To set the default web proxy programmatically, set the System.Net.WebRequest.DefaultWebProxy
property.</p>
+ <p>
+ To use the default proxy using your web.config file, add this section:<br />
+ <pre>&lt;system.net&gt;
+ &lt;defaultProxy enabled=&quot;true&quot; /&gt;
+&lt;/system.net&gt;</pre>
+ </p>
</body>
</html>
diff --git a/lib/DotNetOpenAuth.BuildTasks.dll b/lib/DotNetOpenAuth.BuildTasks.dll
index d11865f..7ee2a0f 100644
--- a/lib/DotNetOpenAuth.BuildTasks.dll
+++ b/lib/DotNetOpenAuth.BuildTasks.dll
Binary files differ
diff --git a/lib/DotNetOpenAuth.BuildTasks.pdb b/lib/DotNetOpenAuth.BuildTasks.pdb
index dda205e..ec57153 100644
--- a/lib/DotNetOpenAuth.BuildTasks.pdb
+++ b/lib/DotNetOpenAuth.BuildTasks.pdb
Binary files differ
diff --git a/lib/DotNetOpenAuth.BuildTasks.targets b/lib/DotNetOpenAuth.BuildTasks.targets
index 024b43a..ccdc75f 100644
--- a/lib/DotNetOpenAuth.BuildTasks.targets
+++ b/lib/DotNetOpenAuth.BuildTasks.targets
@@ -15,5 +15,6 @@
<UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="DeleteWebApplication" />
<UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="Trim" />
<UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="FilterItems" />
+ <UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="FixupShippingToolSamples" />
</Project>
diff --git a/samples/OpenIdOfflineProvider/OpenIdOfflineProvider.csproj b/samples/OpenIdOfflineProvider/OpenIdOfflineProvider.csproj
index 1bb2367..bb307a4 100644
--- a/samples/OpenIdOfflineProvider/OpenIdOfflineProvider.csproj
+++ b/samples/OpenIdOfflineProvider/OpenIdOfflineProvider.csproj
@@ -161,11 +161,5 @@
<Resource Include="openid.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
- <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
- Other similar extension points exist, see Microsoft.Common.targets.
- <Target Name="BeforeBuild">
- </Target>
- <Target Name="AfterBuild">
- </Target>
- -->
-</Project> \ No newline at end of file
+ <Import Project="..\..\tools\DotNetOpenAuth.Versioning.targets" />
+</Project>
diff --git a/samples/OpenIdOfflineProvider/Properties/AssemblyInfo.cs b/samples/OpenIdOfflineProvider/Properties/AssemblyInfo.cs
index adaded3..77d7464 100644
--- a/samples/OpenIdOfflineProvider/Properties/AssemblyInfo.cs
+++ b/samples/OpenIdOfflineProvider/Properties/AssemblyInfo.cs
@@ -10,6 +10,8 @@ using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
+// We DON'T put an AssemblyVersionAttribute in here because it is generated in the build.
+
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
@@ -36,16 +38,3 @@ using System.Windows;
ResourceDictionaryLocation.SourceAssembly)] // where the generic resource dictionary is located
// (used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/src/DotNetOpenAuth.Test/Messaging/HttpRequestInfoTests.cs b/src/DotNetOpenAuth.Test/Messaging/HttpRequestInfoTests.cs
index 05ac306..fd77746 100644
--- a/src/DotNetOpenAuth.Test/Messaging/HttpRequestInfoTests.cs
+++ b/src/DotNetOpenAuth.Test/Messaging/HttpRequestInfoTests.cs
@@ -5,6 +5,8 @@
//-----------------------------------------------------------------------
namespace DotNetOpenAuth.Test.Messaging {
+ using System;
+ using System.Collections.Specialized;
using System.Web;
using DotNetOpenAuth.Messaging;
using Microsoft.VisualStudio.TestTools.UnitTesting;
@@ -92,5 +94,59 @@ namespace DotNetOpenAuth.Test.Messaging {
HttpRequestInfo info = new HttpRequestInfo();
Assert.IsNull(info.QueryString["hi"]);
}
+
+ /// <summary>
+ /// Verifies SSL forwarders are correctly handled when they supply X_FORWARDED_PROTO and HOST
+ /// </summary>
+ [TestMethod]
+ public void GetPublicFacingUrlSSLForwarder1() {
+ HttpRequest req = new HttpRequest("a.aspx", "http://someinternalhost/a.aspx?a=b", "a=b");
+ var serverVariables = new NameValueCollection();
+ serverVariables["HTTP_X_FORWARDED_PROTO"] = "https";
+ serverVariables["HTTP_HOST"] = "somehost";
+ Uri actual = HttpRequestInfo.GetPublicFacingUrl(req, serverVariables);
+ Uri expected = new Uri("https://somehost/a.aspx?a=b");
+ Assert.AreEqual(expected, actual);
+ }
+
+ /// <summary>
+ /// Verifies SSL forwarders are correctly handled when they supply X_FORWARDED_PROTO and HOST:port
+ /// </summary>
+ [TestMethod]
+ public void GetPublicFacingUrlSSLForwarder2() {
+ HttpRequest req = new HttpRequest("a.aspx", "http://someinternalhost/a.aspx?a=b", "a=b");
+ var serverVariables = new NameValueCollection();
+ serverVariables["HTTP_X_FORWARDED_PROTO"] = "https";
+ serverVariables["HTTP_HOST"] = "somehost:999";
+ Uri actual = HttpRequestInfo.GetPublicFacingUrl(req, serverVariables);
+ Uri expected = new Uri("https://somehost:999/a.aspx?a=b");
+ Assert.AreEqual(expected, actual);
+ }
+
+ /// <summary>
+ /// Verifies SSL forwarders are correctly handled when they supply just HOST
+ /// </summary>
+ [TestMethod]
+ public void GetPublicFacingUrlSSLForwarder3() {
+ HttpRequest req = new HttpRequest("a.aspx", "http://someinternalhost/a.aspx?a=b", "a=b");
+ var serverVariables = new NameValueCollection();
+ serverVariables["HTTP_HOST"] = "somehost";
+ Uri actual = HttpRequestInfo.GetPublicFacingUrl(req, serverVariables);
+ Uri expected = new Uri("http://somehost/a.aspx?a=b");
+ Assert.AreEqual(expected, actual);
+ }
+
+ /// <summary>
+ /// Verifies SSL forwarders are correctly handled when they supply just HOST:port
+ /// </summary>
+ [TestMethod]
+ public void GetPublicFacingUrlSSLForwarder4() {
+ HttpRequest req = new HttpRequest("a.aspx", "http://someinternalhost/a.aspx?a=b", "a=b");
+ var serverVariables = new NameValueCollection();
+ serverVariables["HTTP_HOST"] = "somehost:79";
+ Uri actual = HttpRequestInfo.GetPublicFacingUrl(req, serverVariables);
+ Uri expected = new Uri("http://somehost:79/a.aspx?a=b");
+ Assert.AreEqual(expected, actual);
+ }
}
}
diff --git a/src/DotNetOpenAuth/Messaging/HttpRequestInfo.cs b/src/DotNetOpenAuth/Messaging/HttpRequestInfo.cs
index 0693926..9e9deb4 100644
--- a/src/DotNetOpenAuth/Messaging/HttpRequestInfo.cs
+++ b/src/DotNetOpenAuth/Messaging/HttpRequestInfo.cs
@@ -293,28 +293,24 @@ namespace DotNetOpenAuth.Messaging {
}
/// <summary>
- /// Gets the query or form data from the original request (before any URL rewriting has occurred.)
- /// </summary>
- /// <returns>A set of name=value pairs.</returns>
- [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Justification = "Expensive call")]
- internal NameValueCollection GetQueryOrFormFromContext() {
- NameValueCollection query;
- if (this.HttpMethod == "GET") {
- query = this.QueryStringBeforeRewriting;
- } else {
- query = this.Form;
- }
- return query;
- }
-
- /// <summary>
/// Gets the public facing URL for the given incoming HTTP request.
/// </summary>
/// <param name="request">The request.</param>
- /// <returns>The URI that the outside world used to create this request.</returns>
- private static Uri GetPublicFacingUrl(HttpRequest request) {
+ /// <param name="serverVariables">The server variables to consider part of the request.</param>
+ /// <returns>
+ /// The URI that the outside world used to create this request.
+ /// </returns>
+ /// <remarks>
+ /// Although the <paramref name="serverVariables"/> value can be obtained from
+ /// <see cref="HttpRequest.ServerVariables"/>, it's useful to be able to pass them
+ /// in so we can simulate injected values from our unit tests since the actual property
+ /// is a read-only kind of <see cref="NameValueCollection"/>.
+ /// </remarks>
+ internal static Uri GetPublicFacingUrl(HttpRequest request, NameValueCollection serverVariables) {
Contract.Requires(request != null);
+ Contract.Requires(serverVariables != null);
ErrorUtilities.VerifyArgumentNotNull(request, "request");
+ ErrorUtilities.VerifyArgumentNotNull(serverVariables, "serverVariables");
// Due to URL rewriting, cloud computing (i.e. Azure)
// and web farms, etc., we have to be VERY careful about what
@@ -323,15 +319,14 @@ namespace DotNetOpenAuth.Messaging {
// HttpRequest.Url gives us the internal URL in a cloud environment,
// So we use a variable that (at least from what I can tell) gives us
// the public URL:
- if (request.ServerVariables["HTTP_HOST"] != null) {
+ if (serverVariables["HTTP_HOST"] != null) {
ErrorUtilities.VerifySupported(request.Url.Scheme == Uri.UriSchemeHttps || request.Url.Scheme == Uri.UriSchemeHttp, "Only HTTP and HTTPS are supported protocols.");
+ string scheme = serverVariables["HTTP_X_FORWARDED_PROTO"] ?? request.Url.Scheme;
+ Uri hostAndPort = new Uri(scheme + Uri.SchemeDelimiter + serverVariables["HTTP_HOST"]);
UriBuilder publicRequestUri = new UriBuilder(request.Url);
- Uri hostAndPort = new Uri(request.Url.Scheme + Uri.SchemeDelimiter + request.ServerVariables["HTTP_HOST"]);
+ publicRequestUri.Scheme = scheme;
publicRequestUri.Host = hostAndPort.Host;
publicRequestUri.Port = hostAndPort.Port;
- if (request.ServerVariables["HTTP_X_FORWARDED_PROTO"] != null) {
- publicRequestUri.Scheme = request.ServerVariables["HTTP_X_FORWARDED_PROTO"];
- }
return publicRequestUri.Uri;
} else {
// Failover to the method that works for non-web farm enviroments.
@@ -347,6 +342,33 @@ namespace DotNetOpenAuth.Messaging {
}
/// <summary>
+ /// Gets the query or form data from the original request (before any URL rewriting has occurred.)
+ /// </summary>
+ /// <returns>A set of name=value pairs.</returns>
+ [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Justification = "Expensive call")]
+ internal NameValueCollection GetQueryOrFormFromContext() {
+ NameValueCollection query;
+ if (this.HttpMethod == "GET") {
+ query = this.QueryStringBeforeRewriting;
+ } else {
+ query = this.Form;
+ }
+ return query;
+ }
+
+ /// <summary>
+ /// Gets the public facing URL for the given incoming HTTP request.
+ /// </summary>
+ /// <param name="request">The request.</param>
+ /// <returns>The URI that the outside world used to create this request.</returns>
+ private static Uri GetPublicFacingUrl(HttpRequest request) {
+ Contract.Requires(request != null);
+ ErrorUtilities.VerifyArgumentNotNull(request, "request");
+
+ return GetPublicFacingUrl(request, request.ServerVariables);
+ }
+
+ /// <summary>
/// Makes up a reasonable guess at the raw URL from the possibly rewritten URL.
/// </summary>
/// <param name="url">A full URL.</param>
diff --git a/src/DotNetOpenAuth/OpenId/Provider/StandardProviderApplicationStore.cs b/src/DotNetOpenAuth/OpenId/Provider/StandardProviderApplicationStore.cs
index 7085e72..f33a655 100644
--- a/src/DotNetOpenAuth/OpenId/Provider/StandardProviderApplicationStore.cs
+++ b/src/DotNetOpenAuth/OpenId/Provider/StandardProviderApplicationStore.cs
@@ -122,7 +122,7 @@ namespace DotNetOpenAuth.OpenId.Provider {
/// </summary>
/// <param name="context">The context, or namespace, within which the <paramref name="nonce"/> must be unique.</param>
/// <param name="nonce">A series of random characters.</param>
- /// <param name="timestamp">The timestamp that together with the nonce string make it unique.
+ /// <param name="timestampUtc">The timestamp that together with the nonce string make it unique.
/// The timestamp may also be used by the data store to clear out old nonces.</param>
/// <returns>
/// True if the nonce+timestamp (combination) was not previously in the database.
@@ -135,8 +135,8 @@ namespace DotNetOpenAuth.OpenId.Provider {
/// is retrieved or set using the
/// <see cref="StandardExpirationBindingElement.MaximumMessageAge"/> property.
/// </remarks>
- public bool StoreNonce(string context, string nonce, DateTime timestamp) {
- return this.nonceStore.StoreNonce(context, nonce, timestamp);
+ public bool StoreNonce(string context, string nonce, DateTime timestampUtc) {
+ return this.nonceStore.StoreNonce(context, nonce, timestampUtc);
}
#endregion
diff --git a/tools/Publish.targets b/tools/Publish.targets
index 036e751..a4d2bfa 100644
--- a/tools/Publish.targets
+++ b/tools/Publish.targets
@@ -67,6 +67,11 @@
<Copy SourceFiles="@(PublishableWebSampleSources)" DestinationFiles="@(PublishableWebSampleTargets)" SkipUnchangedFiles="true" />
</Target>
+ <Target Name="UnpublishSamples"
+ DependsOnTargets="DeleteSampleSitesOnIis"
+ Condition=" '$(SampleWebRoot)' != '' ">
+ </Target>
+
<Target Name="PrepareForPublishDocumentation" DependsOnTargets="Documentation">
<ItemGroup>
<DocSources Include="$(ProjectRoot)\doc\api\**\*" />
@@ -84,6 +89,11 @@
<Copy SourceFiles="@(DocSources)" DestinationFiles="@(DocTargets)" SkipUnchangedFiles="true" />
</Target>
+ <Target Name="UnpublishDocumentation"
+ DependsOnTargets="DeleteDocumentationSiteOnIis"
+ Condition=" '$(DocWebRoot)' != '' ">
+ </Target>
+
<Target Name="CreateSampleSitesOnIis" DependsOnTargets="PrepareForIIS;PrepareForPublishSamples">
<Error Text="The PublishSamplesWebSiteName property must be set." Condition=" '$(PublishSamplesWebSiteName)' == '' "/>
<Error Text="The SampleWebRoot property must be set." Condition=" '$(SampleWebRoot)' == '' " />
diff --git a/tools/sandcastle.targets b/tools/sandcastle.targets
index 8103a21..d76698e 100644
--- a/tools/sandcastle.targets
+++ b/tools/sandcastle.targets
@@ -40,10 +40,31 @@
</ItemGroup>
<Target Name="CleanDocumentation">
- <Delete Files="$(ReflectionFile);$(ManifestFile);$(ReflectionBaseFile);$(ChmFile)" TreatErrorsAsWarnings="true"/>
- <RemoveDir Directories="$(DocOutputApiPath);$(DocIntermediatePath);$(ChmDir)" ContinueOnError="true"/>
- <RemoveDir Directories="$(FxReflectionIntermediatePath)" ContinueOnError="true" />
+ <ItemGroup>
+ <_DirtyFiles Include="
+ $(DocOutputApiPath)\**;
+ $(ReflectionFile);
+ $(ManifestFile);
+ $(ReflectionBaseFile);
+ $(ChmFile)
+ "
+ Exclude="
+ $(DocOutputApiPath)\Web.config;
+ $(DocOutputApiPath)\Default.aspx;
+ " />
+ <_DirtyDirectories Include="
+ $(DocIntermediatePath);
+ $(ChmDir);
+ $(FxReflectionIntermediatePath)
+ " />
+ </ItemGroup>
+ <Delete Files="@(_DirtyFiles)" TreatErrorsAsWarnings="true"/>
+ <RemoveDir Directories="@(_DirtyDirectories)" ContinueOnError="true"/>
<!--<RemoveDir Directories="$(FxReflectionOutputPath)" ContinueOnError="true" />-->
+ <ItemGroup>
+ <_DirtyFiles Remove="@(_DirtyFiles)" />
+ <_DirtyDirectories Remove="@(_DirtyDirectories)" />
+ </ItemGroup>
</Target>
<Target Name="CreateIntermediatePath">