2016年02月21日

DefaultAppPool で ファイルアクセスできないときのチェックポイント


WebApp でローカルファイルをアクセスしようとしたときに、「アクセスが拒否されました」等の理由でファイルがオープンできない場合があります。当然、フォルダ等のアクセス権の問題なので、ここから悪銭苦闘が始まります。ワーカプロセスの権限を変えるとアクセスできたりするのですが、Administrator に近い権限を与えるのは危険です。そこで、次の項目をチェックするといいでしょう。

  • ワーカプロセスを起動するIDには、ApplicationPoolIdentity, NetworkService, LocalService, LocalSystem とありますが、なるべく ApplicationPoolIdentity や、NetworkService あたりで動かすとよいと思います。

  • ローカルフォルダにアクセス件を与えます。ファイルのセキュリティタブで、IIS AppPool\DefaultAppPool 等で、読み取り専用の権限を与えます。特定の AppPool を作成した場合には、IIS AppPool\(特定のプール名)を使うと、そのサイトにだけ権限を与えることができます。

  • WebApp のプログラム側では、ファイルは ReadOnly でオープンします。何も指定しないと、ReadWrite オープンを指定されたと思って、アクセス拒否されることがあります。(よくあるミスです。)

  • WebApp でローカルファイルへの書き込みはあきらめましょう。実験したところ、LocalSystem 権限など Administrator 相当でしか、ファイル書き込みはできませんでした。書き込みが必要な場合には、DBの利用を考えた方がいいでしょう。


なぜか、アクセスが拒否される場合は、上記の中でも、ファイルをオープンする際に、ReadOnly にし忘れているか確認してみるといいと思います。


posted by 開発G at 18:49| Comment(0) | TrackBack(0) | ASP.NET

2016年01月14日

Master ページの Initイベントと、Load イベントの呼び出されるタイミング

ASP.NET では、Masterページと、Content ページを組み合わせて Webページを開発することができますが、ページが表示される際に、どのような順序で初期化されるか悩んだことはありませんか?

悩んだ末に次のような順序でイベントが発生することがわかりました。Initと、Load で順序が違うんですよ。Init イベントは、外側から始まって、内側が呼び出されていき、Loadイベントは内側から外側に向かって呼び出されるという具合です。どこかの Window 関連イベントと似ています。


  • マスタ ページの Init

  • コンテンツ ページの Init イベント

  • コンテンツ ページの Load イベント

  • マスタ ページの Load イベント



実は、必要なのは、Init と、Load のタイミングだけだったのですが、内部のコントロールまで入れると
かなり複雑になるようです。

詳細は、次のページで確認できるんですが、日本語訳のページと、英語のページの内容が微妙に違っていてわかりずらいです。一応、Helpful じゃないとコメント入れておきました。

ASP.NET のマスター ページとコンテンツ ページのイベント


Events in ASP.NET Master and Content Pages
posted by 開発G at 23:26| Comment(0) | TrackBack(0) | ASP.NET

フォーム認証とセッションは、相互に関係ないので要注意

Webサーバでのセッションは、ブラウザに対して SessionID が発行されて、Session 変数にクライアント固有の値を保持します。タイムアウトはデフォルトで20分です。ログイン等を行った後で、ログイン状態を Session 変数に保存したりしますが、クライアントからの応答がなにもない状態が続くとタイムアウトになり、セッションに保存していた情報はすべて消えます。

一方で、フォーム認証は、FormsAuthentication.SetAuthCookieでログイン状態になり、FormsAuthentication.SignOutでログアウト状態になります。フォーム認証もブラウザに対してチケットを発行する仕組みで、時間がきたらタイムアウトしますが、永続的に与えることも可能です。

セッションと、フォーム認証は、基本的にそれぞれ独自のタイムアウトがあるわけですが、別々のタイムアウト時間を与えることができるため、セッションがタイムアウトしても、フォーム認証は残っていたり、その逆に、フォーム認証のタイムアウト時間が短いとセッションは残っているのに、フォーム認証がタイムアウトしてしまうことがあります。

例えば、フォーム認証が先にタイムアウトすると、web.config で指定していたページへアクセスできなくなったりします。逆に、セッションが先にタイムアウトすると、ログインしているように見えるのにページ内容が違って見えたりします。どうしたらいいかは、システムごとに違うと思いますが、まずはフォーム認証とセッションを、ログイン状態であるか、ログアウト状態であるかを一致させることが重要だと思います。

とにかく、セッションと、フォーム認証はそれぞれ独自のメカニズムであり、全く関係ない点に要注意です。
posted by 開発G at 07:15| Comment(0) | TrackBack(0) | ASP.NET