gpt4 book ai didi

asp.net-mvc - 导航到路由时如何确保用户拥有或属于资源(ASP.NET MVC)

转载 作者:行者123 更新时间:2023-12-01 06:47:23 26 4
gpt4 key购买 nike

我想知道如何确保员工无法访问另一家公司的信息)。这不是关于将角色或权限应用于操作的基于身份验证/角色的问题,而是确保某人尝试访问的数据实际上属于他们。

用户属于一个部门,而该部门又属于一个公司。在下面的示例中,日历属于一家公司。如何确保用户只能在他们自己的公司内编辑日历。

public ActionResult Edit(int? calendarId)
{
...
}

那么当用户浏览到/Calendars/55 时,我如何确保日历与用户属于同一家公司?例如,您不能篡改 URL 并为属于另一家公司的日历输入 id。

方法 1
public ActionResult Edit(int? calendarId)
{
// get company that calendar belongs to
int calCompanyId = ..
if (CurrentUser.CompanyId != calCompanyId)
return RedirectToAction(....); // cannot access resource

...
}

虽然这会起作用,但我想知道是否有更好的方法来处理这类问题。可能不需要像这样对所有 Controller 的每一个操作进行检查。

是否有用于解决此类问题的典型模式,您需要检查用户是否可以访问特定路线?我认为对于拥有资源(公司、部门等)并需要确保一个公司/用户无法访问另一家公司数据的应用程序来说,这是一个非常典型的问题。

编辑:

正如@jfar 所指出的,我可以使用 CompanyId,但它在大多数 route 不可用。我是否应该考虑更改我的路线结构以始终包含它以使这些检查更容易?这样做将是一项相当多的工作,并且可能会“丑化”路线。

进一步考虑这个问题后,我认为可能没有其他选择,然后在大多数操作中放置类似于“IsOwner(....)”的检查。这样做的原因有几个。
  • 并非所有可通过路由访问的项目都具有 CompanyId 属性,可以轻松地将其与用户的 companyId 进行比较,例如
  • route 的资源可能有一个由公司拥有的部门 ID。因此,在这种情况下,我必须实现一个重载的“IsOwner”,它知道检查一个部门 ID 或按照拥有部门
  • 的公司的引用。

    在这个阶段,我认为我将有一个类似于@jfar 发布的“IsOwner”方法,它可以检查直接链接到公司的资源是否归该公司所有,同时提供一些重载版本。
    CompanyOwns(CurrentUser.CompanyId, model);
    DepartmentOwns(CurrentUser.departmentId, model);

    我所有的数据库模型都实现了一个接口(interface),可以更轻松地通过 id 找到它们。
    public interface IAmIdentifiable<T>
    {
    T Id { get; }
    }

    我可能会考虑向模型添加更多接口(interface)以帮助上述辅助过程,例如
    public interface IAmOwnedByACompany
    {
    int CompanyId { get; }
    }

    public interface IAmOwnedByADepartment
    {
    int DepartmentId { get; }
    }

    这将使通过反射检查“IsOwner”类型方法中的对象更容易。我还没有时间完全考虑清楚这一点,但相信@jfar 在这种情况下说的是对的,当确定用户是否应该有权访问特定的路线(代表资源)。通过实现一些接口(interface)和一些巧妙的“IsOwner”类型方法,我希望使这些检查变得非常简单。

    最佳答案

    您可以将其添加到您的基本 Controller 中。每个请求,如果一个名为 {CompanyId} 的 RouteParameter 进来,自动检查以确保 CurrentUser.CompanyId 匹配它。

        protected User CurrentUser { get; set; }
    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
    base.OnAuthorization(filterContext);

    if( RouteData.Values["CompanyId"] != null )
    if (CurrentUser.CompanyId != RouteData.Values["CompanyId"] )
    //Redirect to wherever

    //your not restricted from getting the companyid from the route
    //you could get the id from the logged in user, session, or any other method

    }

    更新:

    您可以创建一个使用反射来检查实体是否拥有正确所有者的助手。即时编写的代码可能会出错。
        public bool IsOwner<T>(T model, int companyId)
    {
    var prop = model.GetType().GetProperty("CompanyId");

    if (prop == null)
    return false;

    var modelCompanyId = (int)prop.GetValue(model, null);

    return modelCompanyId == companyId;
    }

    关于asp.net-mvc - 导航到路由时如何确保用户拥有或属于资源(ASP.NET MVC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3566992/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com