目次＞第3章 サンプルアプリケーション構築 > 3.7 画面遷移保証

# 3.7 画面遷移保証

## 概要

本節では、Server Frameworkが提供する画面遷移保証機能を用いて、不正な画面遷移を防止する方法の学習を行う。
画面遷移保証機能を用いれば、画面遷移設定ファイルに設定された各画面のcheckToken属性またはupdateToken属性の設定を行うだけで、不正な画面遷移を防止することができる。詳細は、機能説明書『WA-02 画面遷移保証機能』を参照のこと。
本節では、以下の２パターンの不正な画面遷移を防止する方法について演習を行う。

- URLの直接指定による画面遷移の防止
- ブラウザの戻るボタンによる画面遷移の防止

## 3.7.1 URLの直接指定による画面遷移の防止

### 動作イメージ

図3.7-1 動作イメージ

- 対象画面
  - 任意の画面
  - ログオン画面（LogonForm.aspx）
  - メニュー画面（MenuForm.aspx）
- 処理概要
  1. 任意の画面で、ブラウザのアドレス欄のURLに「http://localhost/tutorialServerWeb/Form/LogonForm.aspx」を入力し、移動ボタンをクリックし、ログオン画面に遷移する。
  2. ログオン画面で、ブラウザのアドレス欄のURLを「LogonForm.aspx」から「MenuForm.aspx」に書き換え、移動ボタンをクリックし、メニュー画面にアクセスすると、URL直接アクセスをして不正な画面遷移をしたとして例外をスローする。
  3. エラー画面遷移機能を用いて、画面遷移エラー画面へ遷移させる。

## 作業手順

- 作成イメージ
  1. Web構成ファイルの設定
  2. 画面遷移設定ファイルの設定
  3. エラー画面遷移設定ファイルの設定

### 1. Web構成ファイルの設定

Web構成ファイルのhttpModulesセクションでコメントアウトされている画面遷移保障機能の設定箇所（TokenProcessorImpl）のコメントを解除する。

Web.config

    <httpModules>
      <!-- 画面遷移機能の設定 -->
      <add name="TransitionListenerImpl" type="TERASOLUNA.Fw.Web.HttpModule.TransitionListenerImpl, TERASOLUNA.Fw.Web"/>
      <!-- 画面遷移保障機能の設定 -->
      <add name="TokenProcessorImpl" type="TERASOLUNA.Fw.Web.HttpModule.TokenProcessorImpl, TERASOLUNA.Fw.Web"/>
      <!-- 二重押下防止機能の設定 -->
      <add name="PreventDoubleSubmitImpl" type="TERASOLUNA.Fw.Web.HttpModule.PreventDoubleSubmitImpl, TERASOLUNA.Fw.Web"/>
      <!-- エラー画面遷移機能の設定 -->
      <add name="ExceptionTransitionListerImpl" type="TERASOLUNA.Fw.Web.HttpModule.ExceptionTransitionListenerImpl, TERASOLUNA.Fw.Web"/>
    </httpModules>

コメントを解除することで、HttpModuleとしてTokenProcessorImplクラスが認識され、画面遷移保障機能が有効になる

### 2. 画面遷移設定ファイルの設定

画面遷移設定ファイル（PageConfiguration.config）にcheckToken属性の設定を行う。
checkToken属性に"on"が設定された画面に、URLで直接アクセスしようとすると例外がスローされる。
URLによる直接アクセスを防止するメニュー画面のcheckToken属性には"on"を設定する。

      <!-- メニュー画面 -->
      <page name="MenuForm" path="/Form/MenuForm.aspx" checkToken="on" />

URLによる直接アクセスを防止しないログオン画面のcheckToken属性には"off"を設定する。

      <!-- ログオン画面 -->
      <page name="LogonForm" path="/Form/LogonForm.aspx" checkToken="off" />

上記設定に加え、画面遷移例外発生時に遷移する画面の定義の追加も行う。画面遷移IDには"ExceptionTransitForm"、pathには"/Form/ExceptionTransitForm.aspx"を指定すること。ExceptionTransitForm.aspxファイルは最初からプロジェクトに含まれているので、新規作成する必要はない。

      <!-- 画面遷移エラー画面 -->
      <page name="ExceptionTransitForm" path="/Form/ExceptionTransitForm.aspx" />

設定完了後の画面遷移設定ファイルを以下に記す。

PageConfiguration.config

    <?xml version="1.0" encoding="utf-8" ?>
    <!-- ページ設定ファイルの設定 -->
    <pageConfiguration xmlns="http://www.terasoluna.jp/schema/PageSchema.xsd">
      <!-- 計算画面 -->
      <page name="CalcForm" path="/Form/CalcForm.aspx" />
      <!-- 商品選択画面 -->
      <page name="SelectItemForm" path="/Form/SelectItemForm.aspx" updateToken="off" />
      <!-- 商品確認画面 -->
      <page name="ConfirmItemForm" path="/Form/ConfirmItemForm.aspx" />
      <!-- 商品確定画面 -->
      <page name="CompleteItemForm" path="/Form/CompleteItemForm.aspx" />
      <!-- ログオン画面 -->
      <page name="LogonForm" path="/Form/LogonForm.aspx" checkToken="off" />
      <!-- メニュー画面 -->
      <page name="MenuForm" path="/Form/MenuForm.aspx" checkToken="on" />
      <!-- アプリケーションエラー画面 -->
      <page name="ExceptionForm" path="/Form/ExceptionForm.aspx" />
      <!-- 画面遷移エラー画面 -->
      <page name="ExceptionTransitForm" path="/Form/ExceptionTransitForm.aspx" />
    </pageConfiguration>

※checkToken属性は省略可能で、省略するとcheckToken属性に"on"が設定されたことと同じ挙動となる。

### 3. エラー画面遷移設定ファイルの設定

エラー画面遷移設定ファイル（Config\ExceptionTransition.config）に、 画面遷移例外（InvalidTransitionException）発生時の定義を追加する。遷移先IDには1. 画面遷移設定ファイルの設定で定義した"ExceptionTransitForm"を指定する。

      <!-- 不正な画面遷移が行われた場合の遷移先を指定する-->
      <exceptionTransition exceptionType="TERASOLUNA.Fw.Web.HttpModule.InvalidTransitionException" nextPage="ExceptionTransitForm"/>

設定完了後のエラー画面遷移設定ファイルを以下に記す。

ExceptionTransition.config

    <?xml version="1.0" encoding="utf-8"?>
    <!--エラー画面遷移設定ファイルの設定-->
    <exceptionTransitionConfiguration xmlns="http://www.terasoluna.jp/schema/ExceptionTransitionSchema.xsd">

      <!-- ApplicationException発生時の遷移先を指定する -->
      <exceptionTransition exceptionType="System.ApplicationException" nextPage="ExceptionForm"/>

      <!-- 不正な画面遷移が行われた場合の遷移先を指定する-->
      <exceptionTransition exceptionType="TERASOLUNA.Fw.Web.HttpModule.InvalidTransitionException" nextPage="ExceptionTransitForm"/>

      <!--
      <exceptionTransition exceptionType="System.Web.HttpException" nextPage="Error1" />
      <exceptionTransition exceptionType="TERASOLUNA.Fw.Web.HttpModule.SessionTimeoutException" nextPage="Error1"/>
      -->
    </exceptionTransitionConfiguration>

## 動作確認

1. サーバアプリケーションを起動する(TutorialServerWebプロジェクトの発行)。
2. ブラウザのアドレス欄のURLに「http://localhost/tutorialServerWeb/Form/LogonForm.aspx」を入力し、移動ボタンをクリックし、正常にログオン画面が表示されることを確認する。
3. ブラウザのアドレス欄のURLを「LogonForm.aspx」から「MenuForm.aspx」に書き換え、移動ボタンをクリックし、直接メニュー画面にアクセスする。
4. 画面遷移エラー画面に遷移することを確認する。

図3.7-2 ログオン画面⇒画面遷移エラー画面
checkTokenが"off"に設定されたログオン画面にURL直接アクセスができることでURL直接アクセスを許容できたことを確認でき、checkTokenが"on"に設定されたメニュー画面にURL直接アクセスできないことでURL直接アクセスを防止できたことを確認できる。

## 3.7.2 ブラウザの戻るボタンによる画面遷移の防止

### 動作イメージ

#### 商品確認画面にブラウザの戻るボタンによる画面遷移を防止する場合の動作イメージ

図3.7-3 動作イメージ

- 対象画面
  - 商品確認画面（ConfirmItemForm.aspx）
  - 商品確定画面（CompleteItemForm.aspx）
- 処理概要
  1. 商品確認画面の「商品確定画面へ」ボタンをクリックし、商品確定画面に遷移する。
  2. ブラウザの戻るボタンをクリックして、商品確認画面に遷移する。
  3. 再度商品確認画面の「商品確定画面へ」ボタンをクリックすると、戻るボタンをクリックして不正な画面遷移をしたとして、例外をスローする。
  4. エラー画面遷移機能を用いて、画面遷移エラー画面へ遷移させる。

#### 商品選択画面にブラウザの戻るボタンによる画面遷移を許容する場合の動作イメージ

図3.7-4 動作イメージ

- 対象画面
  - 商品選択画面（SelectItemForm.aspx）
  - 商品確認画面（ConfirmItemForm.aspx）
- 処理概要
  1. 商品選択画面の「商品確認画面へ」ボタンをクリックし、商品確認画面に遷移する。
  2. ブラウザの戻るボタンをクリックして、商品選択画面に遷移する。
  3. 再度商品選択画面の「商品確認画面へ」ボタンをクリックし、商品確認画面に遷移する。

## 作業手順

- 作成イメージ
  1. 画面遷移設定ファイルの設定

本作業の前に3.7.1 URLの直接指定による画面遷移の防止の演習が終了し、Web構成ファイルおよびエラー画面設定ファイルの設定が行われていることを前提に説明する。

### 1. 画面遷移設定ファイルの設定

画面遷移設定ファイル（PageConfiguration.config）にupdateToken属性の設定を行う。 updateToken属性に"on"が設定された画面に、ブラウザの戻るボタンを押下して遷移し、次画面に遷移しようとすると例外がスローされる。
戻るボタン押下後の遷移を防止する商品確認画面のupdateToken属性には"on"を設定する。

      <!-- 商品確認画面 -->
      <page name="ConfirmItemForm" path="/Form/ConfirmItemForm.aspx" updateToken="on" />

戻るボタン押下後の遷移を防止しない商品選択画面のupdateToken属性には"off"を設定する。

      <!-- 商品選択画面 -->
      <page name="SelectItemForm" path="/Form/SelectItemForm.aspx" updateToken="off" />

設定完了後の画面遷移設定ファイルを以下に記す。

PageConfiguration.config

    <?xml version="1.0" encoding="utf-8" ?>
    <!-- ページ設定ファイルの設定 -->
    <pageConfiguration xmlns="http://www.terasoluna.jp/schema/PageSchema.xsd">
      <!-- 計算画面 -->
      <page name="CalcForm" path="/Form/CalcForm.aspx" />
      <!-- 商品選択画面 -->
      <page name="SelectItemForm" path="/Form/SelectItemForm.aspx" updateToken="off" />
      <!-- 商品確認画面 -->
      <page name="ConfirmItemForm" path="/Form/ConfirmItemForm.aspx" updateToken="on" />
      <!-- 商品確定画面 -->
      <page name="CompleteItemForm" path="/Form/CompleteItemForm.aspx" />
      <!-- ログオン画面 -->
      <page name="LogonForm" path="/Form/LogonForm.aspx" checkToken="off" />
      <!-- メニュー画面 -->
      <page name="MenuForm" path="/Form/MenuForm.aspx" checkToken="on" />
      <!-- アプリケーションエラー画面 -->
      <page name="ExceptionForm" path="/Form/ExceptionForm.aspx" />
      <!-- 画面遷移エラー画面 -->
      <page name="ExceptionTransitForm" path="/Form/ExceptionTransitForm.aspx" />
    </pageConfiguration>

※updateToken属性は省略可能で、省略するとupdateToken属性に"on"が設定されたことと同じ挙動となる。

## 動作確認

### 1. 商品確認画面へのブラウザの戻るボタンによる画面遷移を防止できることの動作確認

1. サーバアプリケーションを起動する(TutorialServerWebプロジェクトの発行)。
2. ブラウザのアドレス欄のURLに「http://localhost/tutorialServerWeb/Form/LogonForm.aspx」を入力し、移動ボタンをクリックし、正常にログオン画面が表示されることを確認する。
3. ログオン画面でユーザID "tera"、パスワード "soluna" と入力し、「ログオン」ボタンを押下する。
4. メニュー画面の「商品選択画面」ボタンを押下する。
5. 商品選択画面で商品を選択し、「商品確認画面へ」ボタンを押下する。
6. 商品確認画面で「商品確定画面へ」ボタンを押下する。

図3.7-5 updateTokenが"on"の画面の動作確認1

7. 商品確定画面でブラウザの戻るボタンを押下する。
8. 商品確認画面で「商品確定画面へ」ボタンを押下する。
9. 商品確定画面への遷移を防止し、画面遷移エラー画面に遷移することを確認する。

図3.7-5 updateTokenが"on"の画面の動作確認2
商品確定画面から戻るボタンを押下してupdateTokenが"on"に設定された商品確定画面に遷移した後に、商品確定画面に遷移しようとすると例外が発生しエラー画面に遷移することで、商品確認画面に戻るボタンによる遷移を防止できたことを確認できる。

### 2. 商品選択画面へのブラウザの戻るボタンによる画面遷移を許容できることの動作確認

1. サーバアプリケーションを起動する(TutorialServerWebプロジェクトの発行)。
2. ブラウザのアドレス欄のURLに「http://localhost/tutorialServerWeb/Form/LogonForm.aspx」を入力し、移動ボタンをクリックし、正常にログオン画面が表示されることを確認する。
3. ログオン画面でユーザID "tera"、パスワード "soluna" と入力し、「ログオン」ボタンを押下する。
4. メニュー画面の「商品選択画面」ボタンを押下する。
5. 商品選択画面で商品を選択し、「商品確認画面へ」ボタンを押下する。

図3.7-6 updateTokenが"off"の画面の動作確認1

6. 商品確認画面でブラウザの戻るボタンを押下する。
7. 商品選択画面で商品を選択し、「商品確認画面へ」ボタンを押下する。
8. 正常に商品確認画面に遷移できることを確認する。

図3.7-6 updateTokenが"off"の画面の動作確認2
商品確認画面から戻るボタンを押下してupdateTokenが"off"に設定された商品選択画面に遷移した後に、商品確認画面に遷移しようとすると例外が発生せず正常に商品確認画面に遷移できることで、戻るボタンによる遷移を許容できたことを確認できる。

次節：第4章 Appendix