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. /// public class ProtectedPathMiddleware { private readonly RequestDelegate next; private readonly PathString path; private readonly string policyName; /// /// Initializes a new instance of the class. /// /// The following delegate in the process chain. /// The options to configure the middleware. public ProtectedPathMiddleware(RequestDelegate next, ProtectedPathOptions options) { this.next = next; path = options.Path; 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); } } }