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

提供: MonoBook
< ASP.NET MVC
2015年11月9日 (月) 05:14時点における153.219.225.170 (トーク)による版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

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);
        }
    }

関連項目[編集 | ソースを編集]

参考文献[編集 | ソースを編集]