将开放策略代理与 ASP.Net Core Web API 集成

Ami*_*and 8 open-policy-agent

我正在观看有关 OPA(开放策略代理)的一些视频和教程,发现使用它跨多个服务/API 实现身份验证和授权真的很酷。但是,我无法了解如何在 Windows 上安装它并将其与 ASP.Net core Web API 集成以实现身份验证和授权。有人能帮我吗?

谢谢,

阿米特·阿南德

小智 6

Tim Hinrichs 上面的回答很切题。不过,这里要补充一些具体的解决方案。在下面的 2 个解决方案中,我建议使用 REST API 和 ASP.NET 中间件。另外,虽然 OPA 理论上可以用作身份验证工具,但我建议不要这样做。其目的是授权。

使用 ASP.NET 授权中间件

首先,OPA 将作为它自己的服务、k8 中的 sidecar 或 Docker 容器中运行。OPA 的文档很好地展示了如何实现它的示例,因此我不会详细介绍。

在这里,您将创建一个查询OPA 的 Rest API 的.NET 服务。

  • 是一个完整的例子
  • 是微软关于使用中间件的文档

这就是中间件的样子。

using System.Net;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;

namespace Authz.Opa
{
    public class OpaAuthzMiddleware
    {
        private const string ForbiddenMessage = "Forbidden";

        private readonly RequestDelegate _next;
        private readonly IOpaService _opaService;

        public OpaAuthzMiddleware(RequestDelegate next, IOpaService service)
        {
            _next = next;
            _opaService= service;
        }

        public async Task InvokeAsync(HttpContext context)
        {
            var enforceResult = await _opaService.RunAuthorizationAsync(context);

            if (!enforceResult)
            {
                context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
                await context.Response.WriteAsync(ForbiddenMessage);
                return;
            }

            await _next(context);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样在你的启动中实现它

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace Sample
{
    public class Startup
    {

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddRouting();

            services.AddSingleton<IOpaService, OpaService>();
        }


        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseMiddleware<OpaAuthzMiddleware>();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用OPA的Wasm编译

OPA 拥有可以将 Rego 策略编译为可执行 Wasm 模块的工具。他们在这里提供文档。它目前正在开发中,但这里有一个在 .NET 中使用它的示例。查看该存储库的“问题”部分下的讨论,看起来他们仍在解决一些问题。您需要使用可用的 .NET 库之一来读取已编译的 Wasm 文件,但这被认为是 OPA 提供的最快评估方法。


小智 5

在不了解更多关于您的用例或您所运行的平台的情况下,这里有一些一般建议。

  1. 建筑学。决定是否要将 OPA 作为 sidecar 或独立服务运行。这是一个架构问题,取决于延迟、性能以及策略所需的数据。OPA 是一个设计为 sidecar 的构建块,但您可以通过旋转多个副本、在它们之间进行负载平衡、添加持久层等来围绕 OPA 构建服务。

  2. 行政。决定如何加载/更新策略并将决策记录到 OPA 中,如果适用,决定如何将数据加载到 OPA 中

  3. 服务整合。如果您使用的网络代理拦截所有流向您的服务的网络流量(例如 Envoy、Linkerd、Kong...),您可以将网络代理配置为调用 OPA,而无需修改您的 .Net 服务。如果您不使用网络代理,请修改您的 .Net 服务,以便在您的服务需要策略决策时进行HTTP 调出,并尽可能使用库来最大程度地减少对各个服务的影响。集成页面显示了 Java Spring 和 PHP 的集成方式。