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単体への直アクセスも見事弾く事が出来ました。ああ、道のりは長かった・・・。