ASP.NET Web アプリケーションで DotNetOpenAuth を使って OpenID によるユーザ認証を行います。
DotNetOpenAuthは、OpenID, OAuth, InfoCardを簡単に使用する.NETのライブラリです。
DotNetOpenAuth
http://www.dotnetopenauth.net/
OpenIDは、Yahoo, Hatena, livedoor, mixiなどのアカウントを持っているならば、簡単に発行してもらえます。
下記コードでは「 http://profile.livedoor.com/YourID/ 」などと入力し、ログインボタンをクリックするとOpenIDによる認証を行うことができます。
demo1.aspx
<!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 runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="Identifier" runat="server"></asp:TextBox>
<asp:Button id="Login" runat="server" Text=" ログイン " EnableViewState="False" onclick="btnLogin_Click" /><br />
<asp:Label ID="Result" runat="server" Text=""></asp:Label>
</div>
</form>
</body>
</html>
demo1.aspx.cs
using System;
using DotNetOpenAuth.Messaging;
using DotNetOpenAuth.OpenId.RelyingParty;
namespace Test
{
public partial class demo1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//OpenIdRelyingPartyを作成
OpenIdRelyingParty rp = new OpenIdRelyingParty();
// IAuthenticationResponseを取得
var res = rp.GetResponse();
if (res != null)
{
if (res.Status == AuthenticationStatus.Authenticated)
{
Result.Text = "認証成功";
}
else
{
Result.Text = "認証失敗";
}
}
}
protected void btnLogin_Click(object sender, EventArgs e)
{
if (!this.Page.IsValid)
{
return;
}
using (OpenIdRelyingParty rp = new OpenIdRelyingParty())
{
try
{
// IAuthenticationRequestを作成
var req = rp.CreateRequest(Identifier.Text.Trim());
// OpenID Provider に リダイレクト
req.RedirectToProvider();
}
catch (ProtocolException ex)
{
Result.Text = "ERROR1:" + ex.Message;
}
}
}
}
}
はてなの場合、SREG(OpenID Simple Registration Extension)を使用してニックネームの取得が可能です。
Page_Load
Result.Text = "認証成功";
//ニックネームを取得する
ClaimsResponse cr = res.GetExtension<ClaimsResponse>();
if (cr != null)
{
Result.Text += cr.Nickname;
}
btnLogin_Click
// IAuthenticationRequestを作成
var req = rp.CreateRequest(Identifier.Text.Trim());
//ニックネームを要求する
req.AddExtension(new ClaimsRequest
{
Nickname = DemandLevel.Request
});
// OpenID Provider に リダイレクト
req.RedirectToProvider();
※Yahooはローカルで実行すると「このサイトには現在ログインできません。しばらく時間をおいてから再度お試しください。 」というエラーメッセージが表示されるかもしれません。