メインメニューを開く

差分

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

3,280 バイト追加, 2015年1月27日 (火) 01:23
ページの作成:「ASP.NET 4.5では標準でOAuthOpenIDに対応しているが、2015年1月時点でMonoで使える(Xamarin Studioで開発や編集ができる)ASP...」
ASP.NET 4.5では標準で[[OAuth]]や[[OpenID]]に対応しているが、2015年1月時点でMonoで使える([[Xamarin Studio]]で開発や編集ができる)[[ASP.NET]]は4.0であり、これらは利用できない。そこで[[NuGet]]から最近流行らしいCoreTweetという[[Twitter]]のライブラリを使ってフォーム認証を強行突破してみた。

==実装例==
Web.configで[[クッキー]]が有効になっていないと動かない模様。
<source lang="csharp">
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);
}
}
</source>

==関連項目==

==参考文献==
{{reflist}}

{{stub}}
匿名利用者