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)
        'OpenIdRelyingPartyを作成する 
        Dim rp As New DotNetOpenId.RelyingParty.OpenIdRelyingParty()
        '設定を変更する 
        rp.Settings.RequireSsl = False
    
        Try
            'IAuthenticationRequestを作成する 
            Dim req As DotNetOpenId.RelyingParty.IAuthenticationRequest = _
                rp.CreateRequest(TextBox1.Text)
        
            'SREGで個人情報を要求する 
            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)
        
            'OPにリダイレクトする 
            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)
        'OpenIdRelyingPartyを作成する 
        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
                
                    'ログインする。ユーザー名はClaimed Identifierを使う 
                    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
                    'setupモードで認証を行う必要があるとき 
                    'immediateモードで認証を行っていないのであれば、必要なし 
                    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)
    {
        //OpenIdRelyingPartyを作成する
        DotNetOpenId.RelyingParty.OpenIdRelyingParty rp =
            new DotNetOpenId.RelyingParty.OpenIdRelyingParty();
        //設定を変更する
        rp.Settings.RequireSsl = false;
 
        try
        {
            //IAuthenticationRequestを作成する
            DotNetOpenId.RelyingParty.IAuthenticationRequest req =
                rp.CreateRequest(TextBox1.Text);
 
            //SREGで個人情報を要求する
            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);
 
            //OPにリダイレクトする
            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)
    {
        //OpenIdRelyingPartyを作成する
        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;
                    }
 
                    //ログインする。ユーザー名はClaimed Identifierを使う
                    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:
                    //setupモードで認証を行う必要があるとき
                    //immediateモードで認証を行っていないのであれば、必要なし
                    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)
        'OpenIdRelyingPartyを作成する 
        Dim rp As New DotNetOpenId.RelyingParty.OpenIdRelyingParty()
    
        Try
            'IAuthenticationRequestを作成する 
            Dim req As DotNetOpenId.RelyingParty.IAuthenticationRequest = _
                rp.CreateRequest("yahoo.co.jp")
            'OPにリダイレクトする 
            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)
        'OpenIdRelyingPartyを作成する 
        Dim rp As New DotNetOpenId.RelyingParty.OpenIdRelyingParty()
        If rp.Response IsNot Nothing Then
            '認証に成功したか調べる 
            Select Case rp.Response.Status
                Case DotNetOpenId.RelyingParty.AuthenticationStatus.Authenticated
                    '認証に成功したとき 
                
                    'ログインする。ユーザー名はClaimed Identifierを使う 
                    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)
    {
        //OpenIdRelyingPartyを作成する
        DotNetOpenId.RelyingParty.OpenIdRelyingParty rp =
            new DotNetOpenId.RelyingParty.OpenIdRelyingParty();
 
        try
        {
            //IAuthenticationRequestを作成する
            DotNetOpenId.RelyingParty.IAuthenticationRequest req =
                rp.CreateRequest("yahoo.co.jp");
            //OPにリダイレクトする
            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)
    {
        //OpenIdRelyingPartyを作成する
        DotNetOpenId.RelyingParty.OpenIdRelyingParty rp =
            new DotNetOpenId.RelyingParty.OpenIdRelyingParty();
        if (rp.Response != null)
        {
            //認証に成功したか調べる
            switch (rp.Response.Status)
            {
                case DotNetOpenId.RelyingParty.AuthenticationStatus.Authenticated:
                    //認証に成功したとき
 
                    //ログインする。ユーザー名はClaimed Identifierを使う
                    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がやたらと増えるのも考えものかもしれませんし)、どうなるかはまだ未定です。

コメント



ページ情報
[ トップ ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]