Web服务如何检查是否允许用户查看项目?

时间:2017-10-15 11:58:04

标签: c# asp.net web-services asp.net-core-2.0

我正在为移动应用(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 );
    }

在某个地方,有IsAllowedToSeeRequirementAuthorizationHandler实施进行实际检查:

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 );
    }

并跳过需求类,处理程序,处理程序的注册和需求。

在每一篇教程中,我都会读到这类东西,总是有这个处理程序的东西。因此,我认为这是一个很有道理的充分理由,但有人可以解释实际上可能是什么吗?

1 个答案:

答案 0 :(得分:1)

您的问题非常广泛,但让我描述一种替代的常用方法:

要获得对网络API的访问权限,必须acquire a token进行身份验证。在该令牌中,用户ID /名称存储为as a claim。使用存储库访问数据存储时,您可以在其中拥有授权表,并使用令牌中的用户凭据加入该表。

有关完整示例,请参阅this blogpost

更多背景资料at the docs