summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Arnott <andrewarnott@gmail.com>2008-04-15 21:15:24 -0700
committerAndrew Arnott <andrewarnott@gmail.com>2008-04-15 22:23:48 -0700
commitea36fd5a24e311cfa399fd36f86b7ec55113cc8f (patch)
tree42bf3c147a7c7adc9da0cd87b5c2d299943647a7
parentbedb0be63a15af113ce584b3e24f01a2b9daa1a1 (diff)
downloadDotNetOpenAuth-ea36fd5a24e311cfa399fd36f86b7ec55113cc8f.zip
DotNetOpenAuth-ea36fd5a24e311cfa399fd36f86b7ec55113cc8f.tar.gz
DotNetOpenAuth-ea36fd5a24e311cfa399fd36f86b7ec55113cc8f.tar.bz2
BREAKING CHANGE for SimpleRegistration extension, and other stuff.
* SimpleRegistration changed from struct to class. * SimpleRegistrationFieldValues.None and SimpleRegistrationRequestFields.None removed. * Semantic for extension classes that ReadFromRequest or ReadFromResponse and don't find any matching parameters changed from returning an empty struct to returning null. * Added framework for testing extensions. * Upgraded TestWeb project to .NET 3.5. * Built up bare framework for sending/receiving Attribute Exchange extension messages.
-rw-r--r--src/DotNetOpenId.Test/DotNetOpenId.Test.csproj3
-rw-r--r--src/DotNetOpenId.Test/Extensions/AttributeExchangeTests.cs38
-rw-r--r--src/DotNetOpenId.Test/Extensions/ExtensionTestBase.cs56
-rw-r--r--src/DotNetOpenId.Test/Extensions/SimpleRegistrationTests.cs39
-rw-r--r--src/DotNetOpenId.Test/ProfileFieldValuesTests.cs34
-rw-r--r--src/DotNetOpenId.Test/TestSupport.cs11
-rw-r--r--src/DotNetOpenId.TestWeb/ProviderEndpoint.aspx.cs34
-rw-r--r--src/DotNetOpenId.TestWeb/web.config82
-rw-r--r--src/DotNetOpenId.sln2
-rw-r--r--src/DotNetOpenId/DotNetOpenId.csproj1
-rw-r--r--src/DotNetOpenId/Extensions/AttributeExchangeFetchRequest.cs40
-rw-r--r--src/DotNetOpenId/Extensions/AttributeExchangeFetchResponse.cs37
-rw-r--r--src/DotNetOpenId/Extensions/AttributeExchangeStoreRequest.cs39
-rw-r--r--src/DotNetOpenId/Extensions/AttributeExchangeStoreResponse.cs37
-rw-r--r--src/DotNetOpenId/Extensions/IExtension.cs49
-rw-r--r--src/DotNetOpenId/Extensions/SimpleRegistrationFieldValues.cs62
-rw-r--r--src/DotNetOpenId/Extensions/SimpleRegistrationRequestFields.cs29
-rw-r--r--src/DotNetOpenId/Strings.Designer.cs9
-rw-r--r--src/DotNetOpenId/Strings.resx3
19 files changed, 507 insertions, 98 deletions
diff --git a/src/DotNetOpenId.Test/DotNetOpenId.Test.csproj b/src/DotNetOpenId.Test/DotNetOpenId.Test.csproj
index 0c750e9..bc71e0e 100644
--- a/src/DotNetOpenId.Test/DotNetOpenId.Test.csproj
+++ b/src/DotNetOpenId.Test/DotNetOpenId.Test.csproj
@@ -44,6 +44,9 @@
<Compile Include="AssociationsTest.cs" />
<Compile Include="AssociationTestSuite.cs" />
<Compile Include="ExtensionsArgumentsManagerTests.cs" />
+ <Compile Include="Extensions\AttributeExchangeTests.cs" />
+ <Compile Include="Extensions\ExtensionTestBase.cs" />
+ <Compile Include="Extensions\SimpleRegistrationTests.cs" />
<Compile Include="Hosting\EncodingInterceptor.cs" />
<Compile Include="IdentifierTests.cs" />
<Compile Include="NonceTest.cs" />
diff --git a/src/DotNetOpenId.Test/Extensions/AttributeExchangeTests.cs b/src/DotNetOpenId.Test/Extensions/AttributeExchangeTests.cs
new file mode 100644
index 0000000..c216fd1
--- /dev/null
+++ b/src/DotNetOpenId.Test/Extensions/AttributeExchangeTests.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using NUnit.Framework;
+using DotNetOpenId.RelyingParty;
+using DotNetOpenId.Extensions;
+
+namespace DotNetOpenId.Test.Extensions {
+ [TestFixture]
+ public class AttributeExchangeTests : ExtensionTestBase {
+ [Test]
+ public void None() {
+ var fetchResponse = ParameterizedTest<AttributeExchangeFetchResponse>(
+ TestSupport.GetIdentityUrl(TestSupport.Scenarios.ExtensionFullCooperation, Version), null);
+ Assert.IsNull(fetchResponse);
+ var storeResponse = ParameterizedTest<AttributeExchangeStoreResponse>(
+ TestSupport.GetIdentityUrl(TestSupport.Scenarios.ExtensionFullCooperation, Version), null);
+ Assert.IsNull(storeResponse);
+ }
+
+ [Test]
+ public void Fetch() {
+ var request = new AttributeExchangeFetchRequest();
+ var response = ParameterizedTest<AttributeExchangeFetchResponse>(
+ TestSupport.GetIdentityUrl(TestSupport.Scenarios.ExtensionFullCooperation, Version), request);
+ Assert.IsNotNull(response);
+ }
+
+ [Test]
+ public void Store() {
+ var request = new AttributeExchangeStoreRequest();
+ var response = ParameterizedTest<AttributeExchangeStoreResponse>(
+ TestSupport.GetIdentityUrl(TestSupport.Scenarios.ExtensionFullCooperation, Version), request);
+ Assert.IsNotNull(response);
+ }
+ }
+}
diff --git a/src/DotNetOpenId.Test/Extensions/ExtensionTestBase.cs b/src/DotNetOpenId.Test/Extensions/ExtensionTestBase.cs
new file mode 100644
index 0000000..adb93bb
--- /dev/null
+++ b/src/DotNetOpenId.Test/Extensions/ExtensionTestBase.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using DotNetOpenId.RelyingParty;
+using NUnit.Framework;
+using System.Net;
+using DotNetOpenId.Extensions;
+using System.IO;
+using System.Diagnostics;
+
+namespace DotNetOpenId.Test.Extensions {
+ public class ExtensionTestBase {
+ protected IRelyingPartyApplicationStore Store;
+ protected const ProtocolVersion Version = ProtocolVersion.V20;
+
+ [SetUp]
+ public virtual void Setup() {
+ Store = new ApplicationMemoryStore();
+ }
+
+ protected T ParameterizedTest<T>(Identifier identityUrl, IExtensionRequest extensionArgs)
+ where T : IExtensionResponse, new() {
+ Debug.Assert(identityUrl != null);
+ var returnTo = TestSupport.GetFullUrl(TestSupport.ConsumerPage);
+ var realm = new Realm(TestSupport.GetFullUrl(TestSupport.ConsumerPage).AbsoluteUri);
+ var consumer = new OpenIdRelyingParty(Store, null);
+ var request = consumer.CreateRequest(identityUrl, realm, returnTo);
+ if (extensionArgs != null)
+ extensionArgs.AddToRequest(request);
+
+ HttpWebRequest providerRequest = (HttpWebRequest)WebRequest.Create(request.RedirectToProviderUrl);
+ providerRequest.AllowAutoRedirect = false;
+ Uri redirectUrl;
+ try {
+ using (HttpWebResponse providerResponse = (HttpWebResponse)providerRequest.GetResponse()) {
+ Assert.AreEqual(HttpStatusCode.Redirect, providerResponse.StatusCode);
+ redirectUrl = new Uri(providerResponse.Headers[HttpResponseHeader.Location]);
+ }
+ } catch (WebException ex) {
+ Trace.WriteLine(ex);
+ if (ex.Response != null) {
+ using (StreamReader sr = new StreamReader(ex.Response.GetResponseStream())) {
+ Trace.WriteLine(sr.ReadToEnd());
+ }
+ }
+ throw;
+ }
+ consumer = new OpenIdRelyingParty(Store, redirectUrl);
+ Assert.AreEqual(AuthenticationStatus.Authenticated, consumer.Response.Status);
+ Assert.AreEqual(identityUrl, consumer.Response.ClaimedIdentifier);
+ T r = new T();
+ return r.ReadFromResponse(consumer.Response) ? r : default(T);
+ }
+ }
+}
diff --git a/src/DotNetOpenId.Test/Extensions/SimpleRegistrationTests.cs b/src/DotNetOpenId.Test/Extensions/SimpleRegistrationTests.cs
new file mode 100644
index 0000000..1377a49
--- /dev/null
+++ b/src/DotNetOpenId.Test/Extensions/SimpleRegistrationTests.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using NUnit.Framework;
+using DotNetOpenId.Extensions;
+
+namespace DotNetOpenId.Test.Extensions {
+ [TestFixture]
+ public class SimpleRegistrationTests : ExtensionTestBase {
+ [Test]
+ public void None() {
+ var response = ParameterizedTest<SimpleRegistrationFieldValues>(
+ TestSupport.GetIdentityUrl(TestSupport.Scenarios.ExtensionFullCooperation, Version), null);
+ Assert.IsNull(response);
+ }
+
+ [Test]
+ public void Full() {
+ var request = new SimpleRegistrationRequestFields();
+ request.FullName = SimpleRegistrationRequest.Request;
+ request.Email = SimpleRegistrationRequest.Require;
+ var response = ParameterizedTest<SimpleRegistrationFieldValues>(
+ TestSupport.GetIdentityUrl(TestSupport.Scenarios.ExtensionFullCooperation, Version), request);
+ Assert.AreEqual("Andrew Arnott", response.FullName);
+ Assert.AreEqual("andrewarnott@gmail.com", response.Email);
+ }
+ [Test]
+ public void Partial() {
+ var request = new SimpleRegistrationRequestFields();
+ request.FullName = SimpleRegistrationRequest.Request;
+ request.Email = SimpleRegistrationRequest.Require;
+ var response = ParameterizedTest<SimpleRegistrationFieldValues>(
+ TestSupport.GetIdentityUrl(TestSupport.Scenarios.ExtensionPartialCooperation, Version), request);
+ Assert.IsNull(response.FullName);
+ Assert.AreEqual("andrewarnott@gmail.com", response.Email);
+ }
+ }
+}
diff --git a/src/DotNetOpenId.Test/ProfileFieldValuesTests.cs b/src/DotNetOpenId.Test/ProfileFieldValuesTests.cs
index 6834942..323b05b 100644
--- a/src/DotNetOpenId.Test/ProfileFieldValuesTests.cs
+++ b/src/DotNetOpenId.Test/ProfileFieldValuesTests.cs
@@ -18,7 +18,7 @@ using DotNetOpenId.Extensions;
namespace DotNetOpenId.Test {
[TestFixture]
public class ProfileFieldValuesTests {
- SimpleRegistrationFieldValues getFilledStruct() {
+ SimpleRegistrationFieldValues getFilledData() {
return new SimpleRegistrationFieldValues() {
BirthDate = new DateTime(2005, 2, 3),
Culture = new System.Globalization.CultureInfo("en-US"),
@@ -33,7 +33,7 @@ namespace DotNetOpenId.Test {
[Test]
public void BinarySerialization() {
- SimpleRegistrationFieldValues fields = getFilledStruct();
+ SimpleRegistrationFieldValues fields = getFilledData();
MemoryStream ms = new MemoryStream();
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, fields);
@@ -45,7 +45,7 @@ namespace DotNetOpenId.Test {
[Test]
public void XmlSerialization() {
- SimpleRegistrationFieldValues fields = getFilledStruct();
+ SimpleRegistrationFieldValues fields = getFilledData();
MemoryStream ms = new MemoryStream();
XmlSerializer xs = new XmlSerializer(typeof(SimpleRegistrationFieldValues));
xs.Serialize(ms, fields);
@@ -57,40 +57,48 @@ namespace DotNetOpenId.Test {
[Test]
public void TestEquals() {
- SimpleRegistrationFieldValues fields1 = getFilledStruct();
+ SimpleRegistrationFieldValues fields1 = getFilledData();
Assert.AreNotEqual(fields1, null);
Assert.AreNotEqual(fields1, "string");
- SimpleRegistrationFieldValues fields2 = fields1;
+ SimpleRegistrationFieldValues fields2 = getFilledData();
Assert.AreNotSame(fields1, fields2, "Test sanity check.");
Assert.AreEqual(fields1, fields2);
// go through each property and change it slightly and make sure it causes inequality.
fields2.Email += "q";
Assert.AreNotEqual(fields1, fields2);
- fields2 = fields1;
+ fields1.Email = fields2.Email;
+ Assert.AreEqual(fields1, fields2, "Test sanity check.");
fields2.BirthDate = DateTime.Now;
Assert.AreNotEqual(fields1, fields2);
- fields2 = fields1;
+ fields2.BirthDate = fields1.BirthDate;
+ Assert.AreEqual(fields1, fields2, "Test sanity check.");
fields2.Country += "q";
Assert.AreNotEqual(fields1, fields2);
- fields2 = fields1;
+ fields2.Country = fields1.Country;
+ Assert.AreEqual(fields1, fields2, "Test sanity check.");
fields2.FullName += "q";
Assert.AreNotEqual(fields1, fields2);
- fields2 = fields1;
+ fields2.FullName = fields1.FullName;
+ Assert.AreEqual(fields1, fields2, "Test sanity check.");
fields2.Gender = Gender.Female;
Assert.AreNotEqual(fields1, fields2);
- fields2 = fields1;
+ fields2.Gender = fields1.Gender;
+ Assert.AreEqual(fields1, fields2, "Test sanity check.");
fields2.Language = "gb";
Assert.AreNotEqual(fields1, fields2);
- fields2 = fields1;
+ fields2.Language = fields1.Language;
+ Assert.AreEqual(fields1, fields2, "Test sanity check.");
fields2.Nickname += "q";
Assert.AreNotEqual(fields1, fields2);
- fields2 = fields1;
+ fields2.Nickname = fields1.Nickname;
+ Assert.AreEqual(fields1, fields2, "Test sanity check.");
fields2.PostalCode += "q";
Assert.AreNotEqual(fields1, fields2);
- fields2 = fields1;
+ fields2.PostalCode = fields1.PostalCode;
+ Assert.AreEqual(fields1, fields2, "Test sanity check.");
fields2.TimeZone += "q";
Assert.AreNotEqual(fields1, fields2);
}
diff --git a/src/DotNetOpenId.Test/TestSupport.cs b/src/DotNetOpenId.Test/TestSupport.cs
index 33e3935..747c83a 100644
--- a/src/DotNetOpenId.Test/TestSupport.cs
+++ b/src/DotNetOpenId.Test/TestSupport.cs
@@ -20,9 +20,20 @@ public class TestSupport {
public const string MobileConsumerPage = "RelyingPartyMobile.aspx";
public const string ConsumerPage = "RelyingParty.aspx";
public enum Scenarios {
+ // Authentication test scenarios
AutoApproval,
ApproveOnSetup,
AlwaysDeny,
+
+ // Extension test scenarios
+ /// <summary>
+ /// Provides all required and requested fields.
+ /// </summary>
+ ExtensionFullCooperation,
+ /// <summary>
+ /// Provides only those fields marked as required.
+ /// </summary>
+ ExtensionPartialCooperation,
}
internal static UriIdentifier GetIdentityUrl(Scenarios scenario, ProtocolVersion providerVersion) {
UriBuilder builder = new UriBuilder(Host.BaseUri);
diff --git a/src/DotNetOpenId.TestWeb/ProviderEndpoint.aspx.cs b/src/DotNetOpenId.TestWeb/ProviderEndpoint.aspx.cs
index 5743628..10cb735 100644
--- a/src/DotNetOpenId.TestWeb/ProviderEndpoint.aspx.cs
+++ b/src/DotNetOpenId.TestWeb/ProviderEndpoint.aspx.cs
@@ -9,13 +9,40 @@ using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Collections.Specialized;
+using DotNetOpenId.Extensions;
public partial class ProviderEndpoint : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) {
}
+ void respondToExtensions(DotNetOpenId.Provider.IRequest request, TestSupport.Scenarios scenario) {
+ var sregRequest = SimpleRegistrationRequestFields.ReadFromRequest(request);
+ var sregResponse = new SimpleRegistrationFieldValues();
+ var aeFetchRequest = AttributeExchangeFetchRequest.ReadFromRequest(request);
+ var aeFetchResponse = new AttributeExchangeFetchResponse();
+ var aeStoreRequest = AttributeExchangeStoreRequest.ReadFromRequest(request);
+ var aeStoreResponse = new AttributeExchangeStoreResponse();
+ switch (scenario) {
+ case TestSupport.Scenarios.ExtensionFullCooperation:
+ if (sregRequest.FullName != SimpleRegistrationRequest.NoRequest)
+ sregResponse.FullName = "Andrew Arnott";
+ if (sregRequest.Email != SimpleRegistrationRequest.NoRequest)
+ sregResponse.Email = "andrewarnott@gmail.com";
+ break;
+ case TestSupport.Scenarios.ExtensionPartialCooperation:
+ if (sregRequest.FullName == SimpleRegistrationRequest.Require)
+ sregResponse.FullName = "Andrew Arnott";
+ if (sregRequest.Email == SimpleRegistrationRequest.Require)
+ sregResponse.Email = "andrewarnott@gmail.com";
+ break;
+ }
+ sregResponse.AddToResponse(request);
+ if (aeFetchRequest != null) aeFetchResponse.AddToResponse(request);
+ if (aeStoreRequest != null) aeStoreResponse.AddToResponse(request);
+ }
+
protected void ProviderEndpoint1_AuthenticationChallenge(object sender, DotNetOpenId.Provider.AuthenticationChallengeEventArgs e) {
- TestSupport.Scenarios scenario = (TestSupport.Scenarios)Enum.Parse(typeof(TestSupport.Scenarios),
+ TestSupport.Scenarios scenario = (TestSupport.Scenarios)Enum.Parse(typeof(TestSupport.Scenarios),
new Uri(e.Request.LocalIdentifier.ToString()).AbsolutePath.TrimStart('/'));
switch (scenario) {
case TestSupport.Scenarios.AutoApproval:
@@ -28,6 +55,11 @@ public partial class ProviderEndpoint : System.Web.UI.Page {
case TestSupport.Scenarios.AlwaysDeny:
e.Request.IsAuthenticated = false;
break;
+ case TestSupport.Scenarios.ExtensionFullCooperation:
+ case TestSupport.Scenarios.ExtensionPartialCooperation:
+ respondToExtensions(e.Request, scenario);
+ e.Request.IsAuthenticated = true;
+ break;
default:
throw new InvalidOperationException("Unrecognized scenario");
}
diff --git a/src/DotNetOpenId.TestWeb/web.config b/src/DotNetOpenId.TestWeb/web.config
index 47684a1..c6d7cdd 100644
--- a/src/DotNetOpenId.TestWeb/web.config
+++ b/src/DotNetOpenId.TestWeb/web.config
@@ -1,8 +1,84 @@
<?xml version="1.0"?>
<configuration>
+ <configSections>
+ <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
+ <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
+ <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
+ <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
+ <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/>
+ <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
+ <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
+ <section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
+ </sectionGroup>
+ </sectionGroup>
+ </sectionGroup>
+ </configSections>
<system.web>
- <compilation debug="true"/>
- <authentication mode="Windows" />
- <customErrors mode="Off" />
+ <compilation debug="true">
+ <assemblies>
+ <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
+ <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
+ <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
+ <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
+ </assemblies>
+ </compilation>
+ <authentication mode="Windows"/>
+ <customErrors mode="Off"/>
+ <pages>
+ <controls>
+ <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
+ <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
+ </controls>
+ </pages>
+ <httpHandlers>
+ <remove verb="*" path="*.asmx"/>
+ <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
+ <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
+ <add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
+ </httpHandlers>
+ <httpModules>
+ <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
+ </httpModules>
</system.web>
+ <system.codedom>
+ <compilers>
+ <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
+ <providerOption name="CompilerVersion" value="v3.5"/>
+ <providerOption name="WarnAsError" value="false"/>
+ </compiler>
+ <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
+ <providerOption name="CompilerVersion" value="v3.5"/>
+ <providerOption name="OptionInfer" value="true"/>
+ <providerOption name="WarnAsError" value="false"/>
+ </compiler>
+ </compilers>
+ </system.codedom>
+ <system.webServer>
+ <validation validateIntegratedModeConfiguration="false"/>
+ <modules>
+ <remove name="ScriptModule"/>
+ <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
+ </modules>
+ <handlers>
+ <remove name="WebServiceHandlerFactory-Integrated"/>
+ <remove name="ScriptHandlerFactory"/>
+ <remove name="ScriptHandlerFactoryAppServices"/>
+ <remove name="ScriptResource"/>
+ <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
+ <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
+ <add name="ScriptResource" verb="GET,HEAD" path="ScriptResource.axd" preCondition="integratedMode" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
+ </handlers>
+ </system.webServer>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
+ <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>
+ <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
</configuration>
diff --git a/src/DotNetOpenId.sln b/src/DotNetOpenId.sln
index a306b68..e345789 100644
--- a/src/DotNetOpenId.sln
+++ b/src/DotNetOpenId.sln
@@ -21,7 +21,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{48A9
EndProject
Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "DotNetOpenId.TestWeb", "DotNetOpenId.TestWeb", "{C733BE07-37B5-4328-8C1A-81F129670E6E}"
ProjectSection(WebsiteProperties) = preProject
- TargetFramework = "2.0"
+ TargetFramework = "3.5"
ProjectReferences = "{CDEE655B-3902-420E-ADED-F4B6F666FB03}|DotNetOpenId.Test.dll;{5D6EDC86-F5B2-4786-8376-4E7C24C63D39}|DotNetOpenId.dll;"
Debug.AspNetCompiler.VirtualPath = "/DotNetOpenId.TestWeb"
Debug.AspNetCompiler.PhysicalPath = "DotNetOpenId.TestWeb\"
diff --git a/src/DotNetOpenId/DotNetOpenId.csproj b/src/DotNetOpenId/DotNetOpenId.csproj
index e6f0d5f..696dee7 100644
--- a/src/DotNetOpenId/DotNetOpenId.csproj
+++ b/src/DotNetOpenId/DotNetOpenId.csproj
@@ -57,6 +57,7 @@
<Compile Include="Extensions\AttributeExchangeFetchRequest.cs" />
<Compile Include="Extensions\AttributeExchangeStoreRequest.cs" />
<Compile Include="Extensions\AttributeExchangeStoreResponse.cs" />
+ <Compile Include="Extensions\IExtension.cs" />
<Compile Include="HmacSha256Association.cs" />
<Compile Include="Identifier.cs" />
<Compile Include="Protocol.cs" />
diff --git a/src/DotNetOpenId/Extensions/AttributeExchangeFetchRequest.cs b/src/DotNetOpenId/Extensions/AttributeExchangeFetchRequest.cs
index ad27769..245f19a 100644
--- a/src/DotNetOpenId/Extensions/AttributeExchangeFetchRequest.cs
+++ b/src/DotNetOpenId/Extensions/AttributeExchangeFetchRequest.cs
@@ -1,27 +1,45 @@
using System;
using System.Collections.Generic;
using System.Text;
-using DotNetOpenId.RelyingParty;
+using System.Globalization;
namespace DotNetOpenId.Extensions {
/// <summary>
/// The Attribute Exchange Fetch message, request leg.
/// </summary>
- public struct AttributeExchangeFetchRequest {
- /// <summary>
- /// Adds the properties of this Attribute Exchange request to an outgoing
- /// OpenID authentication request.
- /// </summary>
- public void AddToRequest(Provider.IAuthenticationRequest authenticationRequest) {
- throw new NotImplementedException();
- }
+ public class AttributeExchangeFetchRequest : IExtensionRequest {
+ readonly string Mode = "fetch_request";
+
/// <summary>
/// Reads an incoming authentication request (from a relying party)
/// for Attribute Exchange properties and returns an instance of this
/// struct with them.
/// </summary>
- public static AttributeExchangeFetchRequest ReadFromRequest(IAuthenticationResponse response) {
- throw new NotImplementedException();
+ public static AttributeExchangeFetchRequest ReadFromRequest(Provider.IRequest request) {
+ var obj = new AttributeExchangeFetchRequest();
+ return ((IExtensionRequest)obj).ReadFromRequest(request) ? obj : null;
}
+
+ #region IExtensionRequest Members
+ string IExtensionRequest.TypeUri { get { return Constants.ae.ns; } }
+
+ public void AddToRequest(RelyingParty.IAuthenticationRequest authenticationRequest) {
+ var fields = new Dictionary<string, string> {
+ { "mode", Mode },
+ };
+ authenticationRequest.AddExtensionArguments(Constants.ae.ns, fields);
+ }
+
+ bool IExtensionRequest.ReadFromRequest(DotNetOpenId.Provider.IRequest request) {
+ var fields = request.GetExtensionArguments(Constants.ae.ns);
+ if (fields == null) return false;
+ string mode;
+ fields.TryGetValue("mode", out mode);
+ if (mode != Mode) return false;
+
+ return true;
+ }
+
+ #endregion
}
}
diff --git a/src/DotNetOpenId/Extensions/AttributeExchangeFetchResponse.cs b/src/DotNetOpenId/Extensions/AttributeExchangeFetchResponse.cs
index 4e7dbc2..db72875 100644
--- a/src/DotNetOpenId/Extensions/AttributeExchangeFetchResponse.cs
+++ b/src/DotNetOpenId/Extensions/AttributeExchangeFetchResponse.cs
@@ -2,25 +2,44 @@
using System.Collections.Generic;
using System.Text;
using DotNetOpenId.RelyingParty;
+using System.Globalization;
namespace DotNetOpenId.Extensions {
/// <summary>
/// The Attribute Exchange Fetch message, response leg.
/// </summary>
- public struct AttributeExchangeFetchResponse {
- /// <summary>
- /// Adds the values of this struct to an authentication response being prepared
- /// by an OpenID Provider.
- /// </summary>
- public void AddToResponse(Provider.IAuthenticationRequest authenticationRequest) {
- throw new NotImplementedException();
- }
+ public class AttributeExchangeFetchResponse : IExtensionResponse {
+ readonly string Mode = "fetch_response";
+
/// <summary>
/// Reads a Provider's response for Attribute Exchange values and returns
/// an instance of this struct with the values.
/// </summary>
public static AttributeExchangeFetchResponse ReadFromResponse(IAuthenticationResponse response) {
- throw new NotImplementedException();
+ var obj = new AttributeExchangeFetchResponse();
+ return ((IExtensionResponse)obj).ReadFromResponse(response) ? obj : null;
+ }
+
+ #region IExtensionResponse Members
+ string IExtensionResponse.TypeUri { get { return Constants.ae.ns; } }
+
+ public void AddToResponse(Provider.IRequest authenticationRequest) {
+ var fields = new Dictionary<string, string> {
+ { "mode", Mode },
+ };
+ authenticationRequest.AddExtensionArguments(Constants.ae.ns, fields);
}
+
+ bool IExtensionResponse.ReadFromResponse(IAuthenticationResponse response) {
+ var fields = response.GetExtensionArguments(Constants.ae.ns);
+ if (fields == null) return false;
+ string mode;
+ fields.TryGetValue("mode", out mode);
+ if (mode != Mode) return false;
+
+ return true;
+ }
+
+ #endregion
}
}
diff --git a/src/DotNetOpenId/Extensions/AttributeExchangeStoreRequest.cs b/src/DotNetOpenId/Extensions/AttributeExchangeStoreRequest.cs
index 1fdc715..0523d6c 100644
--- a/src/DotNetOpenId/Extensions/AttributeExchangeStoreRequest.cs
+++ b/src/DotNetOpenId/Extensions/AttributeExchangeStoreRequest.cs
@@ -2,26 +2,45 @@
using System.Collections.Generic;
using System.Text;
using DotNetOpenId.RelyingParty;
+using System.Globalization;
namespace DotNetOpenId.Extensions {
/// <summary>
/// The Attribute Exchange Store message, request leg.
/// </summary>
- public struct AttributeExchangeStoreRequest {
- /// <summary>
- /// Adds the properties of this Attribute Exchange request to an outgoing
- /// OpenID authentication request.
- /// </summary>
- public void AddToRequest(Provider.IAuthenticationRequest authenticationRequest) {
- throw new NotImplementedException();
- }
+ public class AttributeExchangeStoreRequest : IExtensionRequest {
+ readonly string Mode = "store_request";
+
/// <summary>
/// Reads an incoming authentication request (from a relying party)
/// for Attribute Exchange properties and returns an instance of this
/// struct with them.
/// </summary>
- public static AttributeExchangeStoreRequest ReadFromRequest(IAuthenticationResponse response) {
- throw new NotImplementedException();
+ public static AttributeExchangeStoreRequest ReadFromRequest(Provider.IRequest request) {
+ var obj = new AttributeExchangeStoreRequest();
+ return ((IExtensionRequest)obj).ReadFromRequest(request) ? obj : null;
}
+
+ #region IExtensionRequest Members
+ string IExtensionRequest.TypeUri { get { return Constants.ae.ns; } }
+
+ public void AddToRequest(RelyingParty.IAuthenticationRequest authenticationRequest) {
+ var fields = new Dictionary<string, string> {
+ { "mode", Mode },
+ };
+ authenticationRequest.AddExtensionArguments(Constants.ae.ns, fields);
+ }
+
+ bool IExtensionRequest.ReadFromRequest(DotNetOpenId.Provider.IRequest request) {
+ var fields = request.GetExtensionArguments(Constants.ae.ns);
+ if (fields == null) return false;
+ string mode;
+ fields.TryGetValue("mode", out mode);
+ if (mode != Mode) return false;
+
+ return true;
+ }
+
+ #endregion
}
}
diff --git a/src/DotNetOpenId/Extensions/AttributeExchangeStoreResponse.cs b/src/DotNetOpenId/Extensions/AttributeExchangeStoreResponse.cs
index b28d2be..dbdbabd 100644
--- a/src/DotNetOpenId/Extensions/AttributeExchangeStoreResponse.cs
+++ b/src/DotNetOpenId/Extensions/AttributeExchangeStoreResponse.cs
@@ -2,25 +2,44 @@
using System.Collections.Generic;
using System.Text;
using DotNetOpenId.RelyingParty;
+using System.Globalization;
namespace DotNetOpenId.Extensions {
/// <summary>
/// The Attribute Exchange Store message, response leg.
/// </summary>
- public struct AttributeExchangeStoreResponse {
- /// <summary>
- /// Adds the values of this struct to an authentication response being prepared
- /// by an OpenID Provider.
- /// </summary>
- public void AddToResponse(Provider.IAuthenticationRequest authenticationRequest) {
- throw new NotImplementedException();
- }
+ public class AttributeExchangeStoreResponse : IExtensionResponse {
+ readonly string Mode = "store_response";
+
/// <summary>
/// Reads a Provider's response for Attribute Exchange values and returns
/// an instance of this struct with the values.
/// </summary>
public static AttributeExchangeStoreResponse ReadFromResponse(IAuthenticationResponse response) {
- throw new NotImplementedException();
+ var obj = new AttributeExchangeStoreResponse();
+ return ((IExtensionResponse)obj).ReadFromResponse(response) ? obj : null;
+ }
+
+ #region IExtensionResponse Members
+ string IExtensionResponse.TypeUri { get { return Constants.ae.ns; } }
+
+ public void AddToResponse(Provider.IRequest authenticationRequest) {
+ var fields = new Dictionary<string, string> {
+ { "mode", Mode },
+ };
+ authenticationRequest.AddExtensionArguments(Constants.ae.ns, fields);
}
+
+ bool IExtensionResponse.ReadFromResponse(IAuthenticationResponse response) {
+ var fields = response.GetExtensionArguments(Constants.ae.ns);
+ if (fields == null) return false;
+ string mode;
+ fields.TryGetValue("mode", out mode);
+ if (mode != Mode) return false;
+
+ return true;
+ }
+
+ #endregion
}
}
diff --git a/src/DotNetOpenId/Extensions/IExtension.cs b/src/DotNetOpenId/Extensions/IExtension.cs
new file mode 100644
index 0000000..1f3480b
--- /dev/null
+++ b/src/DotNetOpenId/Extensions/IExtension.cs
@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace DotNetOpenId.Extensions {
+ /// <summary>
+ /// The contract an OpenID extension can implement for messages from relying party to provider
+ /// to make handling extensions generally easier.
+ /// Extensions are not required to implement this interface, however.
+ /// </summary>
+ public interface IExtensionRequest {
+ /// <summary>
+ /// Gets the TypeURI the extension uses in the OpenID protocol and in XRDS advertisements.
+ /// </summary>
+ string TypeUri { get; }
+ /// <summary>
+ /// Adds the properties of this Attribute Exchange request to an outgoing
+ /// OpenID authentication request.
+ /// </summary>
+ void AddToRequest(RelyingParty.IAuthenticationRequest authenticationRequest);
+ /// <summary>
+ /// Reads the extension information on an authentication request to the provider.
+ /// </summary>
+ /// <returns>True if the extension found any of its parameters in the request.</returns>
+ bool ReadFromRequest(Provider.IRequest request);
+ }
+
+ /// <summary>
+ /// The contract an OpenID extension can implement for messages from provider to relying party
+ /// to make handling extensions generally easier.
+ /// Extensions are not required to implement this interface, however.
+ /// </summary>
+ public interface IExtensionResponse {
+ /// <summary>
+ /// Gets the TypeURI the extension uses in the OpenID protocol and in XRDS advertisements.
+ /// </summary>
+ string TypeUri { get; }
+ /// <summary>
+ /// Adds the values of this struct to an authentication response being prepared
+ /// by an OpenID Provider.
+ /// </summary>
+ void AddToResponse(Provider.IRequest authenticationRequest);
+ /// <summary>
+ /// Reads a Provider's response for extension values.
+ /// </summary>
+ /// <returns>True if the extension found any of its parameters in the response.</returns>
+ bool ReadFromResponse(RelyingParty.IAuthenticationResponse response);
+ }
+}
diff --git a/src/DotNetOpenId/Extensions/SimpleRegistrationFieldValues.cs b/src/DotNetOpenId/Extensions/SimpleRegistrationFieldValues.cs
index f7cf70d..e6fbe21 100644
--- a/src/DotNetOpenId/Extensions/SimpleRegistrationFieldValues.cs
+++ b/src/DotNetOpenId/Extensions/SimpleRegistrationFieldValues.cs
@@ -22,14 +22,9 @@ namespace DotNetOpenId.Extensions
/// authenticating user.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2218:OverrideGetHashCodeOnOverridingEquals"), Serializable()]
- public struct SimpleRegistrationFieldValues
+ public class SimpleRegistrationFieldValues : IExtensionResponse
{
/// <summary>
- /// An empty struct. Useful for comparisons.
- /// </summary>
- public static readonly SimpleRegistrationFieldValues Empty = new SimpleRegistrationFieldValues();
-
- /// <summary>
/// The nickname the user goes by.
/// </summary>
public string Nickname { get; set; }
@@ -109,11 +104,23 @@ namespace DotNetOpenId.Extensions
public string TimeZone { get; set; }
/// <summary>
+ /// Reads a Provider's response for Simple Registration values and returns
+ /// an instance of this struct with the values.
+ /// </summary>
+ public static SimpleRegistrationFieldValues ReadFromResponse(IAuthenticationResponse response) {
+ var obj = new SimpleRegistrationFieldValues();
+ return ((IExtensionResponse)obj).ReadFromResponse(response) ? obj : null;
+ }
+
+ #region IExtensionResponse Members
+ string IExtensionResponse.TypeUri { get { return Constants.sreg.sreg_ns; } }
+
+ /// <summary>
/// Adds the values of this struct to an authentication response being prepared
/// by an OpenID Provider.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters")]
- public void AddToResponse(Provider.IAuthenticationRequest authenticationRequest) {
+ public void AddToResponse(Provider.IRequest authenticationRequest) {
if (authenticationRequest == null) throw new ArgumentNullException("authenticationRequest");
Dictionary<string, string> fields = new Dictionary<string, string>();
if (BirthDate != null) {
@@ -149,48 +156,44 @@ namespace DotNetOpenId.Extensions
}
authenticationRequest.AddExtensionArguments(Constants.sreg.sreg_ns, fields);
}
- /// <summary>
- /// Reads a Provider's response for Simple Registration values and returns
- /// an instance of this struct with the values.
- /// </summary>
- public static SimpleRegistrationFieldValues ReadFromResponse(IAuthenticationResponse response) {
+
+ bool IExtensionResponse.ReadFromResponse(IAuthenticationResponse response) {
var sreg = response.GetExtensionArguments(Constants.sreg.sreg_ns);
- if (sreg == null) return new SimpleRegistrationFieldValues();
+ if (sreg == null) return false;
string nickname, email, fullName, dob, genderString, postalCode, country, language, timeZone;
- DateTime? birthDate = null;
- Gender? gender = null;
+ BirthDate = null;
+ Gender = null;
sreg.TryGetValue(Constants.sreg.nickname, out nickname);
+ Nickname = nickname;
sreg.TryGetValue(Constants.sreg.email, out email);
+ Email = email;
sreg.TryGetValue(Constants.sreg.fullname, out fullName);
+ FullName = fullName;
if (sreg.TryGetValue(Constants.sreg.dob, out dob)) {
DateTime bd;
if (DateTime.TryParse(dob, out bd))
- birthDate = bd;
+ BirthDate = bd;
}
if (sreg.TryGetValue(Constants.sreg.gender, out genderString)) {
switch (genderString) {
- case Constants.sreg.Genders.Male: gender = DotNetOpenId.Extensions.Gender.Male; break;
- case Constants.sreg.Genders.Female: gender = DotNetOpenId.Extensions.Gender.Female; break;
+ case Constants.sreg.Genders.Male: Gender = DotNetOpenId.Extensions.Gender.Male; break;
+ case Constants.sreg.Genders.Female: Gender = DotNetOpenId.Extensions.Gender.Female; break;
}
}
sreg.TryGetValue(Constants.sreg.postcode, out postalCode);
+ PostalCode = postalCode;
sreg.TryGetValue(Constants.sreg.country, out country);
+ Country = country;
sreg.TryGetValue(Constants.sreg.language, out language);
+ Language = language;
sreg.TryGetValue(Constants.sreg.timezone, out timeZone);
+ TimeZone = timeZone;
- return new SimpleRegistrationFieldValues() {
- Nickname = nickname,
- Email = email,
- FullName = fullName,
- BirthDate = birthDate,
- Gender = gender,
- PostalCode = postalCode,
- Country = country,
- Language = language,
- TimeZone = timeZone,
- };
+ return true;
}
+ #endregion
+
/// <summary>
/// Tests equality of two <see cref="SimpleRegistrationFieldValues"/> objects.
/// </summary>
@@ -228,5 +231,6 @@ namespace DotNetOpenId.Extensions
if (one == null ^ other == null) return false;
return one.Equals(other);
}
+
}
} \ No newline at end of file
diff --git a/src/DotNetOpenId/Extensions/SimpleRegistrationRequestFields.cs b/src/DotNetOpenId/Extensions/SimpleRegistrationRequestFields.cs
index 1b125ce..32be3c9 100644
--- a/src/DotNetOpenId/Extensions/SimpleRegistrationRequestFields.cs
+++ b/src/DotNetOpenId/Extensions/SimpleRegistrationRequestFields.cs
@@ -12,12 +12,7 @@ namespace DotNetOpenId.Extensions {
/// </summary>
#pragma warning disable 0659, 0661
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2218:OverrideGetHashCodeOnOverridingEquals")]
- public struct SimpleRegistrationRequestFields {
- /// <summary>
- /// Gets a <see cref="SimpleRegistrationRequestFields"/> struct where no information is requested.
- /// </summary>
- public static readonly SimpleRegistrationRequestFields None = new SimpleRegistrationRequestFields();
-
+ public class SimpleRegistrationRequestFields : IExtensionRequest {
/// <summary>
/// The level of interest a relying party has in the nickname of the user.
/// </summary>
@@ -135,28 +130,37 @@ namespace DotNetOpenId.Extensions {
/// and returns information on what profile fields the consumer is requesting/requiring.
/// </summary>
public static SimpleRegistrationRequestFields ReadFromRequest(IRequest request) {
- SimpleRegistrationRequestFields fields = new SimpleRegistrationRequestFields();
+ var fields = new SimpleRegistrationRequestFields();
+ ((IExtensionRequest)fields).ReadFromRequest(request);
+ return fields;
+ }
+
+ #region IExtensionRequest Members
+ string IExtensionRequest.TypeUri { get { return Constants.sreg.sreg_ns; } }
+
+ bool IExtensionRequest.ReadFromRequest(IRequest request) {
var args = request.GetExtensionArguments(Constants.sreg.sreg_ns);
- if (args == null) return fields;
+ if (args == null) return false;
string policyUrl;
if (args.TryGetValue(Constants.sreg.policy_url, out policyUrl)
&& !string.IsNullOrEmpty(policyUrl)) {
- fields.PolicyUrl = new Uri(policyUrl);
+ PolicyUrl = new Uri(policyUrl);
}
string optionalFields;
if (args.TryGetValue(Constants.sreg.optional, out optionalFields)) {
- fields.SetProfileRequestFromList(optionalFields.Split(','), SimpleRegistrationRequest.Request);
+ SetProfileRequestFromList(optionalFields.Split(','), SimpleRegistrationRequest.Request);
}
string requiredFields;
if (args.TryGetValue(Constants.sreg.required, out requiredFields)) {
- fields.SetProfileRequestFromList(requiredFields.Split(','), SimpleRegistrationRequest.Require);
+ SetProfileRequestFromList(requiredFields.Split(','), SimpleRegistrationRequest.Require);
}
- return fields;
+ return true;
}
+
/// <summary>
/// Adds a description of the information the relying party site would like
/// the Provider to include with a positive authentication assertion as an
@@ -172,6 +176,7 @@ namespace DotNetOpenId.Extensions {
request.AddExtensionArguments(Constants.sreg.sreg_ns, fields);
}
+ #endregion
/// <summary>
/// Renders the requested information as a string.
diff --git a/src/DotNetOpenId/Strings.Designer.cs b/src/DotNetOpenId/Strings.Designer.cs
index 89d8c82..549033e 100644
--- a/src/DotNetOpenId/Strings.Designer.cs
+++ b/src/DotNetOpenId/Strings.Designer.cs
@@ -187,6 +187,15 @@ namespace DotNetOpenId {
}
/// <summary>
+ /// Looks up a localized string similar to OpenID extension {0} parameter {1} had unexpected value &apos;{2}&apos;..
+ /// </summary>
+ internal static string InvalidOpenIdExtensionParameterValue {
+ get {
+ return ResourceManager.GetString("InvalidOpenIdExtensionParameterValue", resourceCulture);
+ }
+ }
+
+ /// <summary>
/// Looks up a localized string similar to OpenID parameter &apos;{0}&apos; had unexpected value &apos;{1}&apos;..
/// </summary>
internal static string InvalidOpenIdQueryParameterValue {
diff --git a/src/DotNetOpenId/Strings.resx b/src/DotNetOpenId/Strings.resx
index 8f57a1e..9c11ef2 100644
--- a/src/DotNetOpenId/Strings.resx
+++ b/src/DotNetOpenId/Strings.resx
@@ -159,6 +159,9 @@
<data name="InvalidNonce" xml:space="preserve">
<value>The nonce was not in the expected format.</value>
</data>
+ <data name="InvalidOpenIdExtensionParameterValue" xml:space="preserve">
+ <value>OpenID extension {0} parameter {1} had unexpected value '{2}'.</value>
+ </data>
<data name="InvalidOpenIdQueryParameterValue" xml:space="preserve">
<value>OpenID parameter '{0}' had unexpected value '{1}'.</value>
</data>