ASP.NET MVC/TwitterのOAuthで認証を行う
< ASP.NET MVC
ナビゲーションに移動
検索に移動
2015年1月27日 (火) 01:23時点における153.220.18.74 (トーク)による版
ASP.NET 4.5では標準でOAuthやOpenIDに対応しているが、2015年1月時点でMonoで使える(Xamarin Studioで開発や編集ができる)ASP.NETは4.0であり、これらは利用できない。そこでNuGetから最近流行らしいCoreTweetというTwitterのライブラリを使ってフォーム認証を強行突破してみた。
実装例
Web.configでクッキーが有効になっていないと動かない模様。 これで正しいかは知らん。 とりあえず動いている。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using CoreTweet;
public class AccountController : Controller
{
// http://127.0.0.1/account/
public ActionResult Index()
{
var token = Session["OAuthToken"] as Tokens;
if (token != null)
{
return Redirect("/");
}
var ck = "dev.twitter.comで取得してね";
var cs = "dev.twitter.comで取得してね";
var cb = "http://127.0.0.1:8080/account/callback";
// コールバックをlocalhostにしてたら嵌った。
// 127.0.0.1とlocalhostは別物扱いだ
var oauth_session = OAuth.Authorize(ck, cs, cb, null);
// セッション情報にOAuthSessionの内容を保存
Session["OAuthSession"] = oauth_session;
// Twitterの認証ページに飛ばす
return Redirect(oauth_session.AuthorizeUri.OriginalString);
}
// http://127.0.0.1/account/callback
public ActionResult Callback()
{
var oauth_token = Request["oauth_token"] as string;
var oauth_verifier = Request["oauth_verifier"] as string;
// OAuthSessionインスタンスを復元
var oauth_session = Session["OAuthSession"] as OAuth.OAuthSession;
if (oauth_session == null)
{
throw new HttpException(403, "forbidden1");
}
var token = oauth_session.GetTokens(oauth_verifier);
if (token == null)
{
throw new HttpException(403, "forbidden2");
}
CreateAuthCookie(token);
return Redirect("/");
}
private void CreateAuthCookie(Tokens token)
{
// セッション
Session["OAuthToken"] = token;
// フォーム認証を強行突破
// 以後、認証済みになりAuthorize属性が有効になるはず。
var cookie = FormsAuthentication.GetAuthCookie(token.ScreenName, false);
var ticket = FormsAuthentication.Decrypt(cookie.Value);
var newticket = new FormsAuthenticationTicket(
ticket.Version,
ticket.Name,
ticket.IssueDate,
ticket.Expiration,
ticket.IsPersistent,
token.AccessToken);
cookie.Value = FormsAuthentication.Encrypt(newticket);
Response.Cookies.Set(cookie);
}
}