IIS7 の機能を拡張してみる-Hot Link (直リン) 禁止モジュール

IIS7 はパイプラインの変更により、.NET を使用してその機能を拡張することができます。 .NET を使用した IIS 7 の機能拡張については、詳しいセッションを過去に何度か行ったことがあるのですが、この機能に関しての記事をあまり見かけないので書いておきます。 .NET を使用した IIS 7 の拡張方法は大別すると、以下の方向性に大別されます。 リクエスト、レスポンスの応答処理 IIS 7 に対する操作 IIS 管理ツールの拡張 今回は リクエスト、レスポンスの応答処理 の中の、リクエストを処理を使用して Hot Link を禁止する方法をご紹介しましょう。 ちなみに Hot Link とは、Web サイトで公開しているコンテンツを、他の Web サイトが直接リンクして使用する行為です。"直リン" などと短縮して呼ばれることもあります。 "コンテンツへの直接のリンク" ということで、"Web に公開しているものに直接リンクしてなにが悪い?" と、疑問に思われる方もいらっしゃることてしょう。 たとえば、自分の Web サイトで、お宝画像、もとい、ユーザーから需要のある画像等を公開し、そのページに貼ったバナーのアフィリエイトで収益を上げているとしましょう。 ところが、他の Web サイトが、自分のサイトで公開している画像を <img> タグなどを使用して、さもその Web サイトが提供しているように公開していたらどうでしょう? "非常に腹立たしい"、のはもちろんなのですが、なんといっても他所のサイトの訪問者は、バナーの貼ってある自分のサイトのページにはアクセスしませんので、アフィリエイトが機能せず、経済的な損失も生じることになります。 そういった場合には、Hot Link をしている Web サイトに対して注意、警告する必要が出てくるわけですが、運営者が気弱だったり、相手が道徳心に欠けるような ならず者 だったりすると、たいがいの場合、泣き寝入りすることになります。…


IIS7 ファイルアップロード用ページを簡単に作成する方法

ASP.NET が動作するように構成された Web サイト向けの、ファイルをアップロードするページを紹介したいと思います。 Web サイトを運営していると、ユーザーにファイルをアップロードさせたいというニーズが発生する場合があります。 FTP や WebDav を構成できるのであれば、それを使用してもいいのですが、ブラウザベースで行いたい場合は、サーバーサイドで動作するファイルアップロード用のプログラムを用意する必要がありました。 IIS7 でも、サーバーサイドで動作するコードを記述する必要がありますが、必要となるコードの量は存外に少なく、簡単なページでファイルアップロードの機能を実装できます。 以下に手順を示します。 手順 ASP.NET が動作するように構成された Web サイト、あるいは仮想ディレクトリを用意します。 ※前回までの記事で紹介したような Web フォーム認証が動作する環境であれば問題ありません。  同 Web サイトの物理フォルダにに upload という名前でフォルダを作成し、アカウント NETWORK SERVICE に対し、”変更” の権限を付与します。  Web サイトが使用しているアプリーションプールの実行アカウントを NETWORK SERVICE を変更します。 変更の仕方が不明な場合は、以下のドキュメントを参照してください。 『IIS 7.0: アプリケーション プールの ID を指定する』 http://technet.microsoft.com/ja-jp/library/cc771170(WS.10).aspx 以下の内容をテキストエディタに貼り付けて、upload.aspx という名前で保存し、Web サイトに配置します。 <%@ Page Language=”C#” %><script runat=”server”>    string resultMsg;    protected void uploadButton_Click(object…


IIS7 Web フォーム認証を使用したアクセス権の設定

IIS 7 では、ASP.NET Web フォーム認証が Web サイトの標準的な認証方式して使用できるようになっています。 Web フォーム認証が提供しているのは、一見、ログイン際の認証/承認の機能だけのように見えますが、実は下位ディレクトリ各々に対する “アクセス制御” の機能も提供しています。 “アクセス制御” の機能を使用すると、ログインが完了したユーザーアカウントの中から、さらに”見せたい人にだけ見せる” ということが可能になります。 この機能はさまざまなことに利用できます。 たとえば、管理者専用のディレクトリを用意して管理用ページを配置したり、会社で使用するのであれば、部署ごとにディレクトリを用意して、セキュアなグループ専用ページを配置したり、コンシューマー向けのサービスであれば、プレミアム会員向けのディレクトリを用意して、お宝コンテンツを配置したり、といったことが可能です。 この”アクセス制御” は、.NET ユーザーアカウントごとの個別設定も可能ですが、”役割″ (ASP.NET では “ロール” と表される) というセキュリティグループ的なものを利用して、複数のユーザーアカウントをグループ単位でまとめて管理するといったことも可能です。 今回はこの “アクセス制御” の設定方法をご紹介します。   ユーザーアカウントへのアクセス制御 Web フォーム認証が正常に動作している Web サイトにおいては、[承認規則] の設定のみで、ユーザーアカウントごとのアクセスのアクセスの制御を行うことができます。 設定手順は以下のとおりです。 IIS 管理ツールを起動 IIS 管理ツール画面左のツリービューを展開し、Web フォーム認証が適用されているサイトの内の、目的のディレクトリを選択 画面中央の[機能ビュー] から[承認規則] アイコンをダブルクリックして[承認規則] の設定画面を表示 [承認規則]のリストで、”すべてのユーザー” に対する “許可” の設定を選択し、画面右の [操作] パネルの [削除] リンクをクリックして削除 [操作] パネルの [許可規則の追加] リンクをクリック [許可の承認規則の追加]…


IIS7 ".NET ユーザー" アカウントをブラウザから作成するには?

既に多くの方がご存じのとおり、IIS7 では ASP.NET Web フォーム認証が、Web サイトの標準的な認証方式として使用することが可能となっています。 当然、Web フォーム認証で使用する .NET ユーザー アカウントも IIS7 の管理ツールで作成可能です。 この .NET アカウントの作成には、アカウントを使用しているユーザーがパスワードを失念してしまった場合に自らパスワードのリセットを行うための "質問" と "回答" を設定する必要があります。 しかし、通常の場合、IIS 管理ツールを使用してこの作業を行うのは Web サイトの管理者です。 つまり、この状況では、先日の記事で書いたように、Web 管理者は、アカウントを払い出す各々のユーザーの "お母さんの旧姓" とか、"最初のペットの名前" などを把握している必要があるのです。 もしかしたら私の見識が狭いだけなのかもしれませんが、すべての Web サーバー管理者が、各ユーザーに対し、"ねぇ、キミが最初に飼ったペットの名前を教えてくれるかな? ちなみにうちは団地だったからペットは飼ったことがないんだよね、テヘっ" なんてフレンドリーに訊ける状況というのはなかなかないような気がします。 とくに "お母さんの旧姓" なんてのは、訊く人によってはシリアスな問題をはらんでいそうなので、通常業務にスリルを持ち込みたいという向こう見ずな冒険心でも抱かないかぎりはなかなか気が進まないところです。 では、"質問" と "回答" は、管理者が用意したものを使用し、忘れん坊のユーザーがパスワードを失念した際には、リセット作業を行えば良い、という意見もあるでしょう。 一見これは優れたアイディアに見えますが、数々のアカウント作成、パスワードのリセット作業を繰り返していくなかで、管理者はやがてこう思うことでしょう。 いったい誰のための "質問" と "回答" なんだよ? と。 また、.NET ユーザー アカウントは、Web サイト / アプリケーション ごとに独立して作成されているので、それらすべてに対してのアカウント作成からバスワードのリセットまでの作業を担うというのは、管理者にしてみればなかなか笑顔ではいられない状況です。…


IIS7 ".NET ユーザー" によるパスワードのリセット

前回の記事で IIS7 の Web フォーム認証で使用する ".NET ユーザー アカウントのパスワードの変更方法" について書きましたが、今回はパスワードのリセット方法について書きたいと思います。 ところで自らパスワードをリセットしなければならないシチュエーションとはいつでしょう? 多くの場合は、パスワードを忘れてしまった場合です。 人は忘却の生き物です。日々、さまざまなことを忘れていきます。 若いころの情熱や夢、かつて強く信じていた大切なもの、連れ合いの誕生日や記念日、そしてなによりも大事なパスワードさえも、いつのまにか気持ちよく忘れてしまうものなのです。 パスワードを忘れてしまったばあい、多くは管理者にパスワードのリセットを依頼する必要があります。 つまりは、他人の余計な仕事を増やしたうえに、リセット作業が完了するまで自らの人生の貴重な時間を無駄に過ごすことになりがちなのです。 IIS7 がサポートする .NET のメンバシップには、パスワードの失念に因るこういった多大なる損失を回避するための機能が備えられています。 それが .NET ユーザーのための、.NET ユーザーの手による、.NET ユーザーのパスワードリセット機能なのです。 この機能は、".NET ユーザー" アカウント作成の際に設定した "質問" に、おなじく設定した "回答" を入力することで、パスワードを新しいパスワードで上書きし、さらには、その新しいパスワードをアカウント作成時設定したメールアドレスに送ってくれるという、なんとも親切心にあふれた機能なのです。 (と、ここまで書いていて、前回の記事で書いた "前出のメッセージボックスに表示されているメッセージの内容に対する以下の "謎" が、たちどころに氷解" というのは、この機能のことだと気が付いたしだい) この機能の実装も、パスワードの変更機能と同じく、ノンコーディングで実装できます。 具体的な手順は以下の通りです。 .NET ユーザーのリセットページの作成 ================================ テキストエディタに以下のタグを貼り付け、PasswordRecovery.aspx と名前を付けて保存し、Web フォーム認証が設定されている IIS7 の Web サイト/仮想ディレクトリに配置します。 <html> <head runat="server">     <title></title> </head> <body>…


IIS7 ".NETユーザー"にパスワード変更の自由を。

以前、ブログに書いた通り IIS7 では、Web サイトや仮想ディレクトリの認証に ASP.NET Web フォーム認証を使用することができます。 その際、IIS7 の管理ツールを使用して、".NET ユーザー" アカウントを作成するのですが、用意されている UI では、アカウントの作成と削除/メールアドレスの変更しかできません。 [操作] パネルには、そのほかに [パスワードのリセット] というリンクが用意されておりますが、これをクリックすると既定では以下のような、メッセージボックスが表示され、実質アカウントのパスワードのリセット作業を行うことはできません。 これでは アカウントを使用しているユーザーが、パスワードを変更したくなった場合や、失念してしまった場合は、管理者いちいちアカウントを削除して作り直す必要があり面倒ですし、そもそもユーザーが自分で使用するアカウントを管理者が知っているというのはセキュリティ面からも健全ではありませんし、なにしろ気持ちの良いものではありません。 今回は IIS7 の機能としてはあまり紹介されていない、というか、そんなネタはどこにも載っていない、ある意味 "幻の" と冠をつけてもいいような .NET ユーザーが、自らのパスワードを、自らのために、自らの手によって変更することが可能になる方法をご紹介しましょう。 そして、この方法を実行することで、前出のメッセージボックスに表示されているメッセージの内容に対する以下の "謎" が、たちどころに氷解することでしょう。(勿体ぶっててサーセンw) ユーザーの"質問" と "回答" ってなに? "ユーザーが自身がパスワードをリセットするようにしてください"って、具体的にどーすんの? .NET ユーザーが、自らのパスワードを変更可能とするためにはパスワード変更用のページを作成する必要があります。しかし、プログラムのコーディングを行う必要はありません。 具体的な手順は、以下の通りです。 .NET ユーザーのパスワード変更ページの作成 ================================ テキストエディタに以下のタグを貼り付け、changePassword.aspx と名前を付けて保存します。 <html> <head runat="server">     <title></title> </head> <body>     <form id="form1" runat="server">     <div>…


ASP.NET1.1 on IIS7.x.

来月開催される Tech・Tdays 2010 ではASP.NET4 の新機能について話をします。 そんなわけで現在、セッション資料を鋭意作成中なわけですが、昨日、同僚の荒井さんと話しをしていて "ASP.NET4 が動作するIIS のバージョンはなんぼからなんやろねぇ?" という話しになりました。 そこで私の脳裏に浮かんだのは、"そういや昔、IIS7 で ASP.NET 1.1 を動かしたいっていう相談を受けたっけなぁ" ということでした。 おそらく、Windows Server をお使い多くの企業様内では、ASP.NET 1.1 で作成された多くの Web アプリケーションが動作していることでしょう。 IIS7 では革新的かつ大きな構造の変更が行われ、かつ既定でインストールされる ASP.NET のバージョンは 2.0 ですが、ASP.NET 1.1 をホストできないわけではありません。 ただちょっと、ほんのすこーし、…..でもないですが、それなりの設定をしてあげれば IIS7 で ASP.NET 1.1 を動作させることが可能です。 もし、そういったことをご存じないために、つまりは ASP.NET 1.1 が IIS7 で動作するということをご存じないために、IIS7 の導入を躊躇されている方がいるとしたらそれは非常に残念なことです。 たしかに前バージョンの IIS6.0 は安定した、パフォーマンスにも優れた非常に良いものでありましたが、IIS7 はさらにさまざまな機能が加えられ、IIS6.0 にはなかった非常に高い拡張性を与えられています。 ASP.NET 1.1 をお使いの方々にもぜひ、 IIS7 の優れたパワー、スピード、破壊力(これは違いますね) を感じていただきたいと切に願うしだいです。…


IIS7.x での共有 Web ホスティングのためのサンプルアプリケーション

先日行われました、弊社パートナー ホスティング事業者様向けイベント向けに、セッションのデモで使用するサンプルアプリケーションを作成しました。 同イベントでの私のセッションは、体調 & マシン環境が万全でなく、トラウマになりそうなくらいの出来の悪さだったわけですが(笑、って、笑いごとではありませんが。。)、サンプルアプリケーションはちゃんと動作するのでここでご紹介させていただきます。 このサンプルアプリケーションは、IIS7.x の新機能である IIS 管理サービスを使用した簡単な 共有 Web ホスティングを行う際にプロビジョニングを行うものです。 具体的には以下の仕事をしてくれます。 インターネット インフォメーション サービスマネージャーユーザー(※以下、"IIS 管理ユーザー") を作成 Web サイト用の物理フォルダを作成 アプリケーションプールの作成 Web サイトの作成 作成した Web サイトに FTP をバインド 作成した Web サイトに、作成した IIS 管理ユーザーを管理者として登録 PHP ランタイムの設定 (※) ※Windows フォーム版のアプリケーションのみ実装。Web 版は UI の実装が間に合わず。 この処理が完了すると、ユーザーは、クライアントマシンにインストールされた IIS マネージャーから、作成された IIS 管理ユーザーアカウントを使用して、同じく作成された自分の管理可能な Web サイトに直接アクセスして管理することが可能になるのです。 ちなみにサンプルアプリケーションの画面はこんな感じです。 登録が完了すると、IIS マネージャーを使用して Web サイトに接続する手順が表示されます。 以前も書きましたが、IIS 管理サービスはポートを任意に指定可能で、かつ…


作ろう!!アプリケーションプール

先日のこのブログの記事に掲載したサンプルコードの “Web サイトの作成” のコメントに “(アプリケーションプールは自動生成される)” とありますが、すみません、これはコメントミスで、実際は自動生成されません。 Web サイトを単純に作成した場合は、規定の設定が継承され、DefaultAppPool が設定されます。 作成する Web サイト、あるいは既存の Web サイトに任意のアプリケーションプールを設定するには、あらかじめアプリケーションプールを作成しておき、それを設定するようにします。 というわけで、アプリケーションプールを作成するためのサンプルーコードは以下です。2 つメソッドが定義されていますが、どちらを使っても OK ですので用途に合わせてお使いください。 サンプル(C#) : アプリケーションプールの作成 //アプリケーションプールの作成:其の壱public Exception CreateApplicationPool(string poolName, bool autoStart, string modeType){    Exception returnExp = null;    try    {        using (ServerManager serverManager = new ServerManager())        {            Configuration config = serverManager.GetApplicationHostConfiguration();            ConfigurationSection applicationPoolsSection = config.GetSection(“system.applicationHost/applicationPools”);            ConfigurationElementCollection applicationPoolsCollection = applicationPoolsSection.GetCollection();            ConfigurationElement addElement = applicationPoolsCollection.CreateElement(“add”);            addElement[“name”] = poolName;            addElement[“autoStart”] = autoStart;            addElement[“managedPipelineMode”]…


IISで、ホストヘッダーによるバーチャルドメインでSSLを使用するには?

ちょっと前にお客様からいただいた質問で以下のようなものがありました。 IIS7.0 で ホストヘッダーを使用したバーチャルドメインの運用を https で対応は可能か? Windows 2003 までは未対応だったが、Windows 2008 R2 ではどうか? はい。可能です。しかし、厳密にいうと仕組み上できません。 なにを言ってるんだ? と思われるかもしれませんが、この問題はそう単純ではありません。 バーチャルドメインと呼ばる、一つの IP アドレスで複数のホスト名のサービスを提供する方法として、HTTP 1.1 で使用されているのがホストヘッダーを利用するものです。 この方法では、Web サーバーは、クライアントからの HTTP リクエスト内の "Host:" フィールドに記載されているホスト名をもとに Web サイトを判定し、レスポンスを切り替えます。 しかし、HTTPS で通信を行う場合、Web サーバーは SSL 通信を開始するにあたり、まず 最初にサーバー証明書をクライアントへ送ります。 そのため、その後クライアントから送られる HTTP リクエスト中に、別のホスト名が書いてあったとしても、すで遅く、別のホスト名での証明書が発行されているため"証明書とホスト名が一致しない" という旨の警告がブラウザに表示されます。 このような動作につき、標準的な Web サーバーで、"ホストヘッダー だけ" を使用して HTTPS の バーチャルドメインの運用はできません。 しかし、現在においては、 RFC 3546 に記載されている、Transport Layer Security (TLS) Extensions という仕様を使用して(しゃれではありません:-)…