私のMVCアプリケーションにはPlayer
、Coach
オブジェクトがあり、ユーザーはどちらでもかまいません。私もTeam
オブジェクトを持っています。知りたいのは、リストに含まれている、Players
またはルートCoach
にTeam
アクセスするユーザーを防ぐ方法です。たとえば、自分が所属しているチーム以外のチームのIDは/Teams/Details/2
どこにありますか。 2
。
前もって感謝します!
私のMVCアプリケーションにはPlayer
、Coach
オブジェクトがあり、ユーザーはどちらでもかまいません。私もTeam
オブジェクトを持っています。知りたいのは、リストに含まれている、Players
またはルートCoach
にTeam
アクセスするユーザーを防ぐ方法です。たとえば、自分が所属しているチーム以外のチームのIDは/Teams/Details/2
どこにありますか。 2
。
前もって感謝します!
最も簡単な解決策は、URLをIDの使用からランダムなGUIDに変更することです。誰かが別の有効な値を推測する可能性をほぼ排除します。もちろん、これは定義上安全ではありません(主に、誰かが履歴または別のソースから他のURLを取得する可能性があるため)が、シナリオによってはこれで十分です。
より良い解決策は、メソッドを実装し、とを使用してIDをチェックするIActionFilter
インターフェースに基づいて新しい属性を作成することです。次に、この属性をコントローラーメソッドに適用します。OnActionExecuting
this.ControllerContext.HttpContext.User.Identity.Name
this.RouteData.Values["id"]
現在のシステムでは、各メソッドの最初の行としてユーザー権限を確認するコードを追加するだけで、コントローラーメソッドに行レベルのセキュリティを実装しました。チェックコードは属性と同じであり、追加するには同じ量のコードが必要です。このアプローチには、もう1つの利点があります。たとえば、コーチが他のチームの詳細を表示できるが、変更はできないようなシナリオを実装する方が簡単です(権限に応じて、読み取りと更新の両方に対して1つのアクションとビューがあります)。
データベースにアクセスして権限を確認する必要があり、コンストラクターベースのインジェクションでNinjectなどのIoCフレームワークを使用している場合も、最後のアプローチを使用します。これは、属性内のこれらの値にアクセスできないためです。
それらが含まれていない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]