1

私のMVCアプリケーションにはPlayerCoachオブジェクトがあり、ユーザーはどちらでもかまいません。私もTeamオブジェクトを持っています。知りたいのは、リストに含まれている、PlayersまたはルートCoachTeamアクセスするユーザーを防ぐ方法です。たとえば、自分が所属しているチーム以外のチームのIDは/Teams/Details/2どこにありますか。 2

前もって感謝します!

4

2 に答える 2

0

最も簡単な解決策は、URLをIDの使用からランダムなGUIDに変更することです。誰かが別の有効な値を推測する可能性をほぼ排除します。もちろん、これは定義上安全ではありません(主に、誰かが履歴または別のソースから他のURLを取得する可能性があるため)が、シナリオによってはこれで十分です。

より良い解決策は、メソッドを実装し、とを使用してIDをチェックするIActionFilterインターフェースに基づいて新しい属性を作成することです。次に、この属性をコントローラーメソッドに適用します。OnActionExecutingthis.ControllerContext.HttpContext.User.Identity.Namethis.RouteData.Values["id"]

現在のシステムでは、各メソッドの最初の行としてユーザー権限を確認するコードを追加するだけで、コントローラーメソッドに行レベルのセキュリティを実装しました。チェックコードは属性と同じであり、追加するには同じ量のコードが必要です。このアプローチには、もう1つの利点があります。たとえば、コーチが他のチームの詳細を表示できるが、変更はできないようなシナリオを実装する方が簡単です(権限に応じて、読み取りと更新の両方に対して1つのアクションとビューがあります)。

データベースにアクセスして権限を確認する必要があり、コンストラクターベースのインジェクションでNinjectなどのIoCフレームワークを使用している場合も、最後のアプローチを使用します。これは、属性内のこれらの値にアクセスできないためです。

于 2013-03-07T18:06:27.467 に答える
0

それらが含まれていないIDを制限したいので、これはから継承しAuthorizeAttributeて実装を提供できる状況のようですAuthorizeCore

実装で役割/チーム ID を確認し、何をするか/リダイレクトするかを決定できます。

public class TeamAuthorize : AuthorizeAttribute
{

  protected override bool AuthorizeCore(HttpContextBase httpContext)
  {
    return UserIsInTeam(httpContext); //whatever code you are using to check if the team id is right      

  }

}

これで、他の属性と同じように適用できます。

[TeamAuthorize]
于 2013-03-07T17:52:59.613 に答える