asp.net-core - 如何在 ASP.NET Core 2.2 中正确地进行基于资源的授权?

标签 asp.net-core authorization

我有一个 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/

相关文章:

c# - Ubuntu 上的 ASP.NET Core 2.2 Web 应用程序 - 如何实现数据保护

asp.net - 在本地解析Docker主机名时HttpClient花费太多时间

c# - 如何将虚拟路径映射到物理路径?

asp.net-core - .Net Core 1.0 的 NLog - 找不到 LayoutRenderer

ios - 在 HealthKit 中请求授权 : why the result is always successful?

java - 如何从 Java 进行 Amazon AWS API 调用?

plugins - azure 媒体服务 - 如何保护我的视频 URL 不被用户下载?

asp.net-mvc - MVC中的授权属性顺序、优先级和功能问题

asp.net - 具有多个声明的授权策略

sql-server - 如何在SQL Server数据库中使用 Elasticsearch