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方法里写授权逻辑。

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

  1. webapi框架搭建-安全机制(四)-可配置的基于角色的权限控制

    webapi框架搭建系列博客 在上一篇的webapi框架搭建-安全机制(三)-简单的基于角色的权限控制,某个角色拥有哪些接口的权限是用硬编码的方式写在接口上的,如RBAuthorize(Roles = ...

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

    本系列博客链接:webapi框架搭建系列博客 前言 webapi接口是开放给外部使用的,包括接口的地址,传参的规范,还有返回结果的说明.正因为接口的开放性,使得接口的安全很重要.试想一下,用抓包工具( ...

  3. webapi框架搭建-安全机制(二)-身份验证

    webapi框架搭建系列博客 身份验证(authentication)的责任是识别出http请求者的身份,除此之外尽量不要管其它的事.webapi的authentication我用authentica ...

  4. webapi框架搭建系列博客

    webapi框架搭建系列博客 webapi框架搭建-创建项目(一) webapi框架搭建-创建项目(二)-以iis为部署环境的配置 webapi框架搭建-创建项目(三)-webapi owin web ...

  5. webapi框架搭建-创建项目(三)-webapi owin

    上一篇:创建项目(二) 在上一篇里,我们已经创建好了webapi应用,并已经部署到iis里,本篇讲如何用owin自宿主或是iis宿主来部署webapi应用. owin介绍 传统的asp.net网站只能 ...

  6. webapi框架搭建-数据访问ef code first

    webapi框架搭建系列博客 为什么用ef? 我相信很多博友和我一样都有这种“选择困难症”,我曾经有,现在也有,这是技术人的一个通病——总想用“更完美”的方式去实现,导致在技术选择上犹豫不决,或总是推 ...

  7. webapi框架搭建-依赖注入之autofac

    前言 c#的依赖注入框架有unity.autofac,两个博主都用过,感觉unity比较简单而autofac的功能相对更丰富(自然也更复杂一点),本篇将基于前几篇已经创建好的webapi项目,引入au ...

  8. webapi框架搭建-日志管理log4net

    前言 本篇讲怎么在前几篇已经创建好的项目里加上日志处理机制,我们采用Log4net技术.跟多的log4net技术的细节请查阅log4net的官网. log4net官网:http://logging.a ...

  9. webapi框架搭建-webapi异常处理

    webapi框架搭建系列博客 前言 上一篇我们已经完成了项目的日志管理,在项目开发中日志会经常记录程序中的异常,供后续问题排查使用.本篇讲如何在webapi里加入异常处理机制. 目的和原则 1.程序任 ...

随机推荐

  1. 安卓开发神器vysor+adb wifi

    准备: 1.vysor需要FQ从google应用商店下载,装在google上,目前知道的免费的vysor的作用是电脑显示手机屏幕并且能操控手机. 步骤:FQ后就能下载了,FQ方法不赘述.

  2. Java操作百度身份证API

    网址:http://apistore.baidu.com/ 点击功能进行复制代码,就拿百度的身份证API 举例子: http://apistore.baidu.com/apiworks/service ...

  3. 第九周(11.11-11.17)----Beta版本发布140字评论

    1.新蜂组: 俄罗斯方块:项目有良好的用户界面,在原版的基础上可以对用户分数进行排序,增加了显示下一个方块的功能.是个很有趣的小游戏. 2.天天向上组: 连连看:完成了基本功能,增加了消除时和鼠标点击 ...

  4. 简单 dp

    1.摆花问题 题目描述小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过a ...

  5. Selenium_IDE的基本使用及脚本解析

    Selenium确实还是很强大的.根据我以往的经验,这个东西在web测试里的作用还是相当大的.经过近期研究,暂时对基本运作方式有了一定了 解,依旧找个实例记录一下.本段脚本实现的是网易返现个人中心登录 ...

  6. Js apply方法详解,及其apply()方法的妙用

    Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...

  7. 解决Linux关闭SSH,终端后运行程序终止问题(包括后台)

    问题描述: 每次SSH到服务器上,然后运行了一个自己写的服务端程序,比如 ./myserver.sh ,然后关闭ssh或者终端之后,发现服务不能访问. 简要分析下: 根据   这篇博文  的提示,ss ...

  8. 一个flume agent异常的解决过程记录

    今天在使用flume agent的时候,遇到了一个异常,  现把解决的过程记录如下: 问题的背景: 我使用flume agent 来接收从storm topology发送下来的accesslog , ...

  9. js & Object reference bug

    js & Object reference bug bug object ref bug onClickButton (type = ``) { let { publishDate: publ ...

  10. Java并发编程实战2-线程安全

    1. 定义 一个类是线程安全的,是指在被多个线程访问时,类可以持续进行正确的行为. 2. WHY 我们想要的是线程安全的程序,为什么在线程安全的开始讲线程安全的类呢? 编写线程安全的代码,本质上就是管 ...