ASP.NET MVC/TwitterのOAuthで認証を行う

提供: MonoBook
移動: 案内検索

ASP.NET 4.5では標準でOAuthOpenIDに対応しているが、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()
        {
            // Monoではメソッド引数への自動バインディングは利用できない模様。
            // なのでRequestから取得する。
            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);
        }
    }

関連項目[編集]

参考文献[編集]