51 lines
1.7 KiB
C#

using System.Threading.Tasks;
using gehGassi.Web.Auth.Requirements;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
namespace gehGassi.Web.Auth.AuthorizationHandlers
{
/// <summary>
/// Handler für die Prüfung auf Rollen-Requirement
/// </summary>
public class IsInRoleHandler : AuthorizationHandler<IsInRoleRequirement>
{
private readonly IHttpContextAccessor _httpContextAccessor;
/// <summary>
/// Erstellt eine Instanz
/// </summary>
/// <param name="httpContextAccessor">HTTP-Context</param>
public IsInRoleHandler(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
/// <summary>
/// Makes a decision if authorization is allowed based on a specific requirement.
/// </summary>
/// <param name="context">The authorization context.</param>
/// <param name="requirement">The requirement to evaluate.</param>
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, IsInRoleRequirement requirement)
{
if (_httpContextAccessor?.HttpContext?.User?.Identity != null && _httpContextAccessor.HttpContext.User.Identity.IsAuthenticated)
{
foreach (var role in requirement.Roles)
{
if (_httpContextAccessor.HttpContext.User.IsInRole(role))
{
context.Succeed(requirement);
break;
}
}
}
else
{
context.Fail();
}
return Task.CompletedTask;
}
}
}