Routing:認証の設定
Routingを用いたプロジェクトでは、ファイルの存在する場所とURLは基本的には一致しません。
こういうときForm認証の設定をどのように行えばよいかまとめてみます。
たとえば下記の記事で書いたようなサンプルを作成します。
ちょっと先取り Routing 4:その1 PageRouteHandler
このとき、Default2.aspxはサイト直下に存在していますが、Default2.aspxにアクセスするためのURLは
http://localhost:(port)/RoutingTest/test/
です。
Form認証の設定はURLに対して行いますので、このような場合、testフォルダをサイト直下に作成し、そのフォルダにweb.configを置いて以下のように記述する、という手段が使えます。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</configuration>
ただ、この方法だと利用する必要がないフォルダを追加していくことになってしまいます。
実はこのような場合、web.config内でlocation要素を利用することで存在しないURLへの設定を行うことができます。
具体的には以下の記述をサイト直下のweb.configのconfiguration要素の最後に記述します。
<location path="test">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
これでtestフォルダを追加しなくても、
http://localhost:(port)/RoutingTest/test/
のようなURLに認証の設定を行ったことになります。
なおRoutingを利用していても、設定を変更しなければ、認証が必要なときはlogin.aspxファイルが呼び出されます。
Routingの利用にこだわりたい場合は、以下のようにauthentication要素でloginUrlを設定します。
<authentication mode="Forms">
<forms loginUrl="login/" />
</authentication>
このように設定したうえで、
http://localhost:(port)/RoutingTest/login/
というURLに対して認証を行うページが表示されるようRoutingの設定をすれば正しく動かすことができます。
Routing:aspxファイルの隠蔽
Routingを用いたプロジェクトでaspxファイルを直接指定した場合、標準では指定されたaspxファイルがそのまま表示されます。
たとえば下記の記事で書いたようなサンプルを作成してみます。
ちょっと先取り Routing 4:その1 PageRouteHandler
このとき、Default2.aspxはサイト直下に存在しています。
ここでデバッグ時に次のように直接Default2.aspxを指定してみましょう。
http://localhost:(port)/RoutingTest/Default2.aspx
Default2.aspxが表示されますが、この場合Routingが行われているわけではありません。
当然RouteDataも取り出せない、というかそもそも設定されていませんので、場合によってはエラーになることが十分に考えられます。
このようなことがないように、直接aspxファイルを表示させない方法を考えてみます。
参考になるのはDynamicDataプロジェクトです。
DynamicDataプロジェクトでは、DynamicDataフォルダ直下にweb.configがあります。
この中には以下のように記述されています。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<httpHandlers>
<add path="*.aspx" verb="*" type="System.Web.HttpNotFoundHandler" validate="true"/>
</httpHandlers>
</system.web>
</configuration>
これは、aspxファイルが直接指定された場合、ファイルが存在していたとしてもファイルが見つからなかった、というエラーを返す設定になります。
DynamicDataプロジェクトでは、この設定を使うことでaspxファイルが直接指定されておかしなエラーが発生することを防いでいます。
これにならって最初に作ったサンプルを修正してみましょう。
サイトのルートの直下にRouteFileフォルダを作成し、Default2.aspxをRouteFileフォルダに移動します。
また、RouteFileフォルダにweb.configファイルを作成し、上記と同じくHttpNotFoundHandlerの設定を記述します。
それからGlobal.asaxファイルに記述されているRoutingの設定中のDefault2.aspxの位置を修正します。
RouteTable.Routes.Add("testRoute",
new Route("test/{id}",
new RouteValueDictionary(new { id = 1 }),
new PageRouteHandler("~/RouteFile/Default2.aspx")));
このように修正すると、
http://localhost:(port)/RoutingTest/test/
のようにRoutingが利用される場合には正しく表示が行われますが
http://localhost:(port)/RoutingTest/RouteFile/Default2.aspx
このようにaspxファイルを直接指定した場合にはファイルが見つからないというエラーになります。
このHttpNotFoundHandlerの設定はRoutingの場合だけでなく、直接ファイルを指定したときにそれを見せないようにする必要があるときに便利に使える設定です。
実際にマシンレベルでのweb.configをみると、HttpNotFoundHandlerを使った設定がいくつも記述されています。
ここで使い方を覚えておくといいかもしれません。