2011-02-08 11 views
4

「ホーム」のCRUDシナリオを処理するコントローラがあるとします。 Getは次のようになります。異なるHTTPメソッドを持つRESTfulコントローラ、ただし同じパラメータ

[HttpGet] 
    public ActionResult Index(int? homeId) 
    { 
     Home home = homeRepo.GetHome(homeId.Value); 

     return Json(home, JsonRequestBehavior.AllowGet); 
    } 

これまでのところとても良いです。次に、新しいアクションを追加するためのポストアクションを追加します。

[HttpPost] 
    public ActionResult Index(Home home) 
    { 
     //add the new home to the db 

     return Json(new { success = true }); 
    } 

驚くばかりです。しかし、私はputs(既存の家を更新する)を処理するために同じスキームを使用するとき...

[HttpPut] 
    public ActionResult Index(Home home) 
    { 
     //update existing home in the db 

     return Json(new { success = true }); 
    } 

私たちは問題に遭遇します。ポストとプットのメソッドシグネチャは同じですが、もちろんC#ではそうではありません。署名に偽のパラメータを追加する、CRUDを直接反映するようにメソッド名を変更するなど、いくつか試してみることができます。しかし、それらはハッキーまたは望ましくないです。

ここでRESTfulなCRUDスタイルのコントローラを保存するためのベストプラクティスは何ですか?基本的にはActionNameAttributeがこれらのシナリオに対処するために作成された

[HttpPut] 
[ActionName("Index")] 
public ActionResult IndexPut(Home home) 
{ 
    ... 
} 

+0

なぜあなたは名前が変わっているか望ましくないものを変更することを検討していますか?これらのメソッドは異なる目的を果たすので、私は彼らが異なる名前にふさわしいと言います。 –

+0

RESTfulなアプローチでは、異なるHttpMethods(Create = Post、Read = Get、Update = Put、Delete = Delete)を使用して、すべて同じURLに解決する必要があるためです。それにはたくさんの理由がありますが、ほとんどの場合、これをはるかに簡単に作成できるjavascript APIが作成されます。小さくても。 – Dusda

+1

そうですね、Mattのソリューションは素晴らしいです。 C#コードをコンパイルしたまま、外部APIをRESTfulに保ちます。 –

答えて

12

これは私が知っている最良の解決策です。

+0

紳士と学者。それは私が逃げることができるほどエレガントに見えます:)。 – Dusda

0

HttpPutとHttpDeletesはいくつかのファイアウォールによって制限されているので、単純にHttpPostとHttpGetが使用されます。レコードIDが渡された場合(またはその他の基準)、そのレコードがわかっています。許可されました - これはあなたが決定するためのもので、httpputはあなたにとってうまくいくかもしれませんが、これは単なる警告です。それは大したことではありません。

どちらの方法を使用しても、アクセスできないレコードの更新を強制するためにページに誤ったIDを挿入しようとするユーザーには注意が必要です。私たちはそれをレンダリングするとき、あなたのビューで、この場合に

 
ViewData["IdCheck"] = Encryption.ComputeHash(home.HomeId.ToString()); 

を視野にhome.HomeIdをハッシュすることによってこの問題を回避:

 
    <%: Html.Hidden("IdCheck", ViewData["IdCheck"]) %> 

あなたHttpPostやHttpPut方法で(更新を行っている方)

 
if (Encryption.ComputeHash(home.HomeId.ToString()) != (string)Request.Form["IdCheck"]) 
{ 
     throw new Exception("Hashes do not match"); 
} 

また、フォームデータを信頼する場合は、どのような方法で更新するのにも同じセキュリティ問題が存在します。

+0

私たちはいくつかの対策を講じていますが、私はIDのハッシュを考慮していませんでした。面白い。 – Dusda

+1

http://www.nycdotnetdev.com/Download.aspxをチェックして、「1/20/2011 ASP.NET WebフォームとMVC Webアプリケーションのハッキングプルーフ」を選択してください。 –

関連する問題