如何在asp.net核心多层体系结构中实现基于资源的授权?

时间:2019-02-11 14:53:02

标签: asp.net-core authorization

App-ASP Net Core API。 我们有实体-用户和文档。 每个用户都经过身份验证,因此我在服务器端具有userId。 我有资源-文件。每个文档都有作者(userId)。我们会对文件采取行动-由作者执行。 我需要授权当前用户为当前文档的作者才能发送。 因此,在所有准则中,我看到这样的建议:

[Authorize]
        public async Task<IActionResult> Send(int id)
        {
            var document = _documentRepository.Get(id);

            if (document == null)
            {
                return new NotFoundResult();
            }

            var authorizationResult = await _authorizationService.AuthorizeAsync(User, document, new MyRequirement());
            if (authorizationResult.Succeeded)
            {
                return Ok();
            }
            else
            {
                throw...;
            }
        }

但是,如果我不想获取文件怎么办?我一般的API-BL交互如下:


[Authorize]
        public async Task<IActionResult> Send(int id)
        {
            await _documentSender.SendAsync(id);
        }

在这种情况下,我应该在哪里调用AuthorizationService?我每次都需要调用文档的getter吗?

1 个答案:

答案 0 :(得分:1)

您可以简单地将授权烘焙到您的_documentSender.SendAsync呼叫中,例如像这样:

await _documentSender.SendAsync(id, User.FindFirstValue(ClaimTypes.NameIdentifier));

NameIdentifier声明是用户的ID。换句话说,您只需将当前用户的ID传递给您的方法并在内部进行授权。