Unterschiedliche API-Funktionen für unterschiedliche Rollen


Alexey Korsakov

Ich habe API mit asp.net Core 2.1. Anspruchsbasierte Authentifizierung. Ist es möglich, diese beiden API-Funktionen in einer zu kombinieren?

[Authorize(Roles = "Admin")]
[HttpPost("delete")]
public IActionResult Delete([FromBody]Item item)
{
    _itemService.Delete(item.Id);
    return Ok();
}

[Authorize]
[HttpPost("delete")]
public IActionResult Delete([FromBody]Item item)
{
    var id = int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value);
    if (_itemService.IsAuthor(id))
    {
        _itemService.Delete(item.Id);
        return Ok();
    }
    return Forbid();
}

Oder sollte ich nur die Rolle innerhalb der Methode überprüfen?

Edward

Um die Berechtigung zu überprüfen, ob der Benutzer Adminoder ist Author, können Sie multiple requirementsals Dokument von @ user2884707bond implementieren.

Für die Verwendung der multiple requrementsfür Ihr Szenario.

Sie können die folgenden Schritte ausführen:

  • PermissionHandler.cs

            public class PermissionHandler : IAuthorizationHandler
    {
        public Task HandleAsync(AuthorizationHandlerContext context)
        {
            var pendingRequirements = context.PendingRequirements.ToList();
    
            foreach (var requirement in pendingRequirements)
            {
                if (requirement is ReadPermission)
                {
                    if (IsOwner(context.User, context.Resource) ||
                        IsAdmin(context.User, context.Resource))
                    {
                        context.Succeed(requirement);
                    }
                }
                else if (requirement is EditPermission ||
                         requirement is DeletePermission)
                {
                    if (IsOwner(context.User, context.Resource))
                    {
                        context.Succeed(requirement);
                    }
                }
            }
            return Task.CompletedTask;
        }
        private bool IsAdmin(ClaimsPrincipal user, object resource)
        {
            if (user.IsInRole("Admin"))
            {
                return true;
            }
            return false;
        }
    
        private bool IsOwner(ClaimsPrincipal user, object resource)
        {
            // Code omitted for brevity
    
            return true;
        }
    
        private bool IsSponsor(ClaimsPrincipal user, object resource)
        {
            // Code omitted for brevity
    
            return true;
        }
    }
    
  • Bedarf

        public class ReadPermission : IAuthorizationRequirement
    {
        // Code omitted for brevity
    }
    public class EditPermission : IAuthorizationRequirement
    {
        // Code omitted for brevity
    }
    public class DeletePermission : IAuthorizationRequirement
    {
        // Code omitted for brevity
    }
    
  • Registrieren Sie sich RequirementinStartup.cs

            services.AddAuthorization(options =>
        {
            options.AddPolicy("Read", policy => policy.AddRequirements(new ReadPermission()));                
        });
        services.AddSingleton<IAuthorizationHandler, PermissionHandler>();
    
  • Verwenden

     [Authorize(Policy = "Read")]
     [HttpPost("delete")]
     public IActionResult Delete([FromBody]Item item)
     {
          _itemService.Delete(item.Id);
          return Ok();
      }
    

Verwandte Artikel


Haben unterschiedliche Funktionen unterschiedliche Adressen?

Yakk - Adam Nevraumont: Betrachten Sie diese beiden Funktionen: void foo() {} void bar() {} ist das garantiert &foo != &bar? Ähnlich, template<class T> void foo() { } ist das garantiert &foo<int> != &foo<double>? Ich kenne zwei Linker, die diese Fold-Funktio

Unterschiedliche Spracheinstellungen für Website und API

Soroush Parsa Ich habe eine Bewerbung mit zwei Sprachen, Farsi und Englisch. Diese Anwendung bietet eine Website, die Django-Vorlagen und eine einfache API mit zwei Endpunkten verwendet, die reines Django verwenden. Jetzt stehe ich vor einem Problem, das ich n