Авторизация на основе политики утверждений с разрешением

Для каждой страницы контроллера существует отдельная авторизация. Это разрешение должно быть действительным, пока у него есть доступ. Я делаю это с 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;
    }

0 ответов

Другие вопросы по тегам