[ASP.NET].NET Framework4.0でGoogle認証を利用する


ASP.NETで書いたシステムで「Google認証くっつけてよ」とリクエストがあり安請け合いをしました。
便利なパッケージがあるじゃないかと「Microsoft.AspNet.WebPages.OAuth」をNuGetしてみれば

「パッケージ ‘Microsoft.AspNet.WebPages.WebData 3.1.1′ をインストールできませんでした。’.NETFramework,Version=v4.0′ を対象とするプロジェクトにこのパッケージをインストールしようとしています
が、そのフレームワークと互換性があるアセンブリ参照またはコンテンツ ファイルがこのパッケージに含まれていません。詳細については、パッケージの作成者に問い合わせてください。」

Oh、なんと.NET Framework4.5が必要なようです。(あとで気づきましたがVer.2系を入れれば問題ないです)

諸事情で.NET Framework4.5が使えないので、4.0でなんとかする方法を探してみました。

まずはDotNetOpenAuthをNuGetします。
http://www.nuget.org/packages/DotNetOpenAuth/

あとはこんな感じで書きましょう


using DotNetOpenAuth.OpenId.RelyingParty;
using DotNetOpenAuth.Messaging;
using DotNetOpenAuth.OpenId.Extensions.SimpleRegistration;
using DotNetOpenAuth.OpenId.Extensions.AttributeExchange;
using DotNetOpenAuth.OpenId;
using DotNetOpenAuth.OAuth;
 
namespace hoge
{
    public class LoginController
    {
        public ActionResult Login(string returnUrl)
        {
                var openid = new OpenIdRelyingParty();
		//Googleのメタデータを探すよう設定する
                HostMetaDiscoveryService googleAppsDiscovery = new HostMetaDiscoveryService
                {
                    UseGoogleHostedHostMeta = true,
                };

                openid.DiscoveryServices.Insert(0, googleAppsDiscovery);

                //現時点でのレスポンスデータ取得
                IAuthenticationResponse response = openid.GetResponse();
                //
                // Googleのページへリダイレクト
                //
                if (response == null)
                {
 		  //リダイレクト先作成
                    UriBuilder realmUriBld =
                     new UriBuilder(Request.Url) { Query = "" };
                    IAuthenticationRequest request = openid.CreateRequest(
                      "https://www.google.com/accounts/o8/site-xrds?hd=example.com",
                      realmUriBld.Uri,
                      Request.Url);

                    // emailアドレスをください
                    request.AddExtension(new ClaimsRequest
                    {
                        Email = DemandLevel.Require
                    });
                    //リダイレクト
                    return request.RedirectingResponse.AsActionResult();
                }

                //
                // ログイン成功後
                //
                // 本当は失敗した時のことも書くんですよ
                if (response.Status == AuthenticationStatus.Authenticated)
                {
                    // メールアドレスがあれば取得できますが、ない場合には識別名を使います
                    string identifier = string.Empty,
                    string email = string.Empty;
                    FetchResponse fetch = response.GetExtension();
                    if ((fetch != null) &&
                      (fetch.Attributes[WellKnownAttributes.Contact.Email] != null))
                        email = fetch.Attributes[WellKnownAttributes.Contact.Email].Values[0];
                    if (string.IsNullOrEmpty(email)){
                        identifier = response.ClaimedIdentifier;
                    }else{
                        identifier = email;
                    }
		   //識別情報を使ってログイン情報を作成
                    FormsAuthentication.SetAuthCookie(identifier, false);
                    //homeへリダイレクト
                    return RedirectToAction("Index", "Home");
                }
                //ここまで来たら失敗なのでリトライさせましょう
                return RedirectToAction("Login", "Login");
		}
	}
}

今回はappsを利用するのでドメイン名を指定してリクエスト先URLを作成しています。
通常のgoogleアカウントを利用する場合には「https://www.google.com/accounts/o8/id」をURL作成時に指定してあげてください。

Microsoft.AspNet.WebPages.OAuthを使うともっと簡単にかけるそうです。
DotNetOpenAuthを使う日本語の情報が少なかったのでメモ的なエントリーとしたいと思います。

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>