🐕

.NET Framework/MVCでWebアプリケーション開発を行う際の前提知識

4 min read

.NET Framework

  • Microsoft社が開発した主にWindows対応のアプリケーション実行環境
  • 2019/04/18にリリースされた.NET Framework 4.8が最後のメジャーアップデート

ミドルウェアとの関係性

  • WebサーバのミドルウェアにはApache, Nginx, IISといった種類がある
  • .NET FrameworkIIS上のみで起動するC#のWebアプリケーションフレームワーク

ASP.NET

総じて、ASP.NETとはWebアプリケーションを作成するための技術の総称で、ウェブサイト作成用とウェブサービス作成用の技術に分かれている

  • Microsoft社が提供するWebアプリケーションフレームワーク
  • 開発環境はWindowsとVisual Studioが必須
  • 開発したWebアプリケーションは.NET Framework上で実行される

ウェブサイト作成用の技術

ウェブサイトとはサーバーからHTMLを返却しアプリケーションを作成する技術

ウェブサイト 概要
Web Forms HTMLを拡張した豊富なコントロールライブラリを用いて迅速な開発が可能
Web Pages HTMLやC#のようにサーバで実行されるコードを同じファイルに実装する方法 (→ASP.NET CoreでいうところのRazor Pages )
Single Page Apps MVCの発展型でJavaScriptコードでWeb APIを非同期に呼び出すことで画面遷移のないアプリケーション開発が可能
MVC 役割毎にコードを分けることで大規模のアプリケーションでも効率的な開発が可能

ウェブサービス作成用の技術

ウェブサービスとは、エンドユーザからリクエストを受けることはなく、主にクライアントとなるプログラムからリクエストを受ける、サーバーからJSONやXMLを返却する技術

ウェブサービス 概要
Web API 外部プログラムから呼び出してウェブサービスを構築可能にする技術
SignalR サーバ・クライアント間の双方向のリアルタイム通信を可能にする技術

ASP.NET MVC

MVCとはUIを持つアプリを実装するためのデザインパターンで、
ASP.NETにMVC特有のデザインパターンを適用し効率的なアプリケーション開発が可能になる

MVCの構成

ユーザがWebブラウザでWebアプリケーションにアクセスした際に呼び出されるController内のアクションメソッドがModelを参照し、抽出した値をViewに返却するというフロー

1. Model

関数(モデルクラス)とDB連携用(データコンテキストクラス)を作成

★Contoroller作成前にビルドを通しモデルの内容を反映させる

  • ビルドはコンパイルからファイル変換などの一連の流れ
  • デバッグはバグの原因を調査して取り除く作業

2. View

RazorはHTMLにC#コードを埋め込むための仕組みで、ビューエンジンと呼ばれ@で始まるコードはサーバーサイドで実行され、作成されたHTMLをWebブラウザ側に返す

3. Controller

スキャフォールディングとはCRUD機能等を自動生成する仕組み

4. ViewModel

  • 実際のDBテーブルと画面表示する項目との差異を吸収するためテクニック

例えば、ログイン画面でユーザ名とパスワードを入力するがDBにはユーザ情報を扱うテーブルがない場合、一時的に入力されたユーザ名とパスワードをViewModelに格納し、この後作成するLoginControllerにデータを転送する

Bootstrap

ASP.NET MVCで生成されたHTMLはBootStrap(CSSのフレームワーク)を用いることを想定して作成されている

Entity FrameWork

  • Microsoftが提供する.NET Frameworkのコンポーネント
  • リストやオブジェクトへの操作をSQL等のDB操作に変換するもので、DBのテーブル行列、キーといった内容を考慮しなくて良いというメリットがある

Entity Frameworkのmigration

  • モデルの変更に併せてDBを作成・変更を行うための仕組み
PM> Enable-Migrations -EnableAutomaticMigrations
Checking if the context targets an existing database...
Code First Migrations enabled for project "AppName".

コードファーストとDBファースト

  • コードファーストではPOCO(特殊なクラスやI/Fを継承していないクラス)を元にEntity Frameworkがテーブルを作成
  • データベースファーストではDBテーブルを元にPOCO(特殊なクラスやI/Fを継承していないクラス)を作成

★作成されたモデルクラス(POCO)を編集することは基本的には行わず、新たにMetadataクラスを作成し追加情報を付加する方式が一般的

アクションメソッド

戻り値であるActionResultの派生(継承)クラスを介してその後行うべき挙動をコントローラに通知する

ビューメソッドとヘルパーメソッド

  • ActionMethodはActionResultを返す
  • ActionMethodは戻り値となるActionResultの派生クラスを返してその後に行うべき挙動をコントローラに通知する
クラス名 ヘルパーメソッド 概要
ViewResult View ActionMethodに対応したViewを出力
RedirectToRouteResult RedirectToAction 指定のアクションメソッドに処理を転送
ContentResult Content 指定されたテキストを出力
FileContentResult File 指定されたファイルを出力
JsonResultResult Json 指定されたオブジェクトをJSON形式で出力
HttpNotFoundResult HttpNotFound 404ページを出力
HttpStatusCodeResult HTTPんステータスコードを返す
EmptyResult 処理を行わない

※ヘルパークラスがないためView演算子でインスタンス生成が必要

CSRF対策(クロスサイトリクエストフォージェリ)

通常はクライアントが入力項目をWebアプリに送信しDBサーバーに格納するが、
攻撃者がクライアントを攻撃ページに誘導しアクセスした時点でWebアプリに入力項目を送信する場合もある。もし、脆弱性を発見した場合はDBサーバーに攻撃内容を送り悪影響を及ぼす可能性がある

対応策として、アプリケーションサーバーはトークンと呼ばれるランダム文字列を生成し、入力フォームとWebアプリサーバー管理下のセッション(Webサイトにアクセスしたユーザがサイト内で行う一連の操作ログ)を格納する

クライアントがWebブラウザで入力項目を送信した時点でトークンを付随させ、アプリケーションサーバー内のトークンと一致しているか否かを検証しリクエストを処理する

トークンは常にランダムな文字列を生成するので攻撃者が偽のトークンを発行しても一致させない仕組みになっている

パスワードのハッシュ化

  • ハッシュ値=ハッシュ関数(salt + password)
string hash = password;
for (int i=0; i<10000; i++)
{
  hash = hash-method(hash + salt + password)
}

intのnull or bool型

  • int? id
    通常のintにはnullをセットできないがint?はセット可能
    Webブラウザからのリクエスト時にidがnullの際も対応できる
    idがnullなら400コードを返し、それ以外の200コードやリストを返すなどの処理が可能

ASP.NET Core

  • 2016年にASP.NETの次期バージョンであるASP.NET Coreがリリースされる
  • Windows、macOS、Linuxなどの実行環境でも動作できる(クロスプラットフォーム開発可能)オープンソースフレームワーク
  • ASP.NET Coreは約半年毎にアップデートされているが、これまでの業務システム開発に関してはASP.NETの方が実績がある