我有一个网站,我正在移植到MVC来清理代码并简化操作。我使用asp成员资格和配置文件提供程序,但我想知道我是否正确地为我的情况做这件事。我对MVC很新,所以我想在早期阶段做到这一点。
用户是个人,他们是大型“机构”的一部分,他们要么在注册时设置或选择。在这种情况下,该机构是一个酒厂。我希望用户能够查看每个酒庄的所有葡萄酒,但只能编辑属于他们的葡萄酒。
最好的方法是什么?现在我根据他们的设备ID和生产者ID在我的索引视图中呈现编辑字段的链接。我觉得数据注释可能在这里工作得更好,但我并不完全知道如何为一组葡萄酒实现这一点。我需要多个提供商吗?我使用角色来限制编辑,但是现在编辑角色可以手动输入另一个葡萄酒的路径来编辑它,当葡萄酒不属于它们时。
这里的任何指针都很棒。我知道我可以在控制器方法中做到这一点,但我正在寻找“正确”的方法来做到这一点。感谢。
答案 0 :(得分:2)
我现在遇到了同样的问题,我们现在提出的最佳解决方案是实施“所有权”表。您将无法使用角色解决此问题。
所以基本上你有一个所有者ID,拥有对象的ID,以及所有对象ID的类型。让我们以编辑请求为例。我们知道你只能编辑X拥有的数据人,所以我们有一个存储过程,如果我们的所有权表中存在一个组合键,其中person.ID =所有者ID,item.ID =对象ID,以及item.TypeID = objectTypeID。如果它存在,则继续执行其编辑,否则返回错误。
您可以使用此方案返回所有权列表,用户验证以及您可能遇到的许多其他问题。如果您只跟踪一种类型的所有权,则可能不需要ObjectTypeID。希望这有帮助!
答案 1 :(得分:0)
我通过将自定义AuthorizeAttribute应用于编辑,删除和创建操作来解决这个问题。
这是我最终做的事情:
public class ProducerEditAttribute : AuthorizeAttribute
{
private vfContext db = new vfContext();
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
bool bAdmin = filterContext.HttpContext.User.IsInRole("admin");
bool bProdEdit = filterContext.HttpContext.User.IsInRole("producereditor");
bool bProd = filterContext.HttpContext.User.IsInRole("producer");
if (filterContext.HttpContext.User.Identity.IsAuthenticated)
{
if (bAdmin)
{
//authorized
}
if (bProdEdit || bProd)
{
//check for current wine belonging to the producer.
Producer currentProd = db.Producers.Find(Profile.GetProfile(filterContext.HttpContext.User.Identity.Name).InstitutionID);
Wine currentWine;
object WineID;
if (filterContext.RouteData.Values.TryGetValue("id", out WineID))
{
currentWine = db.Wines.Find(int.Parse(WineID.ToString()));
if (currentProd.Wines.Contains(currentWine) && bProdEdit)
{
//authorized
}
else if (bProd)
{
var result = new ViewResult();
result.ViewName = "Login.cshtml"; //this can be a property you don't have to hard code it
result.MasterName = "_Layout.cshtml"; //this can also be a property
result.ViewBag.Message = "You do not have permission for add/edit/delete funciontionality. Please request.";
filterContext.Result = result;
}
else
{
var result = new ViewResult();
result.ViewName = "Login.cshtml";
result.MasterName = "_Layout.cshtml";
filterContext.Result = result;
}
}
}
else
{
var result = new ViewResult();
result.ViewName = "Login.cshtml";
result.MasterName = "_Layout.cshtml";
}
}
}
}