ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

C#-ASP.NET核心Web API:基于数据库权限的授权

2019-12-11 01:06:58  阅读:681  来源: 互联网

标签:asp-net-core-webapi c


我正在寻找解决方案/建议,以帮助我创建对Web api端点/控制器操作的基于权限的访问.

基于角色的访问不适合,因为我没有可在诸如Role(“ Admin”)或Role(“ Controller”)之类的代码中使用的固定规则.

基于声明的权限也是不可行的,因为每个用户/客户可以对每个业务对象/实体具有不同的权限(例如,对自己的票证的读/写访问和对他/她公司的所有票证的读访问,或者如果其是我公司的技术人员,公司拥有所有客户所有票证的完全访问权限,因此每个用户将有10甚至什至数百个索赔,我必须在每次访问API时对其进行评估.

它只是数据库中的一种多租户,并且租户是我们的客户,具有某种“主租户”,可以访问所有租户数据.

我认为像Visual Guard这样的东西可以满足我的需求,但价格昂贵,并且它们目前不支持网络核心,并且其文档似乎已经过时了.

我不需要立即可用的解决方案,但是由于我现在正在寻找和寻找一段时间,因此非常有用的一些提示和技巧.

有关“数据库权限”的详细信息:
我的意思是在我的前端(Winforms应用程序)中,我想建立一个安全系统,在该系统中可以创建用户并向用户分配角色,并在这些角色中定义了用户可以执行的操作以及他/她可以对特定对象执行的CRUD操作业务对象.每个角色可以具有n个用户,每个角色可以具有n个权限.每个权限本身都声明了例如Create:false,Read:true,Write:true和Delete:false.如果未找到对特定业务对象的许可,则将完全拒绝该BO上的CRUD.

因此,每当调用我的API中的操作时,我都必须检查该用户及其规则是否允许他根据数据库中的规则和权限执行该特定操作.

详细说明应用程序结构:
前端将是一个Winforms应用程序,它将由OData在后台调用API.我不想完全依赖Winforms应用程序中的安全性,因为可以从Internet上访问该API,而且我不确定用户是否不会尝试使用其凭据访问api,只是为了查看possblie是什么而已. “前端过滤器”.因此,权限位于API中,并且如果用户尝试访问s.t.如果可能的话,在前端应用程序中,应用程序本身会“询问” API.
稍后,我想创建也使用Odata Web API的移动客户端.

解决方法:

asp.net核心中的相关API是:

> IAuthorizationService
>授权政策
>信息化要求
> IAuthorizationHandler

您正在寻找的授权模式称为基于资源的授权

https://docs.microsoft.com/en-us/aspnet/core/security/authorization/resourcebased?view=aspnetcore-2.2

基本上,您可以定义AuthorizationPolicy,并将其应用于资源实例:

var ticket = _ticketRepository.Find(ticketID);

var authorizationResult = await _authorizationService
        .AuthorizeAsync(User, ticket, "EditTicketPolicy");

在授权处理程序中,您可以检查用户是否是资源的所有者.

public class ResourceOwnerRequirement : IAuthorizationRequirement
{
}

public class ResourceOwnerHandler 
    : AuthorizationHandler<ResourceOwnerRequirement, MyBusinessObject>
    //: AuthorizationHandler<ResourceOwnerRequirement> use this overload to handle all types of resources...
{
    protected override Task HandleRequirementAsync(
        AuthorizationHandlerContext context, 
        ResourceOwnerRequirement requirement, 
        MyBusinessObject resource)
    {
        int createdByUserId = resource.CreatedBy;
        Claim userIdClaim = ((ClaimsIdentity)context.User.Identity).FindFirst("UserId");

        if (int.TryParse(userIdClaim.Value, out int userId)
            && createdByUserId == userId)
        {
            context.Succeed(requirement);
        }
    }
}

//admin can do anything
public class AdminRequirementHandler : IAuthorizationHandler
{
    public Task HandleAsync(AuthorizationHandlerContext context)
    {
        if (context.User.Claims.Any(c => c.Type == "Role" && c.Value == "Administator"))
        {
            while (context.PendingRequirements.Any())
            {
                context.Succeed(context.PendingRequirements.First());
            }
        }
        return Task.CompletedTask;
    }
}

顺便说一句,这仍然可以称为声明或基于角色的授权.具有特定角色的用户可以编辑自己的票证,但是具有管理员角色的用户也可以编辑其他票证.区别在于您将授权应用于资源,而不仅仅是操作

编辑:

标签:asp-net-core-webapi,c
来源: https://codeday.me/bug/20191211/2105388.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有