webapi框架搭建-安全机制(三)-基于角色的权限控制

webapi框架搭建系列博客

  上一篇已经完成了“身份验证”,如果只是想简单的实现基于角色的权限管理,我们基本上不用写代码,微软已经提供了authorize特性,直接用就行。

Authorize特性的使用方法

配置Authorize

  比较简单,直接上代码

using System.Collections.Generic;
using System.Net.Http;
using System.Security.Claims;
using System.Web.Http;
using webapi.Common;

namespace webapi.example
{
    [RoutePrefix("api/security")]
    public class SecurityTestController : ApiController
    {
        /// <summary>
        /// 通过get请求里传过来的值生成token
        /// </summary>
        /// <returns></returns>
        [Route("token"),HttpGet]
        public IHttpActionResult GetToken()
        {
            var dic=new Dictionary<string,object>();
            foreach (var queryNameValuePair in Request.GetQueryNameValuePairs())
            {
                dic.Add(queryNameValuePair.Key,queryNameValuePair.Value);
            }
            var token=new JWTHelper().Encode(dic, "shengyu",30);
            return Ok(token);
        }

        /// <summary>
        /// 返回token里加密的信息
        /// </summary>
        /// <returns></returns>
        [Route("GetUserInfoFromToken"),HttpGet]
        public IHttpActionResult GetUser()
        {
            var user = (ClaimsPrincipal)User;
            var dic=new Dictionary<string,object>();
            foreach (var userClaim in user.Claims)
            {
                dic.Add(userClaim.Type,userClaim.Value);
            }
            return Ok(dic);
        }

        #region 硬编码的方式实现简单的权限控制

        /// <summary>
        /// 只有某种角色的用户才有权限访问
        /// </summary>
        /// <returns></returns>
        [Route("byCode/onlyRoles"), Authorize(Roles = "admin,superAdmin"),HttpGet]
        public IHttpActionResult OnlyRoles_SetByCode()
        {
            return Ok("OnlyRoles_SetByCode,仅管理员能访问");
        }
        /// <summary>
        /// 只有某几个用户才有权限访问
        /// </summary>
        /// <returns></returns>
        [Route("byCode/onlyUsers"), Authorize(Users = "张三,李四"),HttpGet]
        public IHttpActionResult OnlyUsers_SetByCode()
        {
            return Ok("OnlyRoles_SetByCode,仅张三和李四才能访问");
        }

        #endregion
    }

}

  Authorize特性有Roles和Users两个属性,设置这两个属性的值及可以控制哪些角色/用户有权限访问。Authorize特性可以用于修饰类或是方法,如果整个控制器都要用权限控制,则修饰这个控制器类,否则只修饰在某个接口上。如果控制器被修饰了但又要排除某一个action,可用AllowAnonymous特性进行排除。

获取token

  现在获取一个token,这个token里包含了“角色为admin”的信息,如下

用上一篇:webapi框架搭建-安全机制-身份验证(二)里的获取token的接口获取一个role为admin的token

请求需要权限的接口

  请求需要角色为admin或是superAdmin的接口SecurityTestController.OnlyRoles_SetByCode(),注意将上一步生成的token放到http request的header里

  你可尝试在“获取token"步骤里生成非admin角色的token,那么在这一步里会出现授权失败的错误,如下图

同样原理,在”获取token"步骤里user设置成“张三”或“李四”时,就可以用此token访问SecurityTestController.OnlyUsers_SetByCode()接口了。

  在实际开发中,获取token的接口(即方法SecurityTestController.GetToken())里的代码通常写在用户登录接口里,用户通过用户名和密码登录成功后,接口访问一个token给客户端,以后客户端的每次接口请求都在headers里带上这个token。微软提供的默认authorize特性在小项目和中型的对权限控制没有复杂要求的项目里已经够用了。缺点是项目开发前得确定好业务的各种角色,因为要以“硬编码”的方式写在接口方法上。后期如果要修改一个接口的所属角色,只有重新修改代码。

  如果要实现更加可控的基于角色的权限控制,只有自己写Authorize filter。下面介绍如何写自己的authorize filter。

自定义Authorize filter

  可通过继承下面三个对象之一去写自己的authorize filter

即:AuthorizeAttribute、AuthorizationFilterAttribute、IAuthorizationFilter,三者的关系如下图

我采用继承AuthorizeAttribute,并重写IsAuthorized方法,代码如下

using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Controllers;

namespace webapi.Security
{
    /// <summary>
    /// Role Basic AuthorizeAttribute(基于角色的授权)
    /// </summary>
    public class RBAuthorizeAttribute:AuthorizeAttribute
    {
        protected override bool IsAuthorized(HttpActionContext actionContext)
        {
            // 下在可替换成自己的授权逻辑代码
            return base.IsAuthorized(actionContext);
        }

        protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
        {
             actionContext.Response =
                actionContext.ControllerContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "未授权");
        }
    }
}

  RBAuthorize特性和Authorize特性用法是一样的,不再重复。后续的博客里会引入基于角色的权限管理的表结构,并在IsAuthorized方法里写授权逻辑。

原文地址:https://www.cnblogs.com/shengyu-kmust/p/8284599.html

时间: 2024-09-29 23:43:23

webapi框架搭建-安全机制(三)-基于角色的权限控制的相关文章

webapi框架搭建-安全机制(一)

前言 webapi接口是开放给外部使用的,包括接口的地址,传参的规范,还有返回结果的说明.正因为接口的开放性,使得接口的安全很重要.试想一下,用抓包工具(如fiddler),甚至浏览器获取到接口的规范后(甚至可以猜到接口的其它规范),如果接口没有做"安全"这一道防火墙,任何人都可以调用接口来获取及提交数据,这真是太可怕了.17年我负责一个气象类项目的开发,其中有些功能是我们无法完成但甲方要求必须有的功能,并给我们展示了实现该功能的一个产品.后面通过对此产品的fiddler抓包分析,了解

基于角色的权限控制

首先要明白的有一个表就是需要记录整个项目中控制器和方法,这样在权限检测的时候就可以检测数据库对应的角色有没有这个控制器或者方法的权限, 但是需要明白的是在开发的过程中当然需要把这种权限给取消,这样在开发过程是需要增加一个控制器或者方法就不需要验证权限,然后开发好了之后就需要 在权限表中增加该控制器和方法. 一般基于角色的权限控制,需要用到下面的几张表 1.用户表2,权限表,3.角色表,4权限角色关系表5用户角色关系表 这种方式是用户通过,用户角色关系表查询出自己的角色,然后通过权限角色关系表查出

使用Lync 2013 基于角色的权限控制:RBAC 给用户分配指定的操作权限

使用场景: 在大型的Lync统一沟通系统的日常运维中,我们需要为不同角色的管理员分配不同的Lync管理权限,在Lync Server 2013上面就使用了基于角色的权限控制:RBAC ,它里面分了多种权限角色,包括 CsAdministrator,CsUserAdministrator,CsVoiceAdministrator,CsServerAdministrator,CsViewOnlyAdministrator,CsHelpDesk等等,不同的角色有不同的Lync管理权限, 例如,当我们只

基于角色的权限控制在Drupal7中的实现

案例:某公司网站除默认的三个角色外,需要设置5个角色来实现权限控制. 1.内容发布员:新建内容.修改和删除自己发布的内容. 2.内容管理员:继承发布员的所有权限,并可修改和删除所有人发布的内容. 3.公司领导:查看指定给公司领导访问的内容. 4.公司中层:查看指定给公司中层访问的内容. 5.公司员工:查看指定给公司员工访问的内容. 实现步骤如下: 1.新建上述五个角色. 2.在用户权限管理界面中给内容发布员和内容管理员赋予相应的权限. 3.下载.安装.启用content_access模块,并重建

thinkphp基于角色的权限控制详解

一.什么是RBAC 基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注. 在RBAC中,权限与角色相关联,用户通过成为适 基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注. array( 'APP_AUTOLOAD_PATH'=>'@.TagLib', 'SESSION_AUTO_START'=>类型 1 登录认证 2

Djang之基于角色的权限控制(RBAC)

一.后端部分 1. models设计 实现:特定角色拥有访问特定url路径,角色关联用户,以此来控制用户的访问. 如:管理员:可以访问所有的url地址,甲关联了管理员,则甲拥有访问所有url地址的权限,普通用户:只拥有访问查看数据(查看某个页面)的url地址,乙关联普通用户,乙就只拥有普通用户的权限 2.models实现 class Permission(models.Model): url = models.CharField(max_length=64, verbose_name='权限')

ASP.NET MVC 基于角色的权限控制系统的示例教程

上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于角色的权限控制方法. 基于角色的权限控制方法概述 基于角色的权限控制系统RBAC(Role Based Access Control)是目前最流行,也是最通用的权限控制系统.所谓基于角色的权限控制,就是将各个操作权限分组,每一个组就是一个角色,举个例子:管理员拥有所有的权限,编辑就只拥有写文章和发布

webapi框架搭建系列博客

webapi框架搭建系列博客 webapi框架搭建-创建项目(一) webapi框架搭建-创建项目(二)-以iis为部署环境的配置 webapi框架搭建-创建项目(三)-webapi owin webapi框架搭建-依赖注入之autofac webapi框架搭建-日志管理log4net webapi框架搭建-webapi异常处理 原文地址:https://www.cnblogs.com/shengyu-kmust/p/8279300.html

ASP.net MVC 基于角色的权限控制系统的实现

一.引言 我们都知道ASP.net mvc权限控制都是实现AuthorizeAttribute类的OnAuthorization方法. 下面是最常见的实现方式: public class CustomAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { if (!filterContext.RequestContext