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);
    }

如何访问我的路由数据?RouteData为空,HttpContext为空,Request为空。

我需要 url 中的 ID,它在 routedata 中...

4

2 回答 2

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 回答