过滤ASP.NET Core中的授权数据

时间:2018-04-17 12:58:46

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

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

用户:

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信息。有没有办法阻止访问?

1 个答案:

答案 0 :(得分:0)

好的。我找到了一种方法,它在这里:

我已经在我的控制器上使用[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();

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

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