I found a helpful ASP.NET OpenID control that lets you implement an OpenID login on your website. The instructions are a little weak so I thought I'd post a quick how-to here.
First you need to download the binaries and copy them into the bin folder of your web application.
- Boo.Lang.dll (because JanRain is written in Boo)
- JanRain.dll (an OpenID library for .NET)
- Mono.Security.dll
- NerdBank.Tools.dll (contains the ASP.NET control)
Then you simply register the assembly at the top of your aspx page:
<%@ Register Assembly="NerdBank.Tools" Namespace="NerdBank.Tools.WebControls" TagPrefix="nb" %>
And then insert the control:
<nb:OpenIdLogin ID="openIdLogin" runat="server"
RequestEmail="Request" RequestTimeZone="Request" RequestNickname="Request"
PolicyUrl="http://mysite.com/PrivacyPolicy.aspx" />
Here I have requested the email, timezone and nickname. I could also say Require for these if I absolutely must have them. You should also provide a privacy policy URL, or else the user will be warned that it is missing.
The control itself provides a Register link that is customizable, allowing users to sign up with an Open ID provider such as www.myopenid.com.
When you login, if you have entered a valid OpenID URL, you will go to your OpenID provider who will ask for your password if necessary, confirm whether you want to allow that site to log you in once, always or never, and ask you what persona you want to use.
On a successful login, you can retrieve the OpenID URL as well as anything from the persona that has been made available. Here's some sample code-behind.
protected void Page_Load(object sender, EventArgs e)
{
Uri openIdUri = Session["OpenIdUri"] as Uri;
if (openIdUri == null)
{
openIdLogin.LoggedIn += new EventHandler<NerdBank.Tools.WebControls.OpenIdTextBox.OpenIdEventArgs>(openIdLogin_LoggedIn);
openIdLogin.Visible = true;
}
else
{
openIdLogin.Visible = false;
Response.Write("Welcome " + openIdUri.ToString() + "<br />");
Response.Write("Email: " + Session["openIdEmail"] + "<br/>");
Response.Write("Nickname: " + Session["openIdNickname"] + "<br/>");
Response.Write("TimeZone: " + Session["openIdTimeZone"] + "<br/>");
}
}
void openIdLogin_LoggedIn(object sender, NerdBank.Tools.WebControls.OpenIdTextBox.OpenIdEventArgs e)
{
Session["OpenIdUri"] = e.OpenIdUri;
Session["OpenIdEmail"] = e.ProfileFields.Email;
Session["OpenIdNickname"] = e.ProfileFields.Nickname;
Session["OpenIdTimeZone"] = e.ProfileFields.TimeZone;
}
As you can see, it is pretty simple. I still need to work out how I am then going to integrate the OpenID login with my own site login database. The control itself also has a few limitations. In particular, entering an invalid URL causes an unhandled exception. It also doesn't give you an event for login failure (although there is a "logging in" event which I am not sure what it is for).