我有一个 ASP.NET Core 2.2 应用程序,我在其中显示一些文档。大多数文档都是公开的,因此可以匿名访问。但是,有些文档是私有(private)的(即它们需要身份验证/授权),将来某些文档可能还需要有效订阅。所有文档都是使用相同的操作检索的,因此我们只有在加载文档后才知道所需的权限。我们还将一些资源作为静态文件 ( IApplicationBuilder.UseStaticFiles
) 加载,但我想这应该不是真正的问题 StaticFileOptions.OnPrepareResponse
可用于自定义授权码。
谁可以访问私有(private)文档的逻辑目前非常简单。目前,我们只显示文档,我们不允许对它们进行任何其他类型的操作(编辑、删除等)。对我来说,这听起来像是一个非常标准的基于资源的授权案例。
无论如何,我找到了this article根据我的理解,我需要定义一个策略(由一个神奇的字符串标识 - 这是怎么回事?!)以及一个要求和一个 AuthorizationHandler<MyRequirement, MyResource>
它将执行实际的授权逻辑。然后,在我的 Controller 操作中,我需要调用 IAuthorizationService.AuthorizeAsync
并传入用户、资源和策略名称(魔术字符串),并根据该方法的结果,允许或拒绝访问。对于我想要完成的事情来说,这似乎更令人费解。如果我简单地定义我自己的一种“授权服务”并简单地删除整个策略和要求的东西,那可能会更容易。我还认为我必须在所有受影响的 Controller 操作中复制 if-else 逻辑不太理想。
当然,我不是唯一遇到此问题的人。我错过了什么吗? 如果确实有充分的理由使用政策和要求,在这种情况下您会如何命名?我真的有点失落。 也许使用文档类型(公共(public)、私有(private)、仅限订阅者)作为策略名称有意义吗?
最佳答案
最后,我们不想处理这些东西,只是编写了我们自己的 AuthorizationService,它像任何其他服务一样注入(inject)到 Controller 中。 它在第一次使用时加载所有文档所需的权限并缓存它们。 我们的 Controller 方法看起来像这样:
[HttpGet("[action]")]
public async Task<Document> GetDocument(string documentId)
{
if (_authorizationService.MayAccess(User, documentId))
{
return _documentRepository.GetDocument(documentId);
}
else
{
Response.StatusCode = StatusCodes.Status403Forbidden;
return null;
}
}
关于asp.net-core - 如何在 ASP.NET Core 2.2 中正确地进行基于资源的授权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57465445/