5

ASP.NETMVCのユーザーベースおよびロールベースのセキュリティについてはすでに知っています。しかし今、私はもう少し細かいものが必要です。

ユーザーが許可されているドキュメントと許可されていないドキュメントのリストがあるとします。各ドキュメントには、データベースのドキュメントテーブルに対応するレコードがあります。ユーザーがセキュリティアクセス権を持っている場合は、ドキュメントをダウンロードして表示できます。役割があれば、ドキュメントを追加することもできます。各ドキュメントにはURLがあり、各ドキュメントリストにはURLがあります。

リストをセキュリティでトリミングして、ユーザーが許可されているドキュメントのみを表示できるようにします。ただし、ユーザーがアクセスできなくなったドキュメントをブックマークしたり、ブラウザにURLを入力したりすることを妨げるものは何もないため、これらのリストとドキュメントのURLリクエストも認証する必要があります。

組み込みの役割ベースのセキュリティモデルはこれに適していますか、それとも個別のテーブルベースのセキュリティを作成する必要がありますか?リポジトリにセキュリティを設定して、返されたレコードがすでにトリミングされているようにすることはできますか、それともコントローラの一部にする必要がありますか?コントローラリクエストを検証するためにセキュリティ属性が必要ですか、それともコードの最初の数行としてコントローラメソッドに配置する必要がありますか?

4

2 に答える 2

1

これをプロジェクトにどのように実装するつもりだったかを説明しようと思います。要件はあなたの要件と似ています。ユーザーには権限を持つ役割があり、権限の定義、役割の権限リスト、ユーザーの役割リストなどからすべてを変更できます。したがって、管理者が変更した場合、ある瞬間にユーザーが何かにアクセスできる可能性があります。何か、彼はアクセスできません。

コードを入れる前に、あなたの質問に答えます。

個別のテーブルベースのセキュリティを作成する必要がありますか?

-はい

リポジトリにセキュリティを設定して、返されたレコードがすでにトリミングされているようにすることはできますか、それともコントローラの一部にする必要がありますか?

-セキュリティはビジネスロジックの一部である必要があると思います。そのため、セキュリティはコントローラとリポジトリの間のどこかに配置します。

コントローラリクエストを検証するためにセキュリティ属性が必要ですか?

-私のプロジェクトでは、属性に入れましたが、コントローラーからにアクセスする必要がある場合もありますが、セキュリティロジックをビジネスレイヤーに保持しているので、問題ないと思います。

最初の属性は、ログに記録されたユーザーがアクションを実行できるようにする単純な属性です。

public class LoggedUserFilterAttribute : ActionFilterAttribute
{
    public bool Logged { get; set; }
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!SessionManager.IsUserLogged)
        {
            filterContext.Result = new RedirectToRouteResult(GetRedirectToNotLoggedRouteValues());
            this.Logged = false;
        }
        else
            this.Logged = true;
    }

    public RouteValueDictionary GetRedirectToNotAuthorizedRouteValues()
    {
        RouteValueDictionary routeValues = new RouteValueDictionary();
        routeValues.Add("action", "NotAuthorized");
        routeValues.Add("controller", "Authorization");
        return routeValues;
    }
    public RouteValueDictionary GetRedirectToNotLoggedRouteValues()
    {
        RouteValueDictionary routeValues = new RouteValueDictionary();
        routeValues.Add("action", "NotLogged");
        routeValues.Add("controller", "Authorization");
        return routeValues;
    }
}

次に、たとえば、スーパーユーザーのみがアクセスできる属性があります。

public class SuperUserFilterAttribute : LoggedUserFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        if (Logged)
        {
            MyBaseController controller = filterContext.Controller as MyBaseController;
            if (controller == null)
                throw new Exception("Please use MyBaseController instead of built in Controller");

            User loggedUser = controller.Model.UserBO.GetUserByID(SessionManager.LoggedUser.UserID);

            if(!loggedUser.IsSuperUser)
            {
                filterContext.Result = new RedirectToRouteResult(GetRedirectToNotAuthorizedRouteValues());
            }
        }
    }
}

MyBaseControllerは、Controllerを継承するクラスであり、ビジネスオブジェクトのコンテナーを表すModelクラスのインスタンスを持っています。コントローラのアクションボディで、必要に応じて現在のエンティティのユーザー権限を確認し、それに応じて適切なビューを返します。

    [LoggedUserFilter]
    public ActionResult LoadSomeEntity(int customerServiceID,int entityID)
    {
        UserRights userPermissionsView = Model.SecurityBO.GetUsersRightsOnEntity(SessionManager.LoggedUser.UserID, entityID);

        if(userPermissionsView.Write) 
            return View("EditEntity",Model.EntityBO.GetEntityByID(entityID));
        if(userPermissionsView.Read) 
            return View("ViewEntity",Model.EntityBO.GetEntityByID(entityID));

        return View("NotAuthorized");     
    }

ps明らかに私よりもはるかに多くの経験を持っている人に何か提案できるかどうかはわかりません:)ですから、スパムを送信している場合は、そのことをお詫びします。

于 2009-10-05T21:48:02.227 に答える
1

@ロバート、ビューに到達する前にトリミングする必要があると言ったとき、あなたはすでに自分の質問に答えていると思います。したがって、ビジネスロジックでは、リポジトリよりも優先されるため、いわば余分な部分を取り除くためにlamdaを実行することをお勧めします。

私の意見では、ユーザーが表示を許可されていないビューにレコードを返すことは決してありません。なぜリスクとトラフィックを増やすのですか?

ブックマークに関しては、アクセスが存在しなくなったときにブックマークがURLに移動しないようにするためのビジネスロジックを実行する必要があると思います。

コントローラーは単にデータをページに提供するために存在し、そのようなロジックはないと思っていたので、ビジネスルールのように見えるので、このアプローチにはビジネスレイヤーアプローチを使用したいと思います。

それはあなたが考えていたものではないかもしれませんが、より良いアプローチがない限り、それは私が使用するものです。

于 2009-10-05T20:57:24.383 に答える