2011年4月24日日曜日

IIS ExpressでSSLを有効にしてデバッグ

Working with SSL at Development Time is easier with IISExpress - Scott Hanselman

Hanselmanさんのエントリに書かれてる通りデス!

IIS ExpressでSSLを有効にしたデバッグだと無効な証明書だと警告はでるけど、HTTPSでのテストはコレでできますよね。

だけど、名前はlocalhostに限定です。これはまぁ、そういうバインドしかapplicationHost.configに登録してないからなのと、アクセス許可をしてなからなんですが(詳しくはmvcConf 2 - Vaidy Gopalakrishnan: IIS Express | mvcConf | Channel 9)、その辺をちゃんと登録して気持ちよく使いましょうという内容ですね。途中URLRewriteでAccountControllerへのアクセスをHTTPSに書き換えるというのが挟まってるけど、コードで対応するならここは飛ばしてもOKです。

netshへのcerthashの登録、信頼されたルート証明機関の証明書として証明書を登録、最終的にIisExpressAdminCmdでACLの許可登録で気持よく、マシン名でもSSL有効な状態でアクセスできます。

というのを、自分の環境でも確認してみましょう。

1.ASP.NET MVCサイトを作成

もちろんVS2010で行うのが簡単ぽんなんですが、VS2008でも同じようにできるので(applicationHost.configとnetshなので)、そっちしかない場合はそっちで。プロジェクトの設定で、外部プログラムを起動するを利用しましょう(IIS ExpressのVS2008/VS2010利用)。

今回は簡単なVS2010で新しくなったMVC3 Toolsで作ります。

ssl1

いい感じにHTML5ですね!

2.プロジェクトのプロパティでSSL有効化

ssl2

trueにするだけの簡単な作業です。これでSSL URLが入ります。この例だと https://localhost:44301/ ですね。

この状態でまずは実行してみましょう。

ssl3

文句は言われるけど、普通に問題なくアクセスできますね。楽チンデス。IIS Express最高!

3.localhostじゃなく好きな名前でアクセス

マシン名でもいいんですが、そこはほら、恥ずかしい名前付けてる場合もあるじゃないですか。そんな状態で表示するのもどうかと思うわけですよ。なので、今回は完全カスタムな名前にしてしまいます。

takepara-local

という名前にします。これが恥ずかしい名前じゃないかと言われると、まぁ微妙ですが。あ、ちなみに自分のマシン名はそんなに恥ずかしい名前じゃないですよ。

IisExpressAdminCmdでアクセスできるようにしましょう。

※”.”でドメインな感じのマシン名だとsetupFriendlyHostnameUrlに失敗します。

ssl6

これでブラウザからアクセスしてみましょう!

ssl7-2

残念。エラーです。何か忘れてますね。そうですね、applocationHost.configにバインド登録してなかったですね。

<site name="SslTest" id="15">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="..." />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:51578:localhost" />
        <binding protocol="https" bindingInformation="*:44301:localhost" />
        <binding protocol="http" bindingInformation="*:80:takepara-local" />
        <binding protocol="https" bindingInformation="*:443:takepara-local" />
    </bindings>
</site>

ssl7

グレートですね。ちなみにhostsにtakepara-local登録して、netshでurlacl登録しても一緒です。

このまま、調子にのってHTTPSにしてみる。

ssl8

残念。ダメでした。

4.証明書を作成

takepara-localの証明書を作成してませんでしたね。hanselmanさんのエントリに書かれてるとおりです。makecertしましょう。CNだけ変えて後はそのままで。

ssl9

makecert -r -pe -n "CN=TAKEPARA-LOCAL" -b 01/01/2000 -e 01/01/2036 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localMachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12

VSコマンドプロンプトから実行しましょう。パス通ってて確実。

ssl10

証明書をnetshで登録。

netsh http add sslcert ipport=0.0.0.0:443 appid={214124cd-d05b-4309-9af9-9caa44b2b74a} certhash=864759f75a04d030e243ecf1cfe19ce336653374

ssl11ssl12

警告でるけど、気にせず表示。

5.証明書を信頼

このままでもいいんですが、やっぱり気持よく。

ssl13

信頼しちゃいましょう。自分のマシンで、自分で作った証明書。信頼しちゃえばいいじゃないか!

ssl14

Chrome厳しす。まぁ、いいか。警告でなくなったしね!

6.Accountコントローラを厳しく

URLRewriteで同じようになってもいいんですが、あえてコードで対応しましょう。と、言っても難しいことはなく、AccountControllerにRequireHttps属性を付けるだけ。

ssl15

これで、AccountControllerへのアクセスがHTTPSになってなければ、リダイレクトされます。リダイレクトされるということはHTTPでのPOSTは無視される(リダイレクトはGETデス)ので、気をつけましょう。

ssl16

この動きが気持ち悪いときはViewでURLを埋め込むときにHTTPSにしてあげる必要があるので、修正箇所が随分増えちゃいますが、通常の開発であればViewでもちゃんと書いて、ControllerへのRequireHttpsも付ける2段構えになるのが王道でしょう。抜け道なし。ViewのURLなんて嘘つくからね。

例えば、_LogOnPartial.cshtmlを以下のようにする。

@if(Request.IsAuthenticated) {
    <text>Welcome <strong>@User.Identity.Name</strong>!
    [ @Html.ActionLink("Log Off", "LogOff", "Account", "https", "takepara-local", "", null, null) ]</text>
}
else {
    @:[ @Html.ActionLink("Log On", "LogOn", "Account", "https", "takepara-local", "", null, null) ]
}

これで、必ずHTTPSのURLが生成されます。

画像てんこ盛りですが、手順通りやればうまくいくので、HTTPSでのテストをやりたい場合は是非どうぞ。

なんか、うまくできない!という場合はタスクトレイのIIS Expressを終了させてやり直してみるといいかも。applicationHost.config書き換えしたときなんかは特に。

2011年4月17日日曜日

MIX11をChannel9からまとめどり

更新:2011年4月19日 4:07

残念なお知らせと、うれしいお知らせがあります。

Mix 11 Videos - Download them all with RSS - Scott Hanselman

残念なのからいくと、このエントリは用なしになりました。嬉しいのは公式にMP4 Highが配信されました。

ダウンロードしなおすぜ!頑張れオレ!

MIX11 | Channel 9

いっぱいですね~。120個くらいですかね。MP4だけダウンロードしてiPadに入れて通勤時に全部目を通しておくのが、ラスベガスに行けなかったマニアのおつな楽しみ方というものでしょう。

http://channel9.msdn.com/Events/MIX/MIX11/RSS

とはいえ、Feedから取り出せたりするほど、便利なわけでもなく。やり方あるのかな?

でもそんなこと気にしない。ListタブをクリックすればすべてのMP4動画へのリンクがありますね。ということは、HTMLにはちゃんと動画のURLが埋まってるわけですね。となれば、スクレイピング!

なんてね。今回はちょっと趣向を変えてIE9のコンソールでJavaScriptを実行して取り出してしまいましょう!と、思ったけど、なんかちょっと思ったような出力が得られなかったので、Chromeで取り出してしまいましょう!てへ。

まずはChromeでページにアクセス。

http://channel9.msdn.com/Events/MIX/MIX11?sort=status&direction=asc#tab_sortBy_status

mix11-1

Shift+Ctrl+iでコンソールをひらきましょう。

mix11-2

MIX11のページにはjQueryが読み込まれてるので、やりたい放題ですよ。まずは変数の初期化。

var list=[];

と入れて改行。

続いて、listにエレメントから取り出したMP4一覧をタイトル込みで入れる。

$(".entry-meta > .downloads a[href*='.mp4']").each(function(i,v){list.push("wget -O \""+$(v).parents(".entry-meta").find(".title").text().replace(":","-").replace("?","?") +".mp4\" "+ $(v).attr("href"));});

↑これをコピペして改行すると、ぞろぞろ表示されます。

mix11-3

が、結果はlistに格納されてるので、続けて

list

と、入力して改行。

mix11-4

あとはコレをさらにコピペして、都合のいいように編集してコンソールからwget!curlでもいいっす。ちなみに複数の解像度のファイルがあるので、タイトルだけでファイル名にすると重複しちゃうので、その辺は目視で変更。さらにファイルとして使えない文字もあったりするので、ちょこっと修正。お好みに合わせて、どーぞー。ただいまダウンロード中の図。

mix11-6

※パスは都合のいいように書き換えてね!

ちなみにIEで実行したのが↓こちら。

mix11-5

ちょっとコピペしにくい。というかできない。

これで見放題ですな。ぐへへ、ぐへへへ~。たまりませんな~。あ、でも解像度低いとiPadでちょっと見づらい。文字潰れ気味。スライドはギリセーフだけど、コードが見れるかどうかが大事なので、ダウンロード後にちょっと確認しないとね。

2011年4月9日土曜日

Heroku for .NET

昨年末でしたね。SalesforceがHerokuを買収しました。

セールスフォース・ドットコム、Heroku社買収の最終合意に署名 - salesforce.com 日本

Heroku自体興味はあったけど、Rubyistじゃないからな~。AppEngineもな~。とかとか。あ、Herokuってあれっす。あれあれ。Rubyのホスティング。PaaS。いいよね~。

来週からMIX11が始まるっていうのに、まだmvcConfのビデオを見てるのんびり屋さんですが、面白いのありました。

mvcConf 2 - Troels Thomsen: Deploy ASP.NET MVC with No Effort | mvcConf | Channel 9

EC2をプラットフォームにした.NET向けのPaaS「AppHarbor」。スゴイんすよ。リポジトリにgit使うんですけど(初めてのgit読まねば)、commitすると向こうでビルドが走って、テスト実行して、デプロイまでやってくれるんすよ。とにかく無料で1アプリ公開できるから試してみた。あ、アプリは作ってないです。MVCのテンプレートそのままです。

AppHarbor - AppHarbor

手順はナニも難しいことはなくてですね、AppHarborにアカウント作って、アプリ作ると最初の画面に「これで出来るぜ」っていうコマンドが一覧で表示されるから、そのまま入力するだけです。

準備としてはGit使えるようにmsysGitいれとくだけです!

Help.GitHub - Set Up Git (Windows)

それも、ダウンロードして後はデフォルトのままクリッククリック。Git Bashってなんかカッコイイ。ハッカーな雰囲気を味わえる。そんな雰囲気を味わいたいからTortoiseGitを使わないオレ。まさに海賊王にふさわしい男気を感じる。ちっちぇ。

ah

git push(知ったかぶりだぜ!)するとAppHarborの管理画面に状況が表示されます。.gitignoreはつくっといたほうがいいです。

ah2

プロジェクトじゃなくてソリューションを追加して、標準のテストプロジェクトも入ってるんだけど、そのテストも実行されて、OKだったらデプロイ。試しにテスト失敗させるためにテストに以下のコードを追加。

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace AppHarbor.Takepara.Tests
{
    [TestClass]
    public class SomeTest
    {
        [TestMethod]
        public void TestMethod1()
        {
            Assert.AreEqual(0, 1);
        }
    }
}

ah4

身も蓋もない...。

んで、push(そのまえにadd,commitも忘れずに)!

ah5

ビルド中~。

ah6

テスト失敗!

ah7

詳細見てみると確かにテスト失敗。コレを直して、再度push。

ah8

ちゃんと成功すればデプロイまで行ってアプリケーションが動作します。

動いてるのも見たいよね。どうぞ、こちらです。

ah9

http://takepara.apphb.com/

dyno(Herokuのコンピューティングパワーの単位)の追加とかどうするのかよくわかってないけど、そもそもそういう概念がないのかも?

Pricing – AppHarbor

Load barancingもサービス範囲内。今回DB使ってないけど、せっかくなので後で無料の20MB枠を使ってAccountコントローラも動作するようにしてみようかな。どうしようかな。環境設定を書き換えてくれる特殊なconfig変換があるので、connectionStringなんかはデプロイ時によしなになるようです。

パッと見ですよ、アプリケーション領域としての容量制限とか特に書かれてないわけですよ。DBは無料20MBだとしても。

ということはですね、あれです、単純にサイトを公開したいだけなら無料ですよ!gitとかVS2010でのプロジェクト形式というハードルがあるとはいえ、無料ですよ。後はAppHarborさんたちが頑張ってくれるんですよ。このエントリは中身が薄いけど、AppHarborは凄まじく濃くて、魅力的なサービスです。

AppHarbor(Azure以外の.NET PaaS、AppEngine for .NETでもよろし)がどこまで行けるのか目が離せないですね!

調子にのってvimで.gitignoreやろうとして全くコマンドが分からなかったのは恥ずかしくて言えね。

2011年4月7日木曜日

VS2010のCSSエディタでCSS3スキーマ対応

ASP.NET Wiki: Adding CSS 3.0 support to Visual Studio 2010

  1. スキーマをダウンロードしてインストール
    CSS 3 Intellisense Schema
    ↑ここからCSS3Setup.msiをダウンロードしてインストールしましょう。
  2. レジストリをいじる
    レジストリエディタをひらいて以下に移動してキーと文字列値を追加。
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Packages\{4A0C6509-BF90-43DA-ABEE-0ABA3A8527F1}
    Schemasキーを作成。その中に文字列値の”File”を作って”css30.xml”と入れる。さらに文字列値として”Friendly Name”を作って”CSS 3.0”と入れる。
    場所が9.0なのは間違いじゃないので気にしないでね!
  3. ファイルをコピーする
    1でインストールしたファイルが
    C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Packages\1033\schemas\CSS
    に作成されてるので、日本語版で使うためにコピーして1041のフォルダにも作っておきましょう。
    C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Packages\1041\schemas\CSS

    file

こうしておけば、VS2010でCSS3のスキーマが有効になるよ!スゴイね!

css21

CSS 2.1を指定したままだと”box-shadow”はウニョウニョが出るよね。

css3

でも、CSS 3.0を選んでおくとValidですよ!

is

Intellisenceもほらー。transitionとか~。ね~。

ブチザッキさんへ

お元気ですか。ボクは元気です。

OData and Authentication – Part 7 – Forms Authentication - WCF Data Services Team Blog - Site Home - MSDN Blogs

WCF Data Servicesをプロキシクラス経由で呼び出すときにForm認証してやんよ、の件についてなんですけども。

WCF Data Services で フォーム認証を利用する « ブチザッキ

ナニをナニする系で、ナニしてみたのでご覧いただけたら幸いです。

Custom Membership Providers - Task Manager - CodeProject

プロキシからの呼び出しに介入し、別リクエストでAuthentication_JSON_AppService.axdを呼び出すことでForm認証し、レスポンスからCookieを横取りすることで、認証チケット再利用する部分を、FormsAuthenticationクラスを使って認証チケットを発行してそちらを使うことで実現してみました。

とはいえ、まったく楽チン度と便利さが上がらなかったので、ボツにしようかと思ったのですが、それはそれで少し寂しくなっちゃったので、公開レターの形式にしてみました。

WCF DataServicesをホストするサーバーサイドプロジェクトをASP.NET MVCにして、HomeControllerに以下のアクションメソッドを追加します。

[HttpPost]
public ContentResult FormAuth(string userName, string password)
{
  if (Membership.ValidateUser(userName, password))
  {
    var authTicket = new FormsAuthenticationTicket(
       1,
       userName,
       DateTime.Now,
       DateTime.Now.AddMinutes(30),
       false,
       userName);
    var cookie = 
       FormsAuthentication.FormsCookieName + "=" +
       FormsAuthentication.Encrypt(authTicket) + "; path=" +
       FormsAuthentication.FormsCookiePath + "; " +
       (!FormsAuthentication.RequireSSL
         ? "HttpOnly" : "");
    return Content(cookie);
  }

  return null;
}

続いて、クライアントサイドのプロキシクラス用に実装しているGetCookieの代わりとなる部分を以下のように。

string GetTicket(string userName, string password)
{
  string loginUri = string.Format("{0}/{1}/{2}",
      ServiceUri,
      "Home",
      "FormAuth");
  WebRequest request = HttpWebRequest.Create(loginUri);
  request.ContentType = "application/x-www-form-urlencoded";
  request.Method = "POST";

  string authBody = String.Format(
      "userName={0}&password={1}",
      userName,
      password);
  request.ContentLength = authBody.Length;

  using (StreamWriter w = new StreamWriter(request.GetRequestStream()))
  {
      w.Write(authBody);
      w.Close();

      WebResponse res = request.GetResponse();
      var body = new StreamReader(res.GetResponseStream()).ReadToEnd();
      if (!string.IsNullOrEmpty(body))
      {
          Cookie = body;
      }
      else
      {
          throw new Exception("Invalid username and password");
      }
  }

  return Cookie;
}

GetCookie(userName,password)の部分を上記のGetTicket(userName,password)にすることで、Cookie横取りではなくなりますね。

formauth

だから言ったじゃないですか!ボツにしたかったって...。

2011年4月2日土曜日

万kw

東京電力 電力使用量グラフの数値データAPI

素晴らしいですね。データさえあれば自分の好きなように加工して、使い放題ですもんね。ピーク値も含まれてれば使用量じゃなく使用率にできるからより見やすいでしょうか。

会社の監視モニターにも電力使用率を表示するようにして、日頃から意識しておこうと思う今日この頃です。

マッシュアップです!

tepco

東京電力 電力使用量グラフ

みんな大好きjqPlotも1.0が間近です。

jqPlot Charts and Graphs for jQuery

使おうじゃないですか。どんどんプロットしちゃおうじゃないですか。クライアントサイドで。IE9ならCanvasも動くし。IE8以前でもexcanvas.jsで問題なしですよ。

これといって特別なことをする必要もなく。JSONPで取得して、jqPlotでレンダリング。サーバーサイドのコードは一切なし。

あと、MVPもらっちゃった。

@onosさん、@naoki0311さん、@kazukさん、@shibukiさん、@ailightさん、@jsakamotoさん、@chack411さん。たくさんの方に感謝です。