不同角色的不同API功能 [英] Different API functionality for different roles

查看:127
本文介绍了不同角色的不同API功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有带asp.net core 2.1的API.基于声明的身份验证.是否可以将这两个api函数合而为一?

I have API with asp.net core 2.1. Claims-based authentication. Is it possible to combine these two api function in one?

[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();
}

还是应该只检查方法内部的角色?

Or should I just check the role inside method?

推荐答案

要检查用户是Admin还是Author的权限,可以将multiple requirements作为@ user2884707bond中的文档实现.

For checking the permission with whether the user is Admin or Author, you could implement multiple requirements as the doc from @user2884707bond.

用于在方案中使用multiple requrements.

您可以按照以下步骤操作:

You could follow steps below:

  • 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;
    }
}

  • 要求

  • Requirements

        public class ReadPermission : IAuthorizationRequirement
    {
        // Code omitted for brevity
    }
    public class EditPermission : IAuthorizationRequirement
    {
        // Code omitted for brevity
    }
    public class DeletePermission : IAuthorizationRequirement
    {
        // Code omitted for brevity
    }
    

  • Startup.cs

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

  • 使用

  • Use

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

  • 这篇关于不同角色的不同API功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆