我正在观看有关 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
在不了解更多关于您的用例或您所运行的平台的情况下,这里有一些一般建议。
建筑学。决定是否要将 OPA 作为 sidecar 或独立服务运行。这是一个架构问题,取决于延迟、性能以及策略所需的数据。OPA 是一个设计为 sidecar 的构建块,但您可以通过旋转多个副本、在它们之间进行负载平衡、添加持久层等来围绕 OPA 构建服务。
行政。决定如何加载/更新策略并将决策记录到 OPA 中,如果适用,决定如何将数据加载到 OPA 中。
服务整合。如果您使用的网络代理拦截所有流向您的服务的网络流量(例如 Envoy、Linkerd、Kong...),您可以将网络代理配置为调用 OPA,而无需修改您的 .Net 服务。如果您不使用网络代理,请修改您的 .Net 服务,以便在您的服务需要策略决策时进行HTTP 调出,并尽可能使用库来最大程度地减少对各个服务的影响。集成页面显示了 Java Spring 和 PHP 的集成方式。
归档时间: |
|
查看次数: |
5034 次 |
最近记录: |