WebAPI 用户认证防篡改实现(三)异常信息处理 AbsCommonExceptionFilterAttribute

每个平台都应该具备异常处理策略,此处异常处理策略只针对用户请求产生的当前线程异常,不包括异步处理时产生的未捕获异常,关于异常处理建议大家可以去看下微软企业库的 Exception Handling Application Block

AbsCommonExceptionFilterAttribute,同信息验证一样,异常也是通过Attrbute来处理

    using System.Net;
    using System.Net.Http;
    using System.Web.Http.Filters;

    /// <summary>
    /// WebAPI异常响应处理
    /// </summary>
    public abstract class AbsCommonExceptionFilterAttribute : ExceptionFilterAttribute
    {
        /// <summary>
        /// Raises the exception event
        /// </summary>
        /// <param name="actionExecutedContext">The context for the action.</param>
        public override void OnException(HttpActionExecutedContext actionExecutedContext)
        {
            string exceptionStr = string.Empty;
            HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
            if (this.AllowException)
            {//允许在返回结果中包含异常信息
                exceptionStr = this.HandleException(actionExecutedContext, ref statusCode);
            }
            //此处可以修正返回值
            actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(statusCode, new StringContent(exceptionStr));
            //actionExecutedContext.Response = new HttpResponseMessage(statusCode) { Content = new StringContent(exceptionStr) };
        }
        /// <summary>
        /// 是否允许返回异常信息,测试环境中应当允许返回异常以辅助测试,正式环境中应禁止返回异常
        /// </summary>
        protected abstract bool AllowException { get; }
        /// <summary>
        /// 异常处理策略
        /// </summary>
        /// <param name="actionExecutedContext"></param>
        /// <param name="ex"></param>
        /// <returns></returns>
        protected virtual string HandleException(HttpActionExecutedContext actionExecutedContext, ref HttpStatusCode statusCode)
        {
            //此处可以对异常进行分类处理,修正返回的HttpStatusCode
            //也可以对异常进行封装或者转换,建议采用微软企业库的Exception Handling Application Block
            //if (actionExecutedContext.Exception is NotImplementedException)
            //{
            //    statusCode = HttpStatusCode.NotImplemented;
            //}
            return actionExecutedContext.Exception.ToString();
        }
    }

子类例子

    public class CommonExceptionFilterAttribute : AbsCommonExceptionFilterAttribute
    {
        protected override bool AllowException
        {
            get { return true; }
        }
    }

注册Attribute,在默认生成的WebApiConfig文件的Register方法中增加如下代码

config.Filters.Add(new CommonExceptionFilterAttribute());
时间: 2024-11-03 12:14:32

WebAPI 用户认证防篡改实现(三)异常信息处理 AbsCommonExceptionFilterAttribute的相关文章

WebAPI 用户认证防篡改实现(二)AbsBaseAuthenticationAttribute

WebAPI的用户身份认证与MVC一样都是通过Attribute进行验证,此处定义了一个抽象基类,子类需要实现根据合作号获取合作用户信息的抽象方法 AbsBaseAuthenticationAttribute using System; using System.Web; using System.Collections.Specialized; using System.Net; using System.Net.Http; using System.Text.RegularExpressio

WebAPI 用户认证防篡改实现(一)MD5签名获取

在开始前先说下防篡改机制的原理,如果已经接触过支付宝的可以跳过此部分 防篡改,顾名思义就是防止有人恶意篡改请求数据以达到恶意攻击的目的,那要怎么才能实现这样的目的呢?其实很简单,将要请求的数据加上合作号.合作Key按规则组织成一个字符串,获取对应的MD5摘要,然后将该摘要及合作号同时作为请求的一部分一起传递(合作Key禁止传递) 下面进行举例: 假定需要进行签名的参数如下(以json格式举例): {'partner': '3122131212','orderNo':'1234567'} 对数组里

CentOS7.4搭建基于用户认证的MongoDB4.0三节点副本集集群

mongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模式,点击 ,如图: 那什么是副本集呢?打魔兽世界总说打副本,其实这两个概念差不多一个意思.游戏里的副本是指玩家集中在高峰时间去一个场景打怪,会出现玩家暴多怪物少的情况,游戏开发商为了保证玩家的体验度,就为每一批玩家单独开放一个同样的空间同样的数量的怪物,这一个复制的场景就是一个副本,不管有多少个玩家各自在各自的副本里玩不会互相影响. mongoDB的副本也是这个,主从模式其实就是一个单副本的应用,没有很好的扩展性和容错性.而副本

翻译:WebApi 认证--用户认证Oauth解析

The Web API v2用户认证模板提供了流行的应用用户认证场景,如.使用本地帐号的用户名密码认账 (包括创建用户.设置和修改密码)以及使用第三方的认证方式,如facebook,google等等– 在本地中包含了外部帐号的连接 所有的这些均通过使用一个OAuth2认证服务进行. To make all that happen the template combines quite a bit of new stuff together: OWIN, Katana authentication

WebApi系列~安全校验中的防篡改和防复用

回到目录 web api越来越火,因为它的跨平台,因为它的简单,因为它支持xml,json等流行的数据协议,我们在开发基于面向服务的API时,有个问题一直在困扰着我们,那就是数据的安全,请求的安全,一般所说的安全也无非就是请求的防篡改和请求的防复用,例如,你向API发一个查询用户账户的请求,在这个过程中,你可能要传递用户ID,用户所在项目ID等,而现在拦截工具如此盛行,很容易就可以把它的请求拦截,然后篡改,再转发,这样你的API就是不安全的,而对于订单,账户模块这种糟糕的API设计更是致命的,可

Linux学习总结(三十四)lamp之用户认证和域名跳转

用户认证 为了某些网站的安全需要,特意授权特定用户访问,因此产生了网站访问的用户认证机制.我们可以针对某个站点进行认证,也可以指定某个目录,或者是一个文件.编辑虚拟主机配置文件:vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf //把123.com那个虚拟主机编辑成如下内容 <VirtualHost *:80> DocumentRoot "/data/wwwroot/www.123.com" ServerName w

政府网站防篡改解决方案

政府网站防篡改解决方案        互联网的出现,被誉为 20 世纪最伟大的发明,它彻底改变了人们传统的生活方式,对现代社会产生了巨大影响.政府网站已成为政府电子政务的数字门户,是对外宣传国家政策法规的手段,是与社会大众交互.向社会大众提供服务和展现国家民主政治的重要窗口.随着网站数量不断增加,与之相对应的是网站受攻击的情况也越来越多.网站被攻击的各类情况中,网站页面被篡改事件给政府带来的影响尤其恶劣,影响面最广.尤其是含有政治攻击色彩的篡改,会对政府形象造成严重损害. 2006 年 3 月

Flask学习之六——用户认证

1. 密码安全性 使用Werkzeug实现密码hash generate_password_hash(password, method, salt_length) 将原始密码作为输入,以字符串形式输出密码的hash值,输出的值可保存在用户数据库中.method 和 salt_length的默认值就能满足大多数需求. check_password_hash(hash, password) 将数据库中取回的密码hash和用户输入的密码比较,如果密码正确则返回Trueapp/models.py:在Us

使用数字签名实现数据库记录防篡改(Java实现)

本文大纲 一.提出问题 二.数字签名 三.实现步骤 四.参考代码 五.后记 六.参考资料 一.提出问题 最近在做一个项目,需要对一个现成的产品的数据库进行操作,增加额外的功能.为此,需要对该产品对数据库有什么操作进行研究(至于怎么监控一个产品的操作会引发什么数据库操作,以后会详细解说).本来已经对数据库的操作了如指掌的,无意中发现数据库表里的每条记录都会有这样一个字段: 这感觉不妙了,字段名叫signature,顾名思义,就是签名的意思呀.难道数据库表中的每条记录都会有签名?也就是说如果我不能正