OpenIDでログインできるサイトを作成する4 †
今回もDotNetOpenIdを使用して、ASP.NETでOpenIDでログインできるサイトを作成する方法を紹介します。今回は、DotNetOpenIdで用意されているコントローラを一切使用しない方法です。
OpenIdRelyingPartyクラスを使う †
DotNetOpenIdには便利なコントロールが多数あるため、これらを使うとかなり楽ができます。しかし場合によってはこれらのコントロールを使えないこともあるでしょう。そのようなときは、OpenIdRelyingPartyクラスを使うことになります。
OpenIdRelyingPartyクラスを使った方法も決して難しくありません。認証の開始は、CreateRequestメソッドでIAuthenticationRequestを作成した後にRedirectToProviderメソッドを呼び出すだけです。認証に成功したかを判断するには、PageのLoadイベントハンドラでOpenIdRelyingPartyを作成し、ResponseプロパティのStatusの値を調べます。Authenticatedであれば認証に成功しています。
以下にOpenIdRelyingPartyクラスを使ったログインページの例を示します。ここではユーザーのメールアドレスも要求しています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
| | <%@ Page Language="vb" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim rp As New DotNetOpenId.RelyingParty.OpenIdRelyingParty()
rp.Settings.RequireSsl = False
Try
Dim req As DotNetOpenId.RelyingParty.IAuthenticationRequest = _
rp.CreateRequest(TextBox1.Text)
Dim cr As New DotNetOpenId.Extensions.SimpleRegistration.ClaimsRequest()
cr.PolicyUrl = New Uri(Request.Url, _
Response.ApplyAppPathModifier("~/PrivacyPolicy.aspx"))
cr.Email = DotNetOpenId.Extensions.SimpleRegistration.DemandLevel.Request
req.AddExtension(cr)
req.RedirectToProvider()
Catch ex As DotNetOpenId.OpenIdException
MessageLabel.Text = "エラー: " & ex.Message
Catch ex As System.Net.WebException
MessageLabel.Text = "エラー: " & ex.Message
End Try
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
Dim rp As New DotNetOpenId.RelyingParty.OpenIdRelyingParty()
If rp.Response IsNot Nothing Then
Select Case rp.Response.Status
Case DotNetOpenId.RelyingParty.AuthenticationStatus.Authenticated
Dim claims As DotNetOpenId.Extensions.SimpleRegistration. _
ClaimsResponse = rp.Response.GetExtension(Of _
DotNetOpenId.Extensions.SimpleRegistration.ClaimsResponse)()
If claims IsNot Nothing Then
Session("Email") = claims.Email
End If
FormsAuthentication.RedirectFromLoginPage( _
rp.Response.ClaimedIdentifier, False)
Exit Select
Case DotNetOpenId.RelyingParty.AuthenticationStatus.Canceled
MessageLabel.Text = "キャンセルされました。"
Exit Select
Case DotNetOpenId.RelyingParty.AuthenticationStatus.Failed
MessageLabel.Text = "OpenIDの認証に失敗しました: " + _
rp.Response.Exception.Message
Exit Select
Case DotNetOpenId.RelyingParty.AuthenticationStatus.SetupRequired
MessageLabel.Text = "setupモードで認証を行う必要があります。"
Exit Select
End Select
End If
End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>OpenIDテスト</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" AssociatedControlID="TextBox1"
Text="OpenID : "></asp:Label>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="ログイン"
onclick="Button1_Click" />
<br />
<br />
<asp:Label ID="MessageLabel" runat="server"></asp:Label>
</div>
</form>
</body>
</html>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
| | <%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Button1_Click(object sender, EventArgs e)
{
DotNetOpenId.RelyingParty.OpenIdRelyingParty rp =
new DotNetOpenId.RelyingParty.OpenIdRelyingParty();
rp.Settings.RequireSsl = false;
try
{
DotNetOpenId.RelyingParty.IAuthenticationRequest req =
rp.CreateRequest(TextBox1.Text);
DotNetOpenId.Extensions.SimpleRegistration.ClaimsRequest cr =
new DotNetOpenId.Extensions.SimpleRegistration.ClaimsRequest();
cr.PolicyUrl = new Uri(Request.Url, Response.ApplyAppPathModifier(
"~/PrivacyPolicy.aspx"));
cr.Email = DotNetOpenId.Extensions.SimpleRegistration.DemandLevel.Request;
req.AddExtension(cr);
req.RedirectToProvider();
}
catch (DotNetOpenId.OpenIdException ex)
{
MessageLabel.Text = "エラー: " + ex.Message;
}
catch (System.Net.WebException ex)
{
MessageLabel.Text = "エラー: " + ex.Message;
}
}
protected void Page_Load(object sender, EventArgs e)
{
DotNetOpenId.RelyingParty.OpenIdRelyingParty rp =
new DotNetOpenId.RelyingParty.OpenIdRelyingParty();
if (rp.Response != null)
{
switch (rp.Response.Status)
{
case DotNetOpenId.RelyingParty.AuthenticationStatus.Authenticated:
DotNetOpenId.Extensions.SimpleRegistration.ClaimsResponse claims =
rp.Response.GetExtension
<DotNetOpenId.Extensions.SimpleRegistration.ClaimsResponse>();
if (claims != null)
{
Session["Email"] = claims.Email;
}
FormsAuthentication.RedirectFromLoginPage(
rp.Response.ClaimedIdentifier, false);
break;
case DotNetOpenId.RelyingParty.AuthenticationStatus.Canceled:
MessageLabel.Text = "キャンセルされました。";
break;
case DotNetOpenId.RelyingParty.AuthenticationStatus.Failed:
MessageLabel.Text = "OpenIDの認証に失敗しました: " +
rp.Response.Exception.Message;
break;
case DotNetOpenId.RelyingParty.AuthenticationStatus.SetupRequired:
MessageLabel.Text = "setupモードで認証を行う必要があります。";
break;
}
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>OpenIDテスト</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" AssociatedControlID="TextBox1"
Text="OpenID : "></asp:Label>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="ログイン"
onclick="Button1_Click" />
<br />
<br />
<asp:Label ID="MessageLabel" runat="server"></asp:Label>
</div>
</form>
</body>
</html>
|
realmやreturn_toを変更するには、IAuthenticationRequestのRealmやReturnToUrlプロパティを変更します。または、OpenIdRelyingParty.CreateRequestメソッドのオーバーロードを使って、2番目、3番目のパラメータにrealmとreturn_toを指定することもできます。
上記の例ではページのLoadイベントハンドラで認証に成功したかを調べていますが、もしこのページにOpenIdLoginコントローラが設置されていればその必要はなく、OpenIdLoginコントローラが代わりにやってくれます。
「Yahoo! JAPAN IDでログイン」ボタンを設置する †
例えばYahoo! JAPANではOpenID URLに「yahoo.co.jp」と入力して認証を行うことができます。これを利用して、「Yahoo! JAPAN IDでログイン」というリンクを作成して、このリンクをクリックしたときにYahoo! JAPANの認証画面にジャンプようにすることができます。
Yahoo! JAPANではこの様なリンクを作成したときのために、「Yahoo! JAPAN IDログインボタン」の画像が用意されています。このように専用のボタン画像が用意されているOPはYahoo! JAPANだけでなく、他にも以下のようなOPがあります。
このような画像を利用したImageButtonコントロールを使って、「Yahoo! JAPAN IDでログイン」ボタンを設置する例を以下に示します。ここではボタンの画像に"btnXSYid.gif"という画像ファイルを使っていますので、この画像ファイルがアプリケーションのルートに置かれている必要があります。
なお現在Yahoo! JAPANのOpenIDはベータ版であり、HTTP(ポート番号80)、HTTPS(ポート番号443)上で実際のホスト名を使用しているRPしかサポートしていないため、テスト環境から実行すると「このサイトにはログインできません」というエラーが出るかもしれません。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
| | <%@ Page Language="vb" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
Protected Sub ImageButton1_Click(ByVal sender As Object, _
ByVal e As ImageClickEventArgs)
Dim rp As New DotNetOpenId.RelyingParty.OpenIdRelyingParty()
Try
Dim req As DotNetOpenId.RelyingParty.IAuthenticationRequest = _
rp.CreateRequest("yahoo.co.jp")
req.RedirectToProvider()
Catch ex As DotNetOpenId.OpenIdException
MessageLabel.Text = "エラー: " & ex.Message
Catch ex As System.Net.WebException
MessageLabel.Text = "エラー: " & ex.Message
End Try
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
Dim rp As New DotNetOpenId.RelyingParty.OpenIdRelyingParty()
If rp.Response IsNot Nothing Then
Select Case rp.Response.Status
Case DotNetOpenId.RelyingParty.AuthenticationStatus.Authenticated
FormsAuthentication.RedirectFromLoginPage( _
rp.Response.ClaimedIdentifier, False)
Exit Select
Case DotNetOpenId.RelyingParty.AuthenticationStatus.Canceled
MessageLabel.Text = "キャンセルされました。"
Exit Select
Case DotNetOpenId.RelyingParty.AuthenticationStatus.Failed
MessageLabel.Text = "OpenIDの認証に失敗しました: " + _
rp.Response.Exception.Message
Exit Select
End Select
End If
End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>OpenIDテスト</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ImageButton ID="ImageButton1" runat="server"
ImageUrl="~/btnXSYid.gif"
onclick="ImageButton1_Click" />
</div>
<asp:Label ID="MessageLabel" runat="server"></asp:Label>
</form>
</body>
</html>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
| | <%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
{
DotNetOpenId.RelyingParty.OpenIdRelyingParty rp =
new DotNetOpenId.RelyingParty.OpenIdRelyingParty();
try
{
DotNetOpenId.RelyingParty.IAuthenticationRequest req =
rp.CreateRequest("yahoo.co.jp");
req.RedirectToProvider();
}
catch (DotNetOpenId.OpenIdException ex)
{
MessageLabel.Text = "エラー: " + ex.Message;
}
catch (System.Net.WebException ex)
{
MessageLabel.Text = "エラー: " + ex.Message;
}
}
protected void Page_Load(object sender, EventArgs e)
{
DotNetOpenId.RelyingParty.OpenIdRelyingParty rp =
new DotNetOpenId.RelyingParty.OpenIdRelyingParty();
if (rp.Response != null)
{
switch (rp.Response.Status)
{
case DotNetOpenId.RelyingParty.AuthenticationStatus.Authenticated:
FormsAuthentication.RedirectFromLoginPage(
rp.Response.ClaimedIdentifier, false);
break;
case DotNetOpenId.RelyingParty.AuthenticationStatus.Canceled:
MessageLabel.Text = "キャンセルされました。";
break;
case DotNetOpenId.RelyingParty.AuthenticationStatus.Failed:
MessageLabel.Text = "OpenIDの認証に失敗しました: " +
rp.Response.Exception.Message;
break;
}
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>OpenIDテスト</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ImageButton ID="ImageButton1" runat="server"
ImageUrl="~/btnXSYid.gif"
onclick="ImageButton1_Click" />
</div>
<asp:Label ID="MessageLabel" runat="server"></asp:Label>
</form>
</body>
</html>
|
次回予告 †
OpenIDでログインできるサイトを作成する方法は今回で終わりです。次回はOPを作成する方法というのが自然な流れかもしれませんが、需要がほとんどなさそうですので(OPがやたらと増えるのも考えものかもしれませんし)、どうなるかはまだ未定です。
コメント †