検索
リンク
タグ
ASP.NET
.NET
ASP.NET MVC
F#
Visual Studio
Azure
ASP.NET Core
ライトニングトーク
Plone
AJAX
Selenium
C#
jQuery
ADO.NET Entity Framework
SQL Server
JavaScript
LINQ
WebMatrix
EFCore
Fizz-Buzz
カテゴリ
最新の記事
最新のコメント
記事ランキング
最新のトラックバック
以前の記事
2023年 01月 2022年 12月 2022年 11月 2022年 10月 2022年 09月 2022年 08月 2022年 07月 2022年 06月 2022年 05月 2022年 04月 2022年 03月 2022年 02月 2022年 01月 2021年 12月 2021年 11月 2021年 10月 2021年 09月 2021年 08月 2021年 07月 2021年 06月 2021年 05月 2021年 04月 2021年 03月 2021年 02月 2021年 01月 2020年 12月 2020年 11月 2020年 10月 2020年 09月 2020年 08月 2020年 07月 2020年 06月 2020年 05月 2020年 04月 2020年 03月 2020年 02月 2020年 01月 2019年 12月 2019年 11月 2019年 10月 2019年 09月 2019年 08月 2019年 07月 2019年 06月 2019年 05月 2019年 04月 2019年 03月 2019年 02月 2019年 01月 2018年 12月 2018年 11月 2018年 10月 2018年 09月 2018年 08月 2018年 07月 2018年 06月 2018年 05月 2018年 04月 2018年 03月 2018年 02月 2018年 01月 2017年 12月 2017年 11月 2017年 10月 2017年 09月 2017年 08月 2017年 07月 2017年 06月 2017年 05月 2017年 04月 2017年 02月 2017年 01月 2016年 12月 2016年 11月 2016年 10月 2016年 09月 2016年 08月 2016年 07月 2016年 06月 2016年 05月 2016年 04月 2016年 03月 2016年 02月 2016年 01月 2015年 12月 2015年 11月 2015年 10月 2015年 09月 2015年 08月 2015年 07月 2015年 05月 2015年 04月 2015年 03月 2015年 02月 2015年 01月 2014年 12月 2014年 11月 2014年 10月 2014年 09月 2014年 08月 2014年 06月 2014年 04月 2014年 03月 2014年 02月 2014年 01月 2013年 12月 2013年 10月 2013年 09月 2013年 08月 2013年 07月 2013年 06月 2013年 05月 2013年 04月 2013年 03月 2013年 02月 2013年 01月 2012年 12月 2012年 11月 2012年 10月 2012年 09月 2012年 08月 2012年 07月 2012年 06月 2012年 05月 2012年 04月 2012年 03月 2012年 02月 2012年 01月 2011年 12月 2011年 11月 2011年 10月 2011年 09月 2011年 08月 2011年 07月 2011年 06月 2011年 05月 2011年 04月 2011年 03月 2011年 02月 2011年 01月 2010年 12月 2010年 11月 2010年 10月 2010年 09月 2010年 08月 2010年 07月 2010年 06月 2010年 05月 2010年 04月 2010年 03月 2010年 02月 2010年 01月 2009年 12月 2009年 10月 2009年 09月 2009年 07月 2009年 06月 2009年 05月 2009年 04月 2009年 03月 2009年 02月 2009年 01月 2008年 12月 2008年 11月 2008年 10月 2008年 09月 2008年 08月 2008年 07月 2008年 06月 2008年 05月 2008年 04月 2008年 03月 2008年 02月 2008年 01月 2007年 12月 2007年 11月 2007年 04月 2007年 03月 2007年 02月 2007年 01月 2006年 11月 2006年 10月 2006年 09月 2006年 08月 2006年 07月 ファン
ブログジャンル
画像一覧
|
2013年 05月 09日
Windows Azure Storage Service - Blobもっぱら何かしらのアプリ向けに、任意のバイナリコンテンツをしまっておけるインターネット上のストレージ(記憶域)サービスのひとつとして、Windows Azure Storage Service の Blob がある。Amazon であれば S3 が該当するだろうか。 SkyDrive や Dropbox のようなユーザーインターフェースを備えているわけではなく、HTTP 経由の REST な API を介してコンテンツのやりとりをする。 なので、一般ユーザーが自分の手持ちのファイルを直接出し入れする目的では普通は使わない。 どちらかというと、何らかのアプリケーションの中から、縁の下的に使われることの多いサービスだろう。 Blob の内容を限定されたユーザだけに公開したいさてその Windows Azure Storage Service の Blob であるが、その Blob の内容を、あらかじめ設定されているユーザにのみ公開したい需要に迫られた。第1の要件としては、「この URL を参照してください」と URL を e-mail 等で連絡すれば、このメッセージを受け取った人はその URL を Web ブラウザで開くことで Blob の内容が見られる、というもの。 ちなみに、Blob コンテナのアクセス権は一般公開にすることができる。 そうすると、下記構文の URL を Web ブラウザで開くことで、Blob の内容を普通に閲覧可能だ。 http://{アカウント名}.blob.core.windows.net/{コンテナ名}/{Blob名}しかし今回の要件では、Webブラウザでアクセスしたときにユーザ名/パスワードの入力(認証)を求め、認証・承認されたユーザのみ Blob コンテンツを閲覧可能にしなければならない。 Azure の標準機能では満足できないWindows Azure Storage Service に標準で備わっている機能では、以下のような公開方法のみとなる。1. 匿名ユーザーであっても読み取り可能(先述の方法) 2. アクセスキーを使って認証した場合だけアクセス可能 3. URL を知ってる人だけ読み取り可能 閲覧可能とする人にアクセスキーを教えておけば、Azure Storage Explorer などの無償利用可能なツールを利用することで、閲覧可能とはなる。 Web ブラウザからとはいかなくなるので第1の要件を満たせないが、まぁ、こういったやり方もありだろう。 しかしやはり、アクセスキーを各個人に教えてしまうのは、セキュリティ的に好ましいとは思えない。 3.の「URL 限定公開」でも、まぁまぁ悪くはない。 実は詳しいことは知らないのだが、どうやら期間限定の時限式にできるという話も聞いた。 だがしかし、暗号化されていない平文のメールに URL を貼り付けされて流通することを想定すると、やはり気持ちが悪い。 誰がアクセスしたかを記録することまで視野に入れると、ここはひとつ、ユーザー名/パスワードによる認証にこだわりたい。 プロクシを自作ということで、「ITを業務に沿わせるよりも、業務をITに沿わせたほうがよい」とはわかってはいるが、Windows Azure に標準で備わっている機能ではこだわりを満たせないので、ある種のプロクシ的な Web アプリ ― Gate4AzureStorageBlob と呼ぼう ― を自作することにした。Gate4AzureStorageBlob の仕様Gate4AzureStorageBlob のアプリケーション構成に Azure Storage Service に対するアカウントとアクセスキーを設定しておく。つまり Gate4AzureStorageBlob アプリそのものは、所定の Blob にアクセス可能だ。 次の構文の URL で Web ブラウザからアクセスすることで、指定の Blob エントリの内容を閲覧可能とする。 https://host/Content/{アカウント名}/{コンテナ名}/{Blob名}いっぽうで Gate4AzureStorageBlob アプリは、Web ブラウザ等からの HTTP 要求に対して、別途あらかじめ設定しておいたアカウント情報に則り、認証を求める。 この認証を通過したアクセスだけが、Blob の内容を閲覧可能とする。 実装と非機能要件このような Web アプリ「Gate4AzureStorageBlob」を実装するにあたり、実装技術は必ずしも .NET 系である必要はない。Windows Azure Storage Service へのアクセスは REST な HTTP で行われるので、プログラミング言語やプラットフォームは問わない。 さらにクライアント向けライブラリも各種用意されているので、Ruby や PHP などでも容易に Windows Azure Storage の Blob Service にアクセス可能だ。 自分でやってみたことはないのだが... とにかく、各種開発プラットフォーム・プログラミング言語ごとのドキュメントは下記 URL から公開されており、各SDKもここからダウンロード可能だ。 http://www.windowsazure.com/en-us/documentation/ とは言いつつも、自分は ASP.NET + C# が一番得意(というか、PHPとかほかのプラットフォームで書けるスキルがない) ので、ASP.NET MVC で実装してみることにする。 さらに今回は、なるべく簡易に Windows Azure Websites か AppHarbor のいずれかに配置できることを目指し、かつ完全 \0 で運用開始できることも目指すことにしてみた。 実装開始核となる機能の実装は容易だ。あらかじめ NuGet Package Manager 経由で、Azure Storage Service へのクライアントアクセスライブラリをプロジェクトに追加しておく。 PM>Install-Package WindowsAzure.Storage続けて URL ルートを下記のとおり定義。 routes.MapRoute(次にコントローラクラス Gate4BlobController を作成し、Content アクションメソッドを下記要領で実装する。 public ActionResult Content(string account, string container, string name)解説すると、web.config の appSettings セクションから、 "AzureBlobAccountKey.{アカウント名}" のエントリから値を取得する。 この値がアクセスキーなので、これでアカウント名とアクセスキーがそろう。 あとは .NET 用の Azure Storage アクセスクライアントライブラリを利用して Blob コンテンツを読みだし、ブラウザに応答として返すだけだ。 ここまでで Azure Websites や AppHabor 等の PaaS にデプロイすれば 「http://foobar.apphb.com/content/fizz/buzz/fizzbuzz」といった URL で、アカウント名 = fizz の Azure Storage の Blob Service 中、buzz というコンテナに収録されている、名前 = fizzbuzz という Blob のコンテンツがブラウザに表示される。 アクセスキーは PaaS のダッシュボードから設定さて、web.config の appSettings 構成にアクセスキーを設定という話であったが、アクセスキーを記載した web.confg をソース管理にコミットするわけにはいかない。どうするかというと、何のことはない、Windows Azure Websites や AppHarbor では、開設したサイトの管理画面から、web.config - appSettings のエントリを追加できるのだ。 ということで、Gate4AzureStorageBlob のソースコード上は web.config - appSettings のアクセスキーは未設定のままでよい。 代わりに PaaS の管理画面からストレージアカウント名/アクセスキーを設定して完了だ。 認証さて、このままでは匿名ユーザー誰もが自由にアクセスできる状態だ。認証の仕組みを導入して、アクセス制御を実施する必要がある。 ユーザー管理ページはもとより、ログインページすら実装が面倒だと思ったので、今回は HTTP 基本認証を使うこととした。 ログインページを実装する代わりに、ブラウザによる基本認証ダイアログを利用しようという魂胆だ。 NuGet Package Manager から HttpAuthenticationModule パッケージをプロジェクトに追加。 PM>Install-Package HttpAuthenticationModule次に web.config の system.web/authorization セクションを編集し、 <deny users="?"/> の行を追加して匿名ユーザーのアクセスを拒否(deny)するよう設定しておく。 さらに system.web/authentication セクションを確認し、mode 属性が None になっていることを確認しておく。 以上で、Gate4AzureStorageBlob にアクセスすると、ブラウザによって基本認証ダイアログが表示されるようになるはずだ。 ![]() なお、このユーザー名/パスワードは、HttpAuthenticationModule を NuGet Package Manager でプロジェクトに追加した際に web.config 中に追記された httpAuth セクションに記述されているものだ。 アカウント情報さて次に、アカウント情報を web.config 中に直書きするのもよろしくないので、基本認証にあたってのアカウント情報は何かしらの ASP.NET Membership Provider から提供されるようにしよう。基本認証にあたってのアカウント情報ソースを、web.config 中の記載からメンバシッププロバイダに設定変更するには、web.config の httpAuth セクション中、credentials 要素の source 属性を、"Inline" から "MembershipProvider" に変更すれば OK だ。 <httpAuth mode="Basic" realm="Secret">さてあとは、お好みの ASP.NET Membership Provider を使うよう構成しておけばよい。 今回はなるべく簡易にという要件を立てたので、AppSettingsMembershipProvider を使ってみることにする。 このメンバシッププロバイダは、web.config の appSettings セクションにアカウント情報(ユーザー名とパスワード)を設定しておくことで、これを読み取って動作するプロバイダだ。 先に書いたとおり、web.config の appSettings は、PaaS の管理画面から追加できる。 ということで、PaaS の管理画面をユーザーアカウントの管理画面として使えてしまうわけだ。 ![]() NuGet Package Manager から AppSettingsMembershipProvider パッケージをプロジェクトに追加すれば OK。 PM>Install-Package AppSettingsMembershipProviderここまでできた Gate4AzureStorageBlob を PaaS に設置したら、PaaS の管理画面から key = "User.{ユーザー名}"、value="sha1:salt:{"salet:"+パスワードをsha1ハッシュした結果の16進文字列}" を設定しておくことで、このユーザー名/パスワードで認証できるようになる。 基本認証は平文なので危ない!ここまでで、ほぼ完成にこぎつけた Gate4AzureStorageBlob の実装であるが、しかし、基本認証はパスワードが平文で送信される。このままでは何のために認証をするのか意味がない。 幸い、Azure Websites ならびに AppHarbor は、アクセスするプロトコルを http ではなく https を使うだけで、同じ URL そのままで SSL による暗号化で保護されたアクセスとなる。 自分で電子証明書を、設置はおろか、買う必要すらないのはすごい時代だ。 とはいえ、暗号化されていない http でもアクセスはできてしまうので、できれば http 経由でのアクセスは黙って無視するようにしたいところだ。 そのために AppOfflineModule を導入してみる。 このモジュールを使えば、指定の条件のときに HTTP 404 Not Found を返す実装が容易に実現可能だ。 今回の例だと、https ではなく http によるアクセスだったらすべからく HTTP 404 Not Found を応答に返すように実装すればよい。 まずは NuGet Package Manager から AppOfflineModule をプロジェクトに追加する。 PM>Install-Package AppOfflineModule次に、アプリ開始時のタイミング、すなわち Global.asax.cs の Application_Start メソッド内にて、"どういうときに HTTP 404 を返すか" の判定ロジックを仕込む。 下記の要領。 AppOfflineModule.Filter.IsEnable = () =>これで https でアクセスしないと応答しないアプリにすることができた。 以上で Gate4AzureStorageBlob は完成だ。 まとめとまぁ、こんな感じで Gate4AzureStorageBlob を構築してみた。ソースコードは GitHub にて公開しておく。 "ユーザーを認証して Azure Storage Blob を読み取り可能にする" という需要が自分以外にどれほどあるか疑問は残るが、活用されたい方はご自身の責任でどうぞ。 https://github.com/jsakamoto/Gate4AzureStorageBlob Gate4AzureStorageBlob を SaaS 化することも少し考えたが、需要がなさそうなのと、そこまで労力をかけてもあまり見返りがなさそうと思い、やめたので悪しからず。 なお、AppSettingsMembershipProvider は、その構造上、アカウントのロックアウトの機能がない (パスワード誤り回数を計上したり、ロックアウトのフラグを保存したりする永続化層を持たないので)。 よってブルートフォース(総当たり)攻撃には弱いのでご注意を。 本格運用にあたっては、ほかのメンバシッププロバイダに差し替えたほうがいいかもしれない。 なにはともあれ、この程度の実装ステップで Gate4AzureStorageBlob は実装できるという、事例として見ていただいても面白いかもしれない。
by developer-adjust
| 2013-05-09 21:33
| .NET
|
Comments(0)
|
ファン申請 |
||