用户登录控制器:[ActionFilter]自定义过滤器

用户信息:var userData = new JObject();
                   userData.Add("account", account);
                   userData.Add("password", password);
                   userData.Add("accountType",2);

生成用户登录的凭据:FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, account, DateTime.Now, DateTime.Now.AddMinutes(10),
         true, JsonConvert.SerializeObject(userData), FormsAuthentication.FormsCookiePath);

string ticString = FormsAuthentication.Encrypt(ticket);

设置AJAX请求的请求头:内容为登录时生成的凭证

$.ajax("/api/Supervisor/GetSupervisorList", {
            method: "GET",
            data: {
                account: obj.account || "",
                loginSession: obj.loginSession || "",
                pageNo: obj.pageNo || 1,
                keyword: obj.keyword || ""
            },//heads: {Authorization: "Basic " + obj.loginSession},
            beforeSend: function (xhr) {
                //发送ajax请求之前向http的head里面加入验证信息
                xhr.setRequestHeader('Authorization', 'Basic ' + (obj.loginSession || ""));
            }})

[ActionFilter]自定义过滤器:必须继承ActionFilterAttribute

public class ActionFilter : ActionFilterAttribute
    {
        private string _requestId;

public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            base.OnActionExecuted(actionExecutedContext);
            //获取返回消息数据
            var response =

actionExecutedContext.Response.Content.ReadAsAsync(
                    actionExecutedContext.ActionContext.ActionDescriptor.ReturnType);
        }
public override void OnActionExecuting(HttpActionContext actionContext)
        {
            base.OnActionExecuting(actionContext);
            var auther = actionContext.Request.Headers.Authorization;
            if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any())
            {
                return;
            }
            if (auther == null)
            {
                //actionContext.Response.ReasonPhrase = "登录已过期,请重新登录";
                actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized,
                    new {messages = "登录已过期,请重新登录", resultCode = 1});
                //HttpContext.Current.Response.Redirect("~/Views/Home/Index.cshtml"); //跳到登陆页面
            }
            else
            {
                if (auther.Scheme == "Basic" && !string.IsNullOrEmpty(auther.Parameter))
                {
                    var userData = Functions.JudgeSession(auther.Parameter.Trim());
                    if (userData == null)
                    {
                        //actionContext.Response.ReasonPhrase = "登录已过期,请重新登录";
                        actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized,
                            new { messages = "登录已过期,请重新登录", resultCode = 1 });
                       // HttpContext.Current.Response.Redirect("~/Views/Home/Index.cshtml"); //跳到登陆页面
                    }
                    else
                    {

//修改API接口参数
                        actionContext.ActionArguments["account"] = userData.GetValue("account").ToString();
                        if (actionContext.ActionArguments.ContainsKey("accounType"))
                        {

actionContext.ActionArguments["account"] = userData.GetValue("accounType").ToString();
                        }

}
                }
            }}
        }

解密登录凭据,获取用户数据:

public static JObject  JudgeSession(string sessionid) //判断session是否过期
        {
            try
            {
                
                var formsAuthenticationTicket = FormsAuthentication.Decrypt(sessionid);
                if (formsAuthenticationTicket == null)
                {
                    return null;
                }
                if (formsAuthenticationTicket.Expired)
                {
                    return null;
                }
                return JsonConvert.DeserializeObject<JObject>(formsAuthenticationTicket.UserData);
            }
            catch (Exception e)
            {
                return null;
            }
        }

WEBAPI使用过滤器对API接口进行验证的更多相关文章

  1. Web API接口 安全验证

    在上篇随笔<Web API应用架构设计分析(1)>,我对Web API的各种应用架构进行了概括性的分析和设计,Web API 是一种应用接口框架,它能够构建HTTP服务以支撑更广泛的客户端 ...

  2. PHP开发api接口安全验证

    php的api接口 在实际工作中,使用PHP写api接口是经常做的,PHP写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并不知道 ...

  3. PHP开发api接口安全验证方法一

    前台想要调用接口,需要使用几个参数生成签名.时间戳:当前时间随机数:随机生成的随机数 签名:特定方法生成的sign签名 算法规则在前后台交互中,算法规则是非常重要的,前后台都要通过算法规则计算出签名, ...

  4. PHP开发api接口安全验证的实例,值得一看

    php的api接口 在实际工作中,使用PHP写api接口是经常做的,PHP写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并不知道 ...

  5. api接口token验证

    接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效: 2.因为是非开放性的,所以OAuth那套协议是行不通的,因为没有中间用户的授权过程: 3.有点接口需要用户登录 ...

  6. PHP 开发 api 接口安全验证

    原文链接:http://blog.csdn.net/li741350149/article/details/62887524

  7. PHP开发api接口 -- 安全验证 生成签名

    转载博客 ————. http://blog.csdn.net/li741350149/article/details/62887524 REST模式中HTTP请求方法(GET,POST,PUT,DE ...

  8. ASP.NET Core WebApi构建API接口服务实战演练

    一.ASP.NET Core WebApi课程介绍 人生苦短,我用.NET Core!提到Api接口,一般会想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过Web ...

  9. 如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)- 续(附demo)

    上篇文章说到接口安全的设计思路,如果没有看到上篇博客,建议看完再来看这个. 通过园友们的讨论,以及我自己查了些资料,然后对接口安全做一个相对完善的总结,承诺给大家写个demo,今天一并放出. 对于安全 ...

随机推荐

  1. Oracle临时表和SQL Server临时表的不同点对比

    文章来源:http://www.codesky.net/article/201109/141401.html 1.简介 Oracle数据库除了可以保存永久表外,还可以建立临时表temporary ta ...

  2. Spring IOC容器的初始化-(三)BeanDefinition的注册

    ---恢复内容开始--- 前言 在上一篇中有一处代码是BeanDefiniton注册的入口,我们回顾一下. 1.BeanDefiniton在IOC容器注册 首先我们回顾两点,1. 发起注册的地方:2. ...

  3. OpenWRT mt7620n 系统升级引起的问题

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qianguozheng/article/details/27237175 OpenWRT系统升级採用 ...

  4. Python 代码使用pdb调试技巧

    Debug 对于任何开发人员都是一项非常重要的技能,它能够帮助我们准确的定位错误,发现程序中的 bug.python 提供了一系列 debug 的工具和包,可供我们选择.本文将主要阐述如何利用 pyt ...

  5. 如何在B2C电子商务网站后台添加CNZZ统计代码(转)

    CNZZ作为网站流量数据统计分析工具的一种,和百度统计工具类似,同样也是用于查看分析网站所有流量数据来源的一种站长工具,当然商家可根据自己的习惯在B2C电子商务网站后台添加相应的数据统计代码来管理您的 ...

  6. bzoj 3566 [SHOI2014]概率充电器——树型

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3566 一眼看上去高斯消元.n^3不行. 竟然直接去看了TJ.发现树型dp.一下想到了自己还没 ...

  7. Java 引用类型数组

    引用类型变量可以使用类.接口或数组来声明. 数组引用变量是存放在栈内存(stack)中,数组元素是存放在堆内存(heap)中,通过栈内存中的指针指向对应元素在堆内存中的位置来实现访问. public ...

  8. php redis 常用方法

    一些php redis 常用的方法: 1.hGet($key,$hashKey) Redis Hget 命令用于返回哈希表中指定字段的值. <?php $redis = new redis(); ...

  9. CAN总线概述

    基本概念 CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议.在汽车产业中,出于对安全性.舒适性.方便性.低公害.低成本的要求,各种各 ...

  10. HBuilder使用技巧

    ctrl+ Tab  切换 ctrl + shift + D 查找所写的函数