我需要编写一些代码来在我的项目数据库中查找ID。 用户与项目耦合,所有项目都与其他对象有很多连接,例如Sessions。
现在我需要在运行任何操作之前检查,如果尝试访问会话的用户连接到与会话连接的同一个项目。
为此,我想在Actions上使用[Attribute]。 MVC: creating a custom [AuthorizeAttribute] which takes parameters?
这个问题和答案让我开始了,但是我在使用控制器的构造函数来获取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 ...
答案 0 :(得分:1)
我建议将此检查放在模型而不是控制器中。在Controller中,您需要装饰需要进行此检查的每个操作,请记住这是在您应用它的每个操作上执行代码,因此您可能不希望在控制器级别应用它来开始。更简单的方法是在模型中执行一次检查,然后您的控制器中没有“关注”访问权限。这将使得对此访问权限检查的测试成为可能,因为您只能在一个地方进行测试。
答案 1 :(得分: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);
}
}
然后在Modules控制器
中 [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();
}
我觉得这很有效:)