webservice如何检查用户是否被允许查看项目?
问题描述:
我正在为移动应用程序(android)创建后端Web服务(asp.net核心2.0)。该应用程序的用户应该只能看到他的项目,并且我想在Web服务中进行检查。webservice如何检查用户是否被允许查看项目?
在我的控制,我有这样的
[HttpGet("{id}")]
public async Task<IActionResult> Get(int id)
{
var item = _repository.GetItem(id);
if (!(await _authorizationService.AuthorizeAsync(User, item, nameof(IsAllowedToSeeRequirement))).Succeeded)
return BadRequest();
return new ObjectResult(item);
}
和地方的代码,有一个IsAllowedToSeeRequirement
和AuthorizationHandler
实现,它的实际检查:
public class IsAllowedToSeeAuthorizationHandler : AuthorizationHandler<IsAllowedToSeeRequirement, Item>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, IsAllowedToSeeRequirement requirement, Item item)
{
if (context.User.Identity.Name == item.Owner)
{
context.Succeed(requirement);
}
return Task.CompletedTask;
}
}
到目前为止,一切都很好,这作品,但它是很多代码和间接,而不是说魔术字符串(虽然减轻了nameof
)...
我可以写
[HttpGet("{id}")]
public IActionResult Get(int id)
{
var item = _repository.GetItem(id);
if (item.Owner != User.Identity.Name)
return BadRequest();
return new ObjectResult(item);
}
并跳过需求类,处理程序,注册处理程序和需求。
在每篇教程中,我都会读到关于这种东西的东西,总是有这种处理器的东西。所以我认为这是一种很费力的方式,但是有人可以解释一下实际情况吗?
答
你的问题是相当广泛的,但让我描述的替代和常用的方法:
要访问到Web API本身一个具有acquire a token验证自己。在该令牌中,用户名/名称被存储为as a claim。当您使用存储库访问数据存储时,您可以在其中拥有授权表并使用令牌中的用户凭证加入该表。
查看this blogpost的完整示例。
一些更多的背景材料at the docs。