modest violet

modest violet

開発者としてのあれこれや、日々の雑記など

your future hasn't written yet. no one's has.
by Emmett Lathrop "Doc" Brown

ASP.NET MVCで静的HTMLにアクセス制限をかけようと四苦八苦した失敗談まとめ

ASP.NET MVCは、まだまだ初心者の域をウロウロしている状態です。ずっとWinForms畑だったので、Webはからきしです。
さて、ASP.NETでは認証の仕組みとして、ASP.NET Identityという便利な認証機能が備わっています。これを使用しながらMVCでページを作っていたのですが、「普通のhtmlで十分な静的ページを配置するには」という所でつまづきました。
結論的にはweb.configの設定で解決出来るレベルのお話だった訳なのですが、そこにたどり着くまでに非常に紆余曲折してしまったのです。そもそも「MVC側で何かしないといけない」という固定観念が強くてですね。お恥ずかしい限りです。答えにたどり着くまでの失敗談です。

行いたかったこと

  • 特定のパスの下はMVCから切り離して、会員コンテンツ的な静的Htmlのみの構成
  • 特定パス以下は、ログインしていないと参照できない

失敗考察1:MVCのルーティングで何とかしようとしていた

Viewフォルダーの下に、静的htmlの入ったフォルダーを構成して最初はゴニョゴニョしようとしていました。でもルーティング機能が働くので、結果的に絶対パスが存在しない先を示してしまい、「ありゃ、何か違うぞ?」という停滞振り。
いつも勉強させて頂いているしばやん雑記さんの記事を見つつ、ここまで細かい事がしたい訳でもないしなぁ・・・と。
blog.shibayan.jp

結果として、Viewの階層には入れずにContentとかScriptsと同じ階層に、静的用のパスを作成しました。MVCだからと言って、素直にルーティングで何とかしないといけないと固執したのが駄目でした。

失敗考察2:web.configの役割を理解していなかった

WinFormsで言うところのapp.configくらいの感覚でweb.configは扱っていました。それこそ接続文字列管理だったり、log設定だったり。
でも、web.configは.htaccessの代わりだったんですね。。。いやぁ、あまりに無知すぎました。
そもそも、最初はRouteConfig.cs辺りで設定するのかな~、などと思っていたのですが、ふと.htaccess置けばいいじゃん。と思い立った結果、IISではweb.configだという事を知ったわけで・・・。通りでViewsにもweb.configが有るわけだ。
早速追加した静的html用パスにweb.configを追加します。

<system.web>
  <authorization>
    <deny users="?"/>
  </authorization> 
</system.web>

見事、パスへのアクセスは弾かれました!万歳!!・・・と思ったら、htmlファイル単体へはアクセス通りますねぇ・・・。何故だ。

どうもHtmlはIISのデフォルト設定では対象にならないようです。よってweb.configに下記を追加しました。

<system.webServer>
  <handlers>
    <add  name = "HTMLHandler"  type = "System.Web.StaticFileHandler"  path = "*.html"  verb = "GET"   />
  </handlers>
</system.webServer>

これで、html単体への直アクセスも見事弾く事が出来ました。ああ、道のりは長かった・・・。

失敗考察3:勉強不足!

言い訳がましいですが、本当に覚えないといけない範囲が広い!今回の対応結果は結局MVCは全く関係なくて、元々のWebFormの時代からあった内容です。そりゃあMVCキーワードで探してたらなかなか見つかりませんよね・・・。
まだまだ覚える事が山積みですが、少しずつ理解すればするほどワクワクしています。MVCは楽しいですね。