我对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信息。有没有办法阻止访问?
答案 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();
就是这样。然后我将此列表返回给我的用户。 我希望这对任何人都有帮助。
编辑:为了更清楚,我不会返回列表本身,只是用它来评估用户是否适合访问项目