差分
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}}
==実装例==
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}}