2

プロジェクトのデータベースでIDを見つけるためのコードを書く必要があります。ユーザーはプロジェクトに結合されており、すべてのプロジェクトはセッションなどの他のオブジェクトに多くの接続を持っています。

ここで、アクションを実行する前に、セッションにアクセスしようとしているユーザーが、セッションが接続されているのと同じプロジェクトに接続されているかどうかを確認する必要があります。

このために、アクションで[属性]を使用したいと思います。 MVC:パラメーターを受け取るカスタム[AuthorizeAttribute]を作成しますか?

この質問と回答で始めましたが、コントローラーのコンストラクターを使用して取得するのに問題がありますProject ID

目標は、プロジェクトに応じてオブジェクトのすべてのコントローラーの各コンストラクターにコードを記述し、プロジェクトIDを見つけてアクセス可能(パブリック)に[customauthorize]することです。これにより、このプロジェクトIDにアクセスして、ユーザーがアクセスできるかどうか。

私の問題:

public class SessionController : Controller {

    NASDataContext _db = new NASDataContext();


    public SessionController() {
        var test = RouteData;
        var ses = _db.Sessies.First(q=>q.Ses_ID==1);
    }

ルートデータにアクセスするにはどうすればよいですか?RouteDatanull、null、HttpContextnullRequestです。

routedataにあるURLにIDが必要です...

4

2 に答える 2

1

このチェックをコントローラーではなくモデルに配置することをお勧めします。コントローラでは、このチェックが必要な各アクションを装飾する必要があります。これは、適用するすべてのアクションでコードを実行するため、最初からコントローラレベルで適用したくない場合があることを忘れないでください。より簡単なアプローチは、モデルに一度チェックを実装することです。そうすれば、コントローラーにアクセス権の「懸念」がなくなります。これにより、テストは1か所でしか行われないため、このアクセス権チェックのテストが可能になります。

于 2011-01-14T12:10:54.347 に答える
1

これは私が今それを修正するために行ったことであり、私はそれについて非常に満足しています.

モジュール部分:

public partial class Module {
    public string FullName {
        get {
            return Mod_Code + " " + Mod_Titel;
        }
    }
    public string ShortName {
        get {
            return Mod_Code;
        }
    }
    public bool IsAccessible() {
        return this.Projecten.IsAccessible();
    }
}

プロジェクトの一部:

public partial class Projecten {
    public string FullName {
        get {
            if (Proj_Kortenaam == Proj_Naam)
                return Proj_Kortenaam;

            return Proj_Kortenaam + " " + Proj_Naam;
        }
    }
    public string ShortName {
        get {
            return Proj_Kortenaam;
        }
    }

    public bool IsAccessible() {
        return IsAccessible(HttpContext.Current.User);
    }

    public bool IsAccessible(IPrincipal user) {
        //this code checks if the user can access or not
        return MvcApplication.projectToegankelijk(user, this._Proj_ID);
    }
}

次に、モジュールコントローラーで

    [NonAction]
    public ActionResult noRights() {
        ViewData["delError"] = "You have no rights.";
        return View("Error");
    }

    //
    // GET: /Modules/Details/5
    public ActionResult Details(int id) {
        var mod = _db.Modules.First(q => q.Mod_ID == id);
        if (mod.IsAccessible()) {
            return View(mod);
        }
        return noRights();
    }

これはかなりうまく機能すると思います:)

于 2011-01-14T14:59:22.563 に答える