2017-10-15 125 views
0

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

和地方的代码,有一个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

你的问题是相当广泛的,但让我描述的替代和常用的方法:

要访问到Web API本身一个具有acquire a token验证自己。在该令牌中,用户名/名称被存储为as a claim。当您使用存储库访问数据存储时,您可以在其中拥有授权表并使用令牌中的用户凭证加入该表。

查看this blogpost的完整示例。

一些更多的背景材料at the docs

相关问题