繁体   English   中英

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

[英]How does a webservice check whether a user is allowed to see an item?

我正在为移动应用程序(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魔术字符串了(尽管通过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本身的访问权限,必须获取令牌以对其进行身份验证。 在该令牌中,用户标识/名称存储为声明 使用存储库访问数据存储时,您可以在其中拥有一个授权表,并使用令牌中的用户凭据将其加入该表。

有关完整示例,请参见此博客文章

有关文档的更多背景资料。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM