using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; namespace AMWD.Common.AspNetCore.Security.PathProtection { /// /// Implements a check to provide protected paths. /// /// /// Initializes a new instance of the class. /// /// The following delegate in the process chain. /// The options to configure the middleware. public class ProtectedPathMiddleware(RequestDelegate next, ProtectedPathOptions options) { private readonly RequestDelegate _next = next; private readonly PathString _path = options.Path; private readonly string _policyName = options.PolicyName; /// /// The delegate invokation. /// Performs the protection check. /// /// The corresponding HTTP context. /// The . /// An awaitable task. public async Task InvokeAsync(HttpContext httpContext, IAuthorizationService authorizationService) { if (httpContext.Request.Path.StartsWithSegments(_path)) { var result = await authorizationService.AuthorizeAsync(httpContext.User, null, _policyName).ConfigureAwait(false); if (!result.Succeeded) { await httpContext.ChallengeAsync().ConfigureAwait(false); return; } } await _next.Invoke(httpContext).ConfigureAwait(false); } } }