tekitoumemo’s diary

思ったことを書くだけ。長文版Twitter

AutoValidateAntiforgeryTokenが便利すぎて感動した

f:id:tekitoumemo:20180515005125j:plain

今の現場がレベル高くて全く付いていけなくてひたすら給料泥棒してます、よくクビにならんわな。

みんなの洋楽ランキングを絶賛移行中で色々ネタが増えました。それが.Net Coreから追加されたCRLF対策のAutoValidateAntiforgeryTokenで最強だと知りました。あんまりよくわからないけどセキュリティ対策はシンプルに明示的にやる必要ないって考えから出来たみたい。
github.com

今までのValidateAntiForgeryTokenはこんな感じで実装してました。

Controller側

using Microsoft.AspNetCore.Mvc;
[ValidateAntiForgeryToken]
public ActionResult Index ( {
 ....

}

cshtml側

...
@Html.AntiForgeryToken()
 ....

これでクライアント側でトークンを発行してトークンが違ったら400(Bad Request)になるという仕組み。別にこれでも特に問題がなかったのですが、もっと便利な仕組みが.Net Coreで追加されました。

それがAutoValidateAntiforgeryTokenです。
AutoValidateAntiforgeryToken属性が追加Postアクションはクライアント側(html)で明示的に指定しなくてもトークン認証をしてくれるものです。どういうことかというと以下の通り。
Controller側

using Microsoft.AspNetCore.Mvc;
[AutoValidateAntiforgeryToken]
public ActionResult Index ( {
 ....

}

cshtml側

...
// なにもいらないよ!!
 ....

これで以下のhtmlが生成されます。

<input name="__RequestVerificationToken" type="hidden" value="CfDJ8HJB_Oodagkasdfghjgk">

Attributeなのでクラスにつけられるので素敵すぎる!私はベースのコントローラー作ってそれを継承して使ってるので全てのコントローラーに適応されます。以下みたいな感じ。
BaseController

[AutoValidateAntiforgeryToken]
public class BaseController : Controller {
 .........
}

HomeController

public class HomeController : BaseController {
 .........
}

セッション操作などBaseControllerを用意すると便利?(設計のことはわからないけれども)なのでAutoValidateAntiforgeryTokenも付けられるとめっちゃ使い勝手がよくて最高でした。ajaxとか使ってても以下のような感じでいけると思うのでそこまで困らないかなと思います(試してないけど

var token = $('input[name="__RequestVerificationToken"]').val();
 
$.ajax({
    url: '/home/index/',
    type: 'POST',
    data: {__RequestVerificationToken: token},
    dataType: 'JSON',
    success: function (data) {
        console.log(data);
}