跟mvc一样,webapi大多通过附加Authorize特性来实现授权,Authorize当授权失败时返回状态码:401。一般系统状态为401时,服务端就Redirect重定向到登录页。
    问题来了,我们的webapi在为富客户端ajax提供服务时,合理的做法是无论服务端发生什么情况,都尽可能给客户端返回json,才方便ajax回调函数解析。而重定向到登录了,则将返回登录页的一串html,ajax回调函数就傻傻的分不清楚啦。
    当然,解决办法是有的,思路为:重写Authorize的HandleUnauthorizedRequest,让服务端返回json,并且把状态码401改为其他状态码来避免被重定向。最合理的是改为403,表示服务器拒绝。
重写Authorize有以下几个要点需注意:
  1. HandleUnauthorizedRequest中基类方法已经将Response的状态设为”HttpStatusCode.Unauthorized(即401)“,重写时手请动改为”HttpStatusCode.Forbidden(即403)“,否则按401状态往下执行,就要被重定向到登录页;
  2. webApi下的授权筛选attribute为System.Web.Http.AuthorizeAttribute,而Mvc下用的是System.Web.Mvc.AuthorizeAttribute。这里别继承错了,否则授权筛选attrbute拦截不了。
  3. WebApi下Authorize.HandleUnauthorizedRequest的参数filterContext在此上下文里response还为空,需要手动创建。
    
以下是我重写的Authorize:
  /// <summary>
/// 重写实现处理授权失败时返回json,避免跳转登录页
/// </summary>
public class ApiAuthorize : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(HttpActionContext filterContext)
{
base.HandleUnauthorizedRequest(filterContext); var response = filterContext.Response = filterContext.Response ?? new HttpResponseMessage();
response.StatusCode = HttpStatusCode.Forbidden;
var content = new Result
{
success = false,
errs = new[] { "服务端拒绝访问:你没有权限,或者掉线了" }
};
response.Content = new StringContent(Json.Encode(content), Encoding.UTF8, "application/json");
}
}

运行结果:
 

 
chrome下查看返回状态:
 
 
 
Demo已经上传,需要的朋友请点击下载:示例源码
 

WebApi授权拦截——重写AuthorizeAttribute的更多相关文章

  1. MVC,重写AuthorizeAttribute实现自己的权限验证(一)

    我们要实现下面的效果,某个controller,只允许某几个角色访问(admin,user,document controller) [MyAuthorize(Roles = "Admin, ...

  2. 秒极啊!手把手带你进行shiro授权拦截器的重写,学到了学到了

    shiro整合前后端分离的springboots,Vue项目真的是有很多大坑啊. 今天我的主题是:如何设置shiro过滤器. 遇到问题:我的项目是前后端分离的,shiro里面有一个shiroFilte ...

  3. WebApi 消息拦截

    最近公司要求对WebApi 实现服务端信息的监控(服务端信息拦截),由于本人之前没有做过这方便的相关项目所以在做的过程中也是困难重重,探索的过程也是非常痛苦的,好歹最终也算实现了这个功能.所以将这个分 ...

  4. 电商系统架构总结3(webapi授权机制)

    三 Web API 授权方式 web api的客户端,包括 android,ios,h5,自然对访问权限要加上授权机制.对于h5,要求把h5站点和web api部署在同一个域名下,然后对web api ...

  5. WebApi 通过拦截器设置特定的返回格式

    public class ActionFilter : ActionFilterAttribute { /// <summary> /// Action执行之后由MVC框架调用 /// & ...

  6. ASP.NET WEBAPI 的身份验证和授权

    定义 身份验证(Authentication):确定用户是谁. 授权(Authorization):确定用户能做什么,不能做什么. 身份验证 WebApi 假定身份验证发生在宿主程序称中.对于 web ...

  7. MVC AuthorizeAttribute 动态授权

    开发中经常会遇到权限功能的设计,而在MVC 下我们便可以使用重写 AuthorizeAttribute 类来实现自定义的权限认证 首先我们的了解 AuthorizeAttribute 下面3个主要的方 ...

  8. MVC中AuthorizeAttribute用法并实现授权管理

    1.创建一个类(用来检查用户是否登录和用户权限)代码如下 public class MemberCheckAttribute : AuthorizeAttribute { //AuthorizeAtt ...

  9. MVC—WebAPI(调用、授权)

    ASP.NET MVC—WebAPI(调用.授权)   本系列目录:ASP.NET MVC4入门到精通系列目录汇总 微软有了Webservice和WCF,为什么还要有WebAPI? 用过WCF的人应该 ...

随机推荐

  1. XHTML编码规范

    1.所有的标记都要有结束标记. 2.所有标记的名称和属性名称都必须使用小写 3.所有的的标记必须合理嵌套 4.属性值必须用引号包含起来 5.需要设置的属性都要给一个值 XHTML 规定所有属性都必须有 ...

  2. 详解MyEclipse10 安装Spket 1.6.23(支持Extjs4.1.1及jQuery1.8)

    用MyEclipse10安装Spket主要有3种方式:在线下载更新.下载Zip覆盖.下载jar包安装.我用在线安装尝试了N次终于还是失败,只好下载jar包来安装,在失败了M次之后终于安装成功,现在网上 ...

  3. Extjs随笔

    { columnWidth : .1, layout : 'form', items : [{ fieldLabel : "至", labelSeparator:'', label ...

  4. IE调试方法(一)<转>

    前面两篇关于IE11开发人员工具的文章,我们分别介绍了两个新的功能:UI响应工具和内存分析工具,今天为大家介绍一个老功能:网络工具,虽然是在IE9开始已经加入了这个工具,但是在IE11中还有有很多改进 ...

  5. PostgreSQL的注释嵌套的例子

    pgsql=# -- Multiline comments pgsql=# SELECT 'Multi' /* This comment extends across pgsql*# * number ...

  6. IE自动化 二(判断IP所在地)

    该脚本用来访问一个url,并取出相应结果(该脚本用来通过淘宝API实现判断一个IP所在地) #定义要访问的URL $url="http://ip.taobao.com/service/get ...

  7. Java内存区域分析

    程序计数器 指令运行的指示器. 每一个线程都有独立的程序计数器,互无影响,我们称这类区域为线程私有的内存. 运行Java方法,计数器记录的是正在运行的虚拟机字节码指令地址;假设运行的是native方法 ...

  8. c++课程实训 银行储蓄系统

    基本要求:定义了用户类(User)和银行类(Bank),用成员函数实现各种功能,多文件组织程序.能用文本文件存取数据(如演示样例中给出的技术): 拓展方向: 序号 加分项目 细       则 1 改 ...

  9. WPF仿360卫士9.0界面设计

    Chrome插件——一键保存网页为PDF1.0 http://blog.csdn.net/bdstjk/article/details/9208313 仿照网上的一个代码写的,地址找不到了. 将窗体, ...

  10. 浅析C#基于TCP协议的SCOKET通信

    TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实 ...