2

次のようなアクション メソッドがあるとします。

public ActionResult SomeMethod(int a, int b)

きめの細かい承認を実装するために、ActionFilterAttribute から継承し、以下を使用して上記のパラメーターにアクセスするアクションを実装できます。

filterContext.RouteData.Values 

OnActionExecuting 中。これは良い習慣ですか?このようなきめ細かな承認のためのより良いアプローチはありますか?

4

2 に答える 2

2

これは良い習慣ですか?

もちろん、それはセキュリティ上のリスクです。クライアントから送信されるパラメータに依存するのは危険です。クライアントは、必要な値をパラメーターとして送信できることに注意してください。また、フィルター、アクション、バインダーなどをサーバーに実装するかどうかにかかわらず、セキュリティは危険にさらされます。セキュリティを実装するために、クライアントから送信されたパラメーターに依存しないでください。

ただし、いくつかのセキュリティ チェックを実装する場合、それらのチェックはIAuthorizationFilter、アクション フィルターではなく、カスタム で絶対に実行する必要があります。承認フィルターは、実行パイプラインでアクション フィルターよりもはるかに早く実行されます。

例えば:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authorized = base.AuthorizeCore(httpContext);
        if (!authorized)
        {
            // no authenticated user => no need to go any further
            return false;
        }

        var routeData = httpContext.Request.RequestContext.RouteData;
        // get the username of the currently authentciated user
        string username = httpContext.User.Identity.Name;

        // Get the a parameter
        string a = routeData.Values["a"] as string;

        // Get the b parameter
        string b = routeData.Values["b"] as string;

        return IsAuthorized(username, a, b);
    }

    private bool IsAuthorized(string username, string a, string b)
    {
        // TODO: you know what to do here => hit the database to check
        // whether the user is authorized to work with a and b
        throw new NotImplementedException();
    }
}
于 2013-02-26T21:30:48.267 に答える
1

特に、これがセキュリティ チェックである場合はIAuthorizationFilter、リクエストのずっと後の OnActionExecuting を待つのではなく、 を実装することをお勧めします。

于 2013-02-26T21:28:23.800 に答える