†OpenIDでログインできるサイトをASP.NETで作成する方法を説明します。License)のライブラリを使った方法を紹介しますので、ほとんどがDotNetOpenIdの使い方の説明になります。†まずはOpenIDについて簡単に説明します。OpenIDとは、1つのIDとパスワードでOpenIDに対応したすべてのサイトにログインできるシステムです。そのIDをOpenIDと言うこともあります。IDもOpenIDとして使用できるようになるということなので、これからどんどん増えていくでしょう。Specifications」で公開されています。実際にOpenIDを使った方が分かりやすいと思いますので、実際に使用する例を示します。OpenIDを取得します。JAPAN、はてな、Jugemkey、mixi、BIGLOBE、エキサイトなどがあります。ApartではVoxで作成したブログのURLをOpenIDとして使用することができます。海外では、myOpenIDなどが有名です。ここでは、OpenID.ne.jpでOpenIDを作成したものとします*1。URL"をもらえます。JAPANなどのアカウントを持っているならば、サイトで簡単な手続きを行うことですぐにOpenIDを発行してもらえますので、それで十分でしょう。次にこのOpenIDを使って、OpenIDに対応したサイトにログインします。ここではChoixというサイトにログインしてみます。(ただしユーザー登録が必要ですので、正確に言うと、OpenIDを使ってログインできるようにユーザー登録してみます。)Choixのトップページの上に「ログイン」というリンクがありますので、これをクリックしてログインページに移動します。ログインページにはユーザー名とパスワードを入力するフォームがありますが、その右に「OpenIDでログイン」というフォームがあり、テキストボックスが1つだけあります。ここに先ほど取得したOpenID(http://username.openid.ne.jp/)を入力します。Choixのログインページにも書かれていますが、ここにURLを入力しなくてもよい場合があります。JAPANでは"yahoo.co.jp"と入力することができます。サイトによっては、OpenIDを入力するテキストボックスが用意されておらず、その代りに「Yahoo!のアカウントでログイン」のようなリンクが用意されている場合もあります。Choixのログインページにも同様のリンクがありますが、このリンクはOpenIDではないようです。OpenIDを入力して「ログイン」ボタンを押すと、OpenID.ne.jpのページに飛ばされます。ここでパスワードを入力することを要求されます。確認」ページが表示されます。確認」というページに飛ばされます。(http://username.openid.ne.jp/)があなたの個人情報と一致しているという証明を要求しています。証明するための必要な個人情報を追加チェックし、認証してください。いう文章が表示されます。その下のチェックボックスでChoxに送信する個人情報を選択します。"Optional"となっている項目は送信を拒否しても問題ありませんが、"Required"となっている項目は必須項目ですので、送信を拒否するとログインできないなどの不具合が起こる可能性があります(Choixでは拒否しても問題ないようです)。Choixの場合はこのように個人情報を要求しますが、そうしないサイトも多いです。いう3つのボタンが表示されますが、ここでは「一度だけ認証」をクリックします。「認証状態を保持」をクリックすると、次にChoixにログインするときはこのページが表示されません。ボタンをクリックすると、今度はChoixのページに戻ってきます。IDの設定」という会員登録のフォームページが表示され、IDとメールアドレスを入力する必要があります。パスワードは必要ありません。個人情報を送った場合は、IDとメールアドレスにOpenID.ne.jpに登録されているニックネームとE-mailの情報があらかじめ入力されます。Choixの会員登録が完了すれば、次回からはOpenIDでログインが可能になります。†OpenIDでよく使われる用語があります。この記事でもこれらの用語を使いますので、まずは用語の説明をします(3つだけです)。ProviderOPと略します。OpenIDの認証をするサーバーです。上記の例では、OpenID.ne.jpです。PartyRPと略します。OpenIDの認証を受け取る側のWebアプリケーションのことです。上記の例では、Choixのことです。この記事で紹介するのは、RPを作成する方法ということになります。上記の例では、"http://username.openid.ne.jp/"のことです。Identifier"といいます。Identifier"と呼びます。ここでは、エンドユーザー(OpenIDを使ってログインしようとしているユーザー)のことを単にユーザーと表記します。†それでは本題に入りましょう。ここではDotNetOpenIdを使いますので、まずはDotNetOpenIdのサイトからダウンロードして、適当なフォルダに展開してください。3.5に対応しているようです。Frameworkで使用できるライブラリはいくつかあります。私が調べた限りでは、以下のようなライブラリが公開されています。ASP.NET補足DotNetOpenIdを使用したサンプルは、DotNetOpenIdアーカイブ内のSamplesフォルダにあります。RelyingPartyPortalプロジェクトは、RPを作成するサンプルです。MVCがインストールされていないと開くことができません)。ProviderPortalプロジェクトは、OPを作成するサンプルです。StudioでRPのプロジェクトを新規に作成するか、すでにある場合は開きます。mode"が"Forms"以外の場合は、"Forms"にします。ログインページを"login.aspx"以外にする場合は、"loginUrl"も指定しておきます。Studioの左側にあるツールボックスで右クリックしてメニューを表示し、「アイテムの選択」を選択します。「ツールボックスアイテムの選択」ダイアログが表示されるので、下にある「参照」ボタンをクリックして、"DotNetOpenId.dll"を選択します。"OpenIdLogin"などが選択されますので、そのまま"OK"をクリックします。これでツールボックスに"OpenIdLogin"などのコントロール追加されます。ログインページ"login.aspx"を作成し、そのページにツールボックスから"OpenIdLogin"をドラッグ&ドロップして配置します。OpenIdLoginコントロールを配置しただけのlogin.aspxのソースは以下のようになります。</form></body></html>実はこれだけでRPが出来上がっています。これだけではログインできたか分かりませんので、"Default.aspx"ページにLoginStatusコントロールとLoginNameコントロールを配置しておきます。"Default.aspx"のソースは以下のようになります。</form></body></html>これで完了です。Default.aspxをWebブラウザで開くと、LoginStatusコントロールの「ログイン」リンクがあります。これをクリックすると、login.aspxが開きます。このページでOpenIDを入力し、「Login」ボタンをクリックします。すると、先ほどのChoixの例と同じように、OPのページに飛んでログインを行い、再びDefault.aspxに戻ってきます。Identifier)が表示され、LoginStatusコントロールは「ログアウト」となりますので、実際にログインできたことが確認できます。このようにOpenIdLoginコントロールはOpenIDの認証に成功すると自動的にログインします。これだけでRPを作れてしまいました。Identifierを取得するには、IAuthenticationResponse.ClaimedIdentifierプロパティを使います。IAuthenticationResponseを取得するには、OpenIdLoginコントロールのLoggedInイベントハンドラのパラメータであるOpenIdEventArgsオブジェクトのResponseプロパティを使います。これとは別に、IAuthenticationResponse.FriendlyIdentifierForDisplayプロパティというものもあります。Identifierが意味不明の文字列となる場合があり、このような文字列を表示されてもユーザーはピンと来ないかもしれません。FriendlyIdentifierForDisplayプロパティはより分かりやすい文字列を返しますので、表示用として適しています。Identifierの"http://"が取られるなどするようです。FriendlyIdentifierForDisplayプロパティを表示以外の用途で使ってはいけません。Identifierでユーザーを特定する場合は、必ずClaimedIdentifierプロパティの値を使います。ちなみに、LoginNameコントロールに表示される名前は、ClaimedIdentifierプロパティと同じものになるようです。URLは拒否したいという場合もあります。そのようなときは、OpenIdLoginのLoggingInイベントでOpenIdEventArgs.CancelプロパティをTrueにすれば、OPのページに移動するのをキャンセルできます。認証を行うOPのページでユーザーがキャンセルをすることもできます。この時、OpenIdLoginコントロールのCanceledイベントが発生します。認証に失敗したときは、Failedイベントが発生します。エラーの詳細は、OpenIdEventArgs.Response.Exceptionプロパティに格納されます。先に紹介したLoggedIn、LoggingIn、Canceled、Failedイベントを使用して"login.aspx"を書き換えた例を以下に紹介します。Identifierをセッションに保存しています。URLに"hogehoge.com"が含まれていたらキャンセルするようにしています。Canceledイベントハンドラでは、Labelコントロールにキャンセルされたというメッセージを表示しています。Failedイベントハンドラでは、Labelコントロールにエラーメッセージを表示しています。"""hogehoge.com""はダメです。"キャンセルされました。"\"hogehoge.com\"はダメです。"キャンセルされました。次回はOpenIdLoginコントロールについてさらに詳しく紹介する予定です。OpenID.ne.jpでOpenIDを作成することをお勧めしているわけではありません。