Skip to content

Instantly share code, notes, and snippets.

@kkadir
Last active March 3, 2020 18:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kkadir/ba01443dd7a504f366892ec5769b3c6c to your computer and use it in GitHub Desktop.
Save kkadir/ba01443dd7a504f366892ec5769b3c6c to your computer and use it in GitHub Desktop.
The RolesAuthorizationHandler custom implementation
using System;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Logging;
namespace CustomPolicyProvidersDemo.Authorization
{
public class RolesAuthorizationHandler : AuthorizationHandler<RolesRequirement>
{
private readonly ILogger<RolesAuthorizationHandler> _logger;
public RolesAuthorizationHandler(ILogger<RolesAuthorizationHandler> logger)
{
_logger = logger;
}
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
RolesRequirement requirement)
{
if (!context.User.Identity.IsAuthenticated)
{
return Task.CompletedTask;
}
if (context.HasSucceeded)
{
return Task.CompletedTask;
}
if (context.User.IsInRole("Super Admin"))
{
Utility.Succeed(context, requirement.Identifier);
return Task.CompletedTask;
}
if (context.User == null || requirement == null || string.IsNullOrWhiteSpace(requirement.Roles))
{
return Task.CompletedTask;
}
var requirementTokens = requirement.Roles.Split("|", StringSplitOptions.RemoveEmptyEntries);
if (requirementTokens?.Any() != true)
{
return Task.CompletedTask;
}
var expectedRequirements = requirementTokens.ToList();
if (expectedRequirements.Count == 0)
{
return Task.CompletedTask;
}
var userRoleClaims = context.User.Claims?.Where(c =>
string.Equals(c.Type, "role", StringComparison.OrdinalIgnoreCase)
|| string.Equals(c.Type, ClaimTypes.Role, StringComparison.OrdinalIgnoreCase));
foreach (var claim in userRoleClaims ?? Enumerable.Empty<Claim>())
{
var match = expectedRequirements
.Where(r => string.Equals(r, claim.Value, StringComparison.OrdinalIgnoreCase));
if (match.Any())
{
Utility.Succeed(context, requirement.Identifier);
break;
}
}
return Task.CompletedTask;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment