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);
if (!result.Succeeded)
{
await httpContext.ChallengeAsync();
return;
}
}
await next.Invoke(httpContext);
}
}
}