我正在为移动应用(android)创建后端Web服务(asp.net core 2.0)。应用程序的用户应该只看到他的项目,我想在Web服务中进行检查。
在我的控制器中,我有这样的代码
[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 );
}
并跳过需求类,处理程序,处理程序的注册和需求。
在每一篇教程中,我都会读到这类东西,总是有这个处理程序的东西。因此,我认为这是一个很有道理的充分理由,但有人可以解释实际上可能是什么吗?
答案 0 :(得分:1)
您的问题非常广泛,但让我描述一种替代的常用方法:
要获得对网络API的访问权限,必须acquire a token进行身份验证。在该令牌中,用户ID /名称存储为as a claim。使用存储库访问数据存储时,您可以在其中拥有授权表,并使用令牌中的用户凭据加入该表。
有关完整示例,请参阅this blogpost。
更多背景资料at the docs。