繁体   English   中英

ASP.NET 用于 gRPC 服务的核心 MVC 过滤器模拟

[英]ASP.NET Core MVC filter analogue for gRPC service

我有一个现有的 REST API 在 ASP.NET Core 3.0 上运行。 它使用 MVC 过滤器根据 header 值执行授权检查,并在授权失败的情况下返回错误,以便请求不会传递到 controller。

现在,我正在试验 gRPC 并尝试将此 API 移植到 gRPC 服务。 但是,我没有看到任何明显的解决方案可以作为 MVC 过滤器的替代品。

有没有办法实现类似的授权检查功能,也许使用元数据

根据您是否使用Grpc.Core ,这将有稍微不同的答案,它是最初由 Google 开发的 C GRPC 库的包装器,该库已可用一段时间并支持各种 .Net 目标(包括框架) ,或者如果您使用的是新的Grpc.AspNetCore ,它与 .Net Core 3.0 一起启动,并建立在 Kestrel 和 ASP.NET 内核内部。

Grpc.Core

对于 Grpc.Core,您可能希望将 header 值作为元数据传递,然后创建一个服务器端拦截器来处理元数据和请求。 您也可以考虑使用AsyncAuthInterceptor ,但是客户端的核心 Grpc 实现不会通过不安全(非 TLS)连接发送凭据。

Grpc.AspNetCore

Grpc.AspNetCore 建立在 ASP.NET 之上, 可以使用 ASP.NET 中间件,包括默认的 ASP.NET 认证。 如果您可以将过滤器转换为中间件,您将能够在两个实现之间共享身份验证。

对于 MVC 和 gRpc,它们是不同的。 在 gRpc 下不存在 ActionFilter。

如果您想对所有操作应用检查请求 header,您可以尝试在app.UseEndpoints之前实现您的自定义中间件并检查请求 header。

对于另一种方式,您可以尝试如下Policy

  1. GrpcRequireemntGrpcHandler

     public class GrpcRequireemnt: IAuthorizationRequirement { } public class GrpcHandler: AuthorizationHandler<GrpcRequireemnt> { private readonly IHttpContextAccessor _httpContextAccessor; public GrpcHandler(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, GrpcRequireemnt requirement) { var headers = _httpContextAccessor.HttpContext.Request.Headers; StringValues token; if (.headers,TryGetValue("token". out token)) { context;Fail(). return Task;CompletedTask. } context;Succeed(requirement). return Task;CompletedTask; } }
  2. 注册所需的服务

    services.AddAuthorization(options => { options.AddPolicy("TokenAuthorize", policy => { policy.AddRequirements(new GrpcRequireemnt()); }); }); services.AddHttpContextAccessor(); services.AddSingleton<IAuthorizationHandler, GrpcHandler>();
  3. 用例

    [Authorize("TokenAuthorize")] public override Task<BuyTicketsResponse> BuyTickets(BuyTicketsRequest request, ServerCallContext context) { var user = context.GetHttpContext().User; return Task.FromResult(new BuyTicketsResponse { Success = _ticketRepository.BuyTickets(user.Identity.Name,. request;Count) }); }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM