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.RegularExpressions;
    using System.Web.Http.Controllers;
    using System.Web.Http.Filters;

    /// <summary>
    /// WebAPI防篡改签名验证抽象基类Attribute
    /// </summary>
    public abstract class AbsBaseAuthenticationAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// Occurs before the action method is invoked.
        /// </summary>
        /// <param name="actionContext">The action context</param>
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            //获取Asp.Net对应的Request
            var request = ((HttpContextWrapper)actionContext.Request.Properties["MS_HttpContext"]).Request;
            NameValueCollection getCollection = request.QueryString;//此签名要求Partner及Sign均通过QueryString传递
            if (getCollection != null && getCollection.Count > 0)
            {
                string partner = getCollection[SecuritySignHelper.Partner];
                string sign = getCollection[SecuritySignHelper.Sign];
                if (!string.IsNullOrWhiteSpace(partner)//必须包含partner
                   && !string.IsNullOrWhiteSpace(sign)//必须包含sign
                   && Regex.IsMatch(sign, "^[0-9A-Za-z]{32}$"))//sign必须为32位Md5摘要
                {
                    //获取partner对应的key
                    //这里暂时只做了合作key校验,不做访问权限校验,如有需要,此处可进行调整,建议RBAC
                    string partnerKey = this.GetPartnerKey(partner);
                    if (!string.IsNullOrWhiteSpace(partnerKey))
                    {
                        NameValueCollection postCollection = null;
                        switch (request.RequestType.ToUpper())
                        {
                            case "GET": break;//只是为了同时显示restful四种方式才有这部分无意义代码
                            //实际该以哪种方式进行请求应遵循restful标准
                            case "POST":
                            case "PUT":
                            case "DELETE":
                                postCollection = request.Form;//post的数据必须通过application/x-www-form-urlencoded方式传递
                                break;
                            default:
                                throw new NotImplementedException();
                        }
                        //根据请求数据获取MD5签名
                        string vSign = getCollection.GetSecuritySign(partner, partnerKey, postCollection);
                        if (string.Equals(sign, vSign, StringComparison.OrdinalIgnoreCase))
                        {//验证通过,执行基类方法
                            base.OnActionExecuting(actionContext);
                            return;
                        }
                    }
                }
            }
            //此处暂时以401返回,可调整为其它返回
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
            //actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
        }

        /// <summary>
        /// 获取合作号对应的合作Key,如果未能获取,则返回空字符串或者null
        /// </summary>
        /// <param name="partner"></param>
        /// <returns></returns>
        protected abstract string GetPartnerKey(string partner);
    }

子类例子

    public class AuthenticationAttribute : AbsBaseAuthenticationAttribute
    {
        protected override string GetPartnerKey(string partner)
        {
            //TODO:从缓存中或者其它地方读取数据
            return "bbb";
        }
    }

实际可以在需要身份验证的ApiController上增加[Authentication],也可以写一个基类,然后需要身份验证的ApiController继承自该基类

    [Authentication]
    public class ApiControllerBase : ApiController
    {
    }
时间: 2024-10-29 04:25:02

WebAPI 用户认证防篡改实现(二)AbsBaseAuthenticationAttribute的相关文章

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

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

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

每个平台都应该具备异常处理策略,此处异常处理策略只针对用户请求产生的当前线程异常,不包括异步处理时产生的未捕获异常,关于异常处理建议大家可以去看下微软企业库的 Exception Handling Application Block AbsCommonExceptionFilterAttribute,同信息验证一样,异常也是通过Attrbute来处理 using System.Net; using System.Net.Http; using System.Web.Http.Filters; /

ASP.NET Core 2.2 : 二十六. 应用JWT进行用户认证及Token的刷新

来源:https://www.cnblogs.com/FlyLolo/p/ASPNETCore2_26.html 本文将通过实际的例子来演示如何在ASP.NET Core中应用JWT进行用户认证以及Token的刷新方案(ASP.NET Core 系列目录) 一.什么是JWT? JWT(json web token)基于开放标准(RFC 7519),是一种无状态的分布式的身份验证方式,主要用于在网络应用环境间安全地传递声明.它是基于JSON的,所以它也像json一样可以在.Net.JAVA.Jav

翻译: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

mongo db 学习笔记 之二: mongodb 用户认证

首先要知道mongodb默认安装后是没有任何认证开启的,也就是说,所有能连接到服务器的人都能进数据查看,当然,你可以用防火墙来挡.但没有防火墙的保护,数据库暴露出来是非常危险的. mongodb关于安全分为几个方面,主要是:认证,基于角色的访问控制(授权),审计,加密,部署和环境的安全(涉及到网络跟系统的访问环境). 一 关于认证 使用用户名认证指令为: mongo --port 27017 -u manager -p 12345678 --authenticationDatabase admi

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

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

十二周二次课 12.6 Nginx安装 12.7 默认虚拟主机 12.8 Nginx用户认证 12.

十二周二次课 12.6 Nginx安装 12.7 默认虚拟主机 12.8 Nginx用户认证 12.9 Nginx域名重定向 12.6 Nginx安装 12.7 默认虚拟主机 12.8 Nginx用户认证 12.9 Nginx域名重定向 原文地址:http://blog.51cto.com/wbyyy/2087031

linux(十二)___Apache服务器用户认证、虚拟主机的配置

创建xiangkejin  zhangsan两个用户 可看见文件中创建的两个用户: 建立虚拟目录并配置用户认证 ①建立虚拟目录 /xiangkejin ②在Apache的主配置文件httpd.conf文件中,加入以下语句 Alias /xiangkejin "/xkj"<Directory "/xkj"> AuthType Basic Authname "This is a private website" AuthUserFile

十二周二课 Nginx安装、Nginx默认虚拟主机、Nginx用户认证、Nginx域名重定向

Nginx安装 首先进入/usr/local/src目录.然后下载Nginx.wget http://nginx.org/download/nginx-1.12.1.tar.gz然后解压tar zxf nginx-1.12.1.tar.gz然后进入我们刚才解压好的目录进行编译cd nginx-1.12.1[[email protected] nginx-1.12.1]# ./configure --prefix=/usr/local/nginx这里没有加编译参数,我们可以根据实际情况,在后期编译