summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--projecttemplates/MvcRelyingParty/Views/Account/LogOnContent.ascx12
-rw-r--r--src/DotNetOpenAuth/Mvc/OpenIdHelper.cs37
-rw-r--r--src/DotNetOpenAuth/OpenId/RelyingParty/SelectorOpenIdButton.cs12
-rw-r--r--src/DotNetOpenAuth/OpenId/RelyingParty/SelectorProviderButton.cs15
4 files changed, 70 insertions, 6 deletions
diff --git a/projecttemplates/MvcRelyingParty/Views/Account/LogOnContent.ascx b/projecttemplates/MvcRelyingParty/Views/Account/LogOnContent.ascx
index b86afc6..145a4f0 100644
--- a/projecttemplates/MvcRelyingParty/Views/Account/LogOnContent.ascx
+++ b/projecttemplates/MvcRelyingParty/Views/Account/LogOnContent.ascx
@@ -1,5 +1,6 @@
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<%@ Import Namespace="DotNetOpenAuth.Mvc" %>
+<%@ Import Namespace="DotNetOpenAuth.OpenId.RelyingParty" %>
<p>Login using an account you already use. </p>
<%= Html.ValidationSummary("Login was unsuccessful. Please correct the errors and try again.") %>
@@ -8,12 +9,11 @@
<%= Html.Hidden("ReturnUrl", Request.QueryString["ReturnUrl"], new { id = "ReturnUrl" }) %>
<%= Html.Hidden("openid_openidAuthData") %>
<div>
- <ul class="OpenIdProviders">
- <%= Html.OpenIdSelectorOPButton(this.Page, "https://me.yahoo.com/", Url.Content("~/Content/images/yahoo.gif"))%>
- <%= Html.OpenIdSelectorOPButton(this.Page, "https://www.google.com/accounts/o8/id", Url.Content("~/Content/images/google.gif")) %>
- <%= Html.OpenIdSelectorOpenIdButton(this.Page, Url.Content("~/Content/images/openid.gif")) %>
- </ul>
- <%= Html.OpenIdAjaxTextBox() %>
+<%= Html.OpenIdSelector(this.Page, new SelectorButton[] {
+ new SelectorProviderButton("https://me.yahoo.com/", Url.Content("~/Content/images/yahoo.gif")),
+ new SelectorProviderButton("https://www.google.com/accounts/o8/id", Url.Content("~/Content/images/google.gif")),
+ new SelectorOpenIdButton(Url.Content("~/Content/images/openid.gif")),
+}) %>
<div class="helpDoc">
<p>
diff --git a/src/DotNetOpenAuth/Mvc/OpenIdHelper.cs b/src/DotNetOpenAuth/Mvc/OpenIdHelper.cs
index b5ade50..8ee1781 100644
--- a/src/DotNetOpenAuth/Mvc/OpenIdHelper.cs
+++ b/src/DotNetOpenAuth/Mvc/OpenIdHelper.cs
@@ -151,6 +151,43 @@ window.openid_trace = {1}; // causes lots of messages",
return OpenIdSelectorButton(html, page, "OpenIDButton", "OpenIDButton", imageUrl);
}
+ public static string OpenIdSelector(this HtmlHelper html, Page page, params SelectorButton[] buttons) {
+ Contract.Requires<ArgumentNullException>(html != null);
+ Contract.Requires<ArgumentNullException>(page != null);
+ Contract.Requires<ArgumentNullException>(buttons != null);
+ Contract.Ensures(Contract.Result<string>() != null);
+
+ var writer = new StringWriter();
+ var h = new HtmlTextWriter(writer);
+
+ h.AddAttribute(HtmlTextWriterAttribute.Class, "OpenIdProviders");
+ h.RenderBeginTag(HtmlTextWriterTag.Ul);
+
+ foreach (SelectorButton button in buttons) {
+ var op = button as SelectorProviderButton;
+ if (op != null) {
+ h.Write(OpenIdSelectorOPButton(html, page, op.OPIdentifier, op.Image));
+ continue;
+ }
+
+ var openid = button as SelectorOpenIdButton;
+ if (openid != null) {
+ h.Write(OpenIdSelectorOpenIdButton(html, page, openid.Image));
+ continue;
+ }
+
+ ErrorUtilities.VerifySupported(false, "The {0} button is not yet supported for MVC.", button.GetType().Name);
+ }
+
+ h.RenderEndTag(); // ul
+
+ if (buttons.OfType<SelectorOpenIdButton>().Any()) {
+ h.Write(OpenIdAjaxTextBox(html));
+ }
+
+ return writer.ToString();
+ }
+
public static string OpenIdAjaxTextBox(this HtmlHelper html) {
return @"<div style='display: none' id='OpenIDForm'>
<span class='OpenIdAjaxTextBox' style='display: inline-block; position: relative; font-size: 16px'>
diff --git a/src/DotNetOpenAuth/OpenId/RelyingParty/SelectorOpenIdButton.cs b/src/DotNetOpenAuth/OpenId/RelyingParty/SelectorOpenIdButton.cs
index 15b6ca7..ac4dcbf 100644
--- a/src/DotNetOpenAuth/OpenId/RelyingParty/SelectorOpenIdButton.cs
+++ b/src/DotNetOpenAuth/OpenId/RelyingParty/SelectorOpenIdButton.cs
@@ -5,6 +5,7 @@
//-----------------------------------------------------------------------
namespace DotNetOpenAuth.OpenId.RelyingParty {
+ using System;
using System.ComponentModel;
using System.Diagnostics.Contracts;
using System.Drawing.Design;
@@ -24,6 +25,17 @@ namespace DotNetOpenAuth.OpenId.RelyingParty {
}
/// <summary>
+ /// Initializes a new instance of the <see cref="SelectorOpenIdButton"/> class.
+ /// </summary>
+ /// <param name="imageUrl">The image to display on the button.</param>
+ public SelectorOpenIdButton(string imageUrl)
+ : this() {
+ Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(imageUrl));
+
+ this.Image = imageUrl;
+ }
+
+ /// <summary>
/// Gets or sets the path to the image to display on the button's surface.
/// </summary>
/// <value>The virtual path to the image.</value>
diff --git a/src/DotNetOpenAuth/OpenId/RelyingParty/SelectorProviderButton.cs b/src/DotNetOpenAuth/OpenId/RelyingParty/SelectorProviderButton.cs
index 3a05287..2195e73 100644
--- a/src/DotNetOpenAuth/OpenId/RelyingParty/SelectorProviderButton.cs
+++ b/src/DotNetOpenAuth/OpenId/RelyingParty/SelectorProviderButton.cs
@@ -5,6 +5,7 @@
//-----------------------------------------------------------------------
namespace DotNetOpenAuth.OpenId.RelyingParty {
+ using System;
using System.ComponentModel;
using System.Diagnostics.Contracts;
using System.Drawing.Design;
@@ -25,6 +26,20 @@ namespace DotNetOpenAuth.OpenId.RelyingParty {
}
/// <summary>
+ /// Initializes a new instance of the <see cref="SelectorProviderButton"/> class.
+ /// </summary>
+ /// <param name="providerIdentifier">The OP Identifier.</param>
+ /// <param name="imageUrl">The image to display on the button.</param>
+ public SelectorProviderButton(Identifier providerIdentifier, string imageUrl)
+ : this() {
+ Contract.Requires<ArgumentNullException>(providerIdentifier != null);
+ Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(imageUrl));
+
+ this.OPIdentifier = providerIdentifier;
+ this.Image = imageUrl;
+ }
+
+ /// <summary>
/// Gets or sets the path to the image to display on the button's surface.
/// </summary>
/// <value>The virtual path to the image.</value>