Авторизация на основе политики утверждений с разрешением
Для каждой страницы контроллера существует отдельная авторизация. Это разрешение должно быть действительным, пока у него есть доступ. Я делаю это с Permission_Access в следующих классах. Но когда у пользователя нет никаких перманентных разрешений, он возвращает ошибку 403. Можем ли мы настроить эти коды ошибок?
Например, я хотел бы вернуть другое сообщение об ошибке, если Permission_Acces не существует, как я могу это сделать?
Что я действительно хочу сделать, так это добавить условие к одному из разрешений.
Это мои коды ->
AuthorizationPolicyProvider.cs
public override Task<AuthorizationPolicy> GetPolicyAsync(string policyName)
{
if (!policyName.StartsWith(PermissionAuthorizeAttribute.PolicyPrefix, StringComparison.OrdinalIgnoreCase))
{
return base.GetPolicyAsync(policyName);
}
var permissionNames = policyName.Substring(PermissionAuthorizeAttribute.PolicyPrefix.Length).Split(',');
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.RequireClaim(PermissionAuthorizeAttribute.PolicyPrefix, permissionNames)
.Build();
return Task.FromResult(policy);
}
PermissionAuthorizeAttribute.cs
internal const string PolicyPrefix = "PERMISSION:";
/// <summary>
/// Creates a new instance of <see cref="AuthorizeAttribute"/> class.
/// </summary>
/// <param name="permissions">A list of permissions to authorize</param>
public PermissionAuthorizeAttribute(params string[] permissions)
{
Policy = $"{PolicyPrefix}{string.Join(",", permissions)}";
}
PermissionsAuth.cs
public class PermissionsAuth
{
public const string Permission_Access = nameof(Permission_Access); // Accessing Perms.
public const string Permission_All = nameof(Permission_All);// All Perms.
}
ClaimProvider.cs
public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
if (principal != null && principal.Identity.IsAuthenticated)
{
ClaimsIdentity identity = principal.Identity as ClaimsIdentity;
ApplicationUser user = await userManager.FindByIdAsync(identity.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier).Value);
if (user != null)
{
if (principal.IsInRole("Owner"))
{
var perm_all = identity.Claims.FirstOrDefault(x => x.Type == "PERMISSION:" && x.Value == PermissionsAuth.Permission_All);
if (perm_all == null)
{
identity.AddClaim(new Claim("PERMISSION:", PermissionsAuth.Permission_All, ClaimValueTypes.String, "Internal"));
}
}
List<Claim> claims = identity.Claims.Where(x => x.Type == "PERMISSION:").ToList();
claims.ForEach(c => identity.RemoveClaim(c));
foreach (var item in claims.ToList())
{
int count = claims.Count(x => x.Type == item.Type && x.Value == item.Value);
if (count == 1)
{
identity.AddClaim(item);
}
}
Claim firmClaim = identity.Claims.FirstOrDefault(x => x.Type == "FIRM");
var firm = JsonConvert.DeserializeObject<Firm>(firmClaim.Value);
if (firmClaim != null)
{
Claim access = identity.Claims.FirstOrDefault(x => x.Type == "PERMISSION:" && x.Value == PermissionsAuth.Permission_Access);
if (access.Value.Any())
{
if (firm.ServiceTime < DateTime.Now || firm.ServiceTime == null)
{
identity.RemoveClaim(access);
}
}
}
}
}
return principal;
}