用户对ASP成员资格中关联数据的限制

时间:2012-03-26 20:27:54

标签: asp.net-mvc-3

我有一个网站,我正在移植到MVC来清理代码并简化操作。我使用asp成员资格和配置文件提供程序,但我想知道我是否正确地为我的情况做这件事。我对MVC很新,所以我想在早期阶段做到这一点。

用户是个人,他们是大型“机构”的一部分,他们要么在注册时设置或选择。在这种情况下,该机构是一个酒厂。我希望用户能够查看每个酒庄的所有葡萄酒,但只能编辑属于他们的葡萄酒。

最好的方法是什么?现在我根据他们的设备ID和生产者ID在我的索引视图中呈现编辑字段的链接。我觉得数据注释可能在这里工作得更好,但我并不完全知道如何为一组葡萄酒实现这一点。我需要多个提供商吗?我使用角色来限制编辑,但是现在编辑角色可以手动输入另一个葡萄酒的路径来编辑它,当葡萄酒不属于它们时。

这里的任何指针都很棒。我知道我可以在控制器方法中做到这一点,但我正在寻找“正确”的方法来做到这一点。感谢。

2 个答案:

答案 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";   
            }


        }
    }
}