【问题标题】:Filter authorized data in ASP.NET Core在 ASP.NET Core 中过滤授权数据
【发布时间】:2018-04-17 12:58:45
【问题描述】:

我有一个关于 ASP.NET Core 中的授权控制的问题。所以...如果我有一个像大公司这样的系统,有很多项目和员工。我正在使用令牌访问登录。

用户:

public int Id {get; set;}
public string Name {get; set;}
public ICollection<Project> Projects {get; set;}

项目:

public int Id {get; set;}
public string Name {get; set;}
public ICollection<User> Users {get; set;}

我有一个端点,它将使用其 ID 向我的用户显示项目详细信息:GET ...api/projects/{id}

我的网站只显示允许用户查看的内容,但是...我想阻止用户直接通过 api url 访问项目信息..

例如: UserA 只能访问 Project1。但可以直接使用:GET ...api/projects/2 获取 Project2 信息。有没有办法阻止访问?

【问题讨论】:

  • 最好的选择是拥有一些令牌发行者,例如 Identity Server。链接:docs.identityserver.io/en/release。有了这个,你可以限制用户在没有经过身份验证和授权的情况下访问资源(API 等)。

标签: c# asp.net-core authorization asp.net-core-webapi


【解决方案1】:

好的。我找到了一种方法,它是:

我已经在我的控制器上使用[Authorize("Bearer")]。所以我可以使用令牌来获取一些信息。因此,我使用 ManyToMany 表添加了带有项目 ID 的声明。这是在我的令牌配置类中制作的:

foreach (var userProject in user.Projects)
{
    identity.AddClaim(new Claim("projects", UserProject.ProjectId.ToString()));
}

所以我将它添加到我的控制器中:

var projects = User.FindAll("projects");

List<int> userProjectIds = new List<int>();

foreach (var project in projects)
{
    userProjectIds.Add(Int32.Parse(project.Value));
}

这样,我就有了用户有权访问的项目的 ID 列表。

然后在我的存储库中过滤我创建的项目,该方法使用 List 列表并创建过滤后的 List:

List<Project> projectsList = _context.Projects
                                     .Where(p => userProjectIds.Contains(p.Id))
                                     .ToList();

就是这样。然后我将此列表返回给我的用户。 我希望这对任何人都有帮助。

编辑:为了更清楚,我不返回列表本身,仅用于评估用户是否适合访问项目

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多