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を使う日本語の情報が少なかったのでメモ的なエントリーとしたいと思います。
間淵
最新記事 by 間淵 (全て見る)
- エンジニアが知っていること - 2015年1月23日
- MariaDBにMroongaを入れてWikipediaのテストデータ使う - 2014年6月18日
- [ASP.NET].NET Framework4.0でGoogle認証を利用する - 2014年3月11日
Comments are closed.