加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 针对不同角色的不同API功能

发布时间:2020-12-15 22:53:27 所属栏目:百科 来源:网络整理
导读:我有asp.net核心2.1的API.基于声明的身份验证.是否可以将这两个api功能合二为一? [Authorize(Roles = "Admin")][HttpPost("delete")]public IActionResult Delete([FromBody]Item item){ _itemService.Delete(item.Id); return Ok();}[Authorize][HttpPost(
我有asp.net核心2.1的API.基于声明的身份验证.是否可以将这两个api功能合二为一?

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

或者我应该检查内部方法的角色?

解决方法

要检查用户是管理员还是作者的权限,您可以实现多个要求作为来自@ user2884707bond的文档.

用于为您的方案使用多个要求.

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

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

>要求

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

>使用

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读