2008/2/14 記
Web サーバーによる制約
このホームページを開設する際に、ローカル環境で試験して問題がないのに、
サーバーにアップして試験するとサーバーでセキュリティ例外が出るという問題に悩んでいました。
(このホームページは、開設から 2008/2/14 現在まで、ファーストサーバーというレンタルサーバー会社が提供している、
無料の共有サーバーを利用させてもらっています)
原因が分からなかったので、レンタルサーバー会社に問い合わせたところ
「Trust Level が 『Medium のカスタマイズ』 に設定されおり、
そのレベルで動作が認められないコードが存在することが原因と考えられる。
web.config に trust level="Medium" と追加してローカル環境で試してみてください。」とのこと。
早速 trust level 設定を追加してローカル環境で試してみると、サーバーで試した時と同様に、以下のセキュリティ例外が出ました。
レンタルサーバー会社のホームページに ASP.NET Trust Level が「Medium のカスタマイズ」
ということは明記してあったのですが、その時までそれが何を意味するのか分からなかったという次第です。(^_^;)
共有サーバーですから、セキュリティ制約をある程度厳しくせざるを得ないですよね。
でも、やはり、結構不自由です。
以下に、今までこのホームページ作成の際に問題となった制約について書いておきます。
<その1>
このホームページで使用している自作 MemebershipProvider は、 ユーザー認証に使用するパスワード等を暗号化するたの暗号キーの自動設定 (AutoGenerate)
をサポートしていません。
従って、暗号化する場合は(Encrypted または Hashed の二通りのオプションあり)、
Web.config の machineKey の decryptionKey に暗号キーを設定しておく必要があります。
Encrypted の場合は、EncryptPassword, DecryptPassword メソッドが独自に
decryptionKey から暗号キーを取得してくるので問題ありませんが、
Hashed の場合は以下のようなコードで machineKey から暗号キーを取得せざるを得ません。その時、
OpenWebConfiguration メソッドでセキュリティ例外が出ます。
Configuration cfg = WebConfigurationManager.OpenWebConfiguration(path);
machineKey = (MachineKeySection)cfg.GetSection("system.web/machineKey");
string[] keys = machineKey.DecryptionKey.Split(new char[] { ',' });
今までのところ、セキュリティ例外の回避策(OpenWebConfiguration メソッドを使わないで
machineKey を取得する方法)が見つからないので、Hashed パスワードは使用できない状況です。
<その2>
指定された id、サイズの写真のイメージを DB から取得して
HTTP context body に書き込むジェネリックハンドラで、下記プロパティを設定していましたが、
HttpResponse.BinaryWrite メソッドでセキュリティ例外が出るので削除しました。
httpResponse.BufferOutput = false;
上記プロパティは、ページ全体の処理が完了した後に出力をバッファリングしてから送信するかどうかを示す値を取得または設定するもので、バッファリングする場合は true、それ以外の場合は false にするとのことです。
削除すると、デフォルトで ture になりますが、削除しても動作に問題は出なかったので助かりました。
<その3>
メールを送信するために以下のメソッドを使用しようとしましたが、セキュリティ例外が出るので断念しました。
tcpClient.Connect(host, port);
SmtpClient クラスを使っての SMTP 認証はうまくいかないのですが、
上記のメソッドを使えば SMTP 認証もメール送信も成功します。でも、trust level="Medium" では不可でした。