using AsbCloudApp.Services; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace AsbCloudWebApi.Middlewares { public class PermissionsMiddlware { private readonly RequestDelegate next; public PermissionsMiddlware(RequestDelegate next) { this.next = next; } public async Task InvokeAsync(HttpContext context) { var endpoint = context.GetEndpoint(); var permission = endpoint?.Metadata.GetMetadata(); if (permission is null) { await next(context); return; } var idUser = context.User.GetUserId(); if (idUser is null) { await context.ForbidAsync(); return; } var permissionName = permission.Name; if (string.IsNullOrEmpty(permissionName)) permissionName = endpoint.Metadata .GetMetadata() ?.ControllerName .ToLower(); var userService = context.RequestServices.GetRequiredService(); var isAuthorized = userService.HasPermission((int)idUser, permissionName); if(isAuthorized) await next?.Invoke(context); else await context.ForbidAsync(); } } }