前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ASP.NET MVC编程——验证、授权与安全

ASP.NET MVC编程——验证、授权与安全

作者头像
甜橙很酸
发布于 2018-03-30 02:14:07
发布于 2018-03-30 02:14:07
3.5K00
代码可运行
举报
文章被收录于专栏:DOTNETDOTNET
运行总次数:0
代码可运行

1 验证

一般采用表单验证完成登陆验证,建议结合SSL使用。为限制控制器只能执行HTTPS,使用RequireHttpsAttribute

2 授权

对账户的权限的控制可以通过在控制器或控制器操作上加AuthorizeAttribute 属性。

扩展授权过滤器

扩展授权过滤器可以定义继承自AuthorizeAttribute的类,也可以定义同时继承自FilterAttribute, IAuthorizationFilter接口的类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter
    {
        public AuthorizeAttribute(); 

        // 获取或设置有权访问控制器或操作方法的用户角色
        public string Roles { get; set; }
        
        //获取此特性的唯一标识符。
        public override object TypeId { get; }

        // 获取或设置有权访问控制器或操作方法的用户。
        public string Users { get; set; }

        //重写时,提供一个入口点用于进行自定义授权检查
        // 返回结果: 如果用户已经过授权,则为 true;否则为 false。
        // 异常:System.ArgumentNullException:httpContext 参数为 null。
        protected virtual bool AuthorizeCore(HttpContextBase httpContext);

        //处理未能授权的 HTTP 请求。
        protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext);

        //在过程请求授权时调用。
        // 异常: System.ArgumentNullException:
        //filterContext 参数为 null。
        public virtual void OnAuthorization(AuthorizationContext filterContext);
        
        // 返回结果: 对验证状态的引用。
        // 异常:System.ArgumentNullException:
        // httpContext 参数为 null。
        protected virtual HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext);
}

AuthorizeAttribute提供了三个可重新的虚方法AuthorizeCore,HandleUnauthorizedRequest,OnAuthorization,那么在执行授权动作的过程中他们是如何被调用的呢?看下源码的OnAuthorization方法,发现在这个方法中先调用AuthorizeCore,然后调用HandleUnauthorizedRequest被调用了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        public virtual void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }

            //如果子操作的缓存处于活动状态,那么就抛出异常
            if (OutputCacheAttribute.IsChildActionCacheActive(filterContext))
            {
                throw new InvalidOperationException(MvcResources.AuthorizeAttribute_CannotUseWithinChildActionCache);
            }

            //判断控制器或控制器操作是否允许匿名访问,如果可以就return
            bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true)|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true);

            if (skipAuthorization)
            {
                return;
            }

            //进行权限验证
            if (AuthorizeCore(filterContext.HttpContext))
            {
                HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
                cachePolicy.SetProxyMaxAge(new TimeSpan(0));
                cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
            }
            else
            {//处理未通过权限验证的情形
                HandleUnauthorizedRequest(filterContext);
            }
        }

当子操作缓存处于活动状态,那么抛出异常。然后检验是否可匿名访问,如果可以匿名访问就不进行验证;

综合以上分析,扩展AuthorizeAttribute要注意:

1)在子类AuthorizeCore中,调用父类的AuthorizeCore方法

base.OnAuthorization(filterContext);

2)在子类的AuthorizeCore方法中验证用户的权限。

3)通过子类的构造函数传入用户的权限值

代码示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
        private UserRole role;
        public CustomAuthorizeAttribute(UserRole role)
        {
            this.role = role;
        }
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            bool ret = false;

            //获得用户信息(从本地Session或分布式缓存中获取)
            var userInfo = ......
            if(userInfo==null)
            {
                //信息为null,一般认为登陆超时或没有登陆
            }

            if(userInfo.Role == UserRole.Org)
            {
                ret = true;
            }
            else
            {
                //提示无权限
            }

            return ret;
        }
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }

            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {//针对ajax请求进行处理
                
            }
            else
            {//非aiax进行处理
                
                //跳转到指定页面
                string strUrl = ......;
                filterContext.Result = new RedirectResult(strUrl);
            }
        }
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);
        }
    }
    public enum UserRole
    {
        Org = 1,
        Vip = 2,
        Guest = 3
}

3 安全

总的原则:

所有层或各个子系统各自负责好自己的安全。

任何用户数据和来自其他系统的数据都要经过检验。

在满足需求的情况下,尽量缩小账户的权限。

减少暴露的操作数量和操作参数。

关闭服务器不需要的功能。

4 防范攻击

4.1跨站脚本攻击(XSS)

被动注入:用户的输入含有恶意脚本,而网站又能够不加检验地接受这样的输入,进而保存到数据库中。

主动注入:用户将含有恶意脚本的内容输入到页面文本框中,然后在屏幕上显示出来。

防御方法:

1)使用Razor语法输出的内容已经被编码,可以不做任何其他处理

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<h4>@Model.Field</h4>

2)大部分的XSS攻击可通过对输入内容进行编码来阻止:Html.Encode,Html.AttributeEncode,Url.Encode

3)对Js进行编码

使用Ajax.JavaScriptStringEncode

4)将AntiXSS库作为默认的编码器(不建议使用,不灵活)

ASP.NET 4.5 集成Anti-XSS Library,可以通过配置来对整个网站的输出进行编码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<system.web>
    <httpRuntime targetFramework="4.5" encoderType="System.Web.Security.AntiXss.AntiXssEncoder,System.Web"/>
</system.web>

4.2跨站请求伪造(CSRF/XSRF)

防御方法:

1)使用Html隐藏域存储用户令牌,令牌可以存储在Session里或者cookie里

2)在视图表单中使用@Html.AntiForgeryToken(),在控制器操作上添加属性[ValidateAntiForgeryToken],注意表单一定要使用@Html.BeginForm生成

实现机制:AntiForgeryToken方法向用户浏览器cookie中写入一个加密的数据,并在表单内插入一个隐藏栏位,每次刷新页面时隐藏栏位的值都不同,每次执行控制器操作前,都会验证隐藏栏位和浏览器cookie中的值是否相同,只有相同才允许执行控制器操作。

使用限制:

  • 客户端浏览器不能禁用cookie
  • 只对post请求有效
  • 若有XSS漏洞,则可轻易获取令牌
  • 对Ajax请求不能传递令牌,即对Ajax无效

3)使用幂等的Get请求,仅使用Post请求修改数据(仅仅是一定程度上限制这种攻击而已)

4)使用动作过滤器,验证UrlReferrer

扩展的动作过滤器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CSRFFilter:AuthorizeAttribute
{
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext.HttpContext == null)
            {
                throw new HttpException("请求无效");
            }

            if (filterContext.HttpContext.Request.UrlReferrer == null)
            {
                throw new HttpException("请求无效");
            }

            if (filterContext.HttpContext.Request.UrlReferrer.Host != "sit.com")
            {
                throw new HttpException("来自非法网站");
            }
        }
}

4.3 cookie盗窃

cookie有两种形式

1)会话cookie:存储在浏览器内存中,浏览器每次请求通过Http头进行传递

2)持久性cookie:存储在硬盘上,同样通过Http头进行传递

二者的区别:会话cookie常在会话结束时失效,而持久性cookie在下一次访问站点时仍然有效。

被窃取的原因:依赖于XSS漏洞,注入一段恶意脚本就能窃取。

防御方法:

1)在web.config对cookie进行设置

<httpCookies httpOnlyCookies="true"/>,httpOnlyCookies指定为true表达仅服务器可以访问,浏览器无法访问

2)在编写代码时为每个cookie单独设置

Response.Cookies["cok"].Value = Guid.NewGuid().ToString();

Response.Cookies["cok"].HttpOnly = true;

4.4重复提交

防御方法:

1)使用bind特性,设置想要绑定的属性来,防止这种攻击。也可以设置不要绑定的字属性,但优先选择设置要绑定的属性。

例:

可以指定多个字段,用逗号分隔

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public ActionResult TestViewData([Bind(Include = "Field,Field1,Field1")]ModelF mf)
{
     ......
}

2)使用UpdateModel或TryUpdateModel

3)使用ViewModel,明确规定View使用的数据模型

4.5开放重定向

防御方法:

使用Url.IsLocalUrl检测是否为本地url

4.6 SQL注入攻击

防御方法:

通过参数注入非法获得或修改网站数据。

使用参数化查询来防止SQL注入攻击。

参考:

1.Jess Chadwick/Todd Snyder/Hrusikesh Panda,徐雷/徐扬

译。ASP.NET MVC4 Web编程

2.Jon Galloway/Phil Haack/Brad Wilson/K. Scott Allen,孙远帅/邹权译  ASP.NET MVC4 高级编程(第四版)

3.黄保翕,ASP.NET MVC4开发指南

4.蒋金楠,ASP.NET MVC4框架揭秘

5.https://www.asp.net/mvc

-----------------------------------------------------------------------------------------

转载与引用请注明出处。

时间仓促,水平有限,如有不当之处,欢迎指正。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-03-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
谷歌地球接口Google Maps APIs地图样式设计调整与JSON或URL导出
  本文介绍在谷歌地球API(Google Maps APIs)中,设计地图样式并将设计好的样式通过JSON或URL导出的方法。
疯狂学习GIS
2021/09/09
1.5K0
地图可视化的艺术:深入比较Mapbox、OpenLayers、Leaflet和Cesium,不同场景下应如何选择地图库
在现代前端开发中,地图应用变得越来越重要,特别是在数据可视化、地理信息系统和移动应用中。本文将详细比较四款流行的地图库:Mapbox、OpenLayers、Leaflet 和 Cesium,分析它们的特点、功能、开源情况、包体积、市场占有率、适宜人群与应用环境,并提供安装与基础使用代码示例。
watermelo37
2025/01/22
1.3K0
地图可视化的艺术:深入比较Mapbox、OpenLayers、Leaflet和Cesium,不同场景下应如何选择地图库
从小白到高手,Tiler库助你快速掌握Python图像处理!
Python的Tiler库是一个功能强大的工具,专门用于生成自定义地图瓦片和进行图像切片处理。无论是在地理信息系统(GIS)中还是在图像处理和计算机视觉任务中,Tiler都提供了丰富的功能和选项。
小白的大数据之旅
2025/05/16
1350
OpenStreetMap介绍与OSM数据多种下载方法对比
  本文对OpenStreetMap(OSM)网页与各类OSM数据的多种下载方式加以详细介绍,并对不同数据下载方式加以对比。OSM数据包含道路与铁路路网、建筑、水体、土地利用、兴趣点、行政区边界等各类数据,同时具有.shp、.pbf、.osm、.csv等多种类型,方便大家不同的使用需求。在这里有一点需要注意:OSM数据在国家边界数据方面非常不准确,如有相关需求,大家可以从其它网站获取对应边界数据。
疯狂学习GIS
2023/07/09
3.2K0
OpenStreetMap介绍与OSM数据多种下载方法对比
可视化分析工具大集合,让数据美如画
导读:大数据时代,得数据者得天下。巧妇难为无米炊,拥有数据却不知道如何利用,就不能体现数据的价值。而数据可视化作为处理数据的重要步骤,一直被广泛应用。冷冰冰的数据,经过可视化技术的加工,便酒曲入瓮般幻
钱塘数据
2018/03/06
2.6K0
可视化分析工具大集合,让数据美如画
【干货】数据可视化分析工具大集合
Excel Excel作为一个入门级工具,是快速分析数据的理想工具,也能创建供内部使用的数据图,但是Excel在颜色、线条和样式上课选择的范围有限,这也意味着用Excel很难制作出能符合专业出版物和网
钱塘数据
2018/03/05
2.7K0
【干货】数据可视化分析工具大集合
只会Excel怎么够?这49款数据可视化神器推荐收藏
新媒体管家 大数据时代,你还在拿Excel做的图表提交给Boss看吗?有没有想过用其他更炫酷的工具让Boss眼前一亮呢?为了让大家了解如何选择适合的数据可视化产品,小编整理了50款可以用来做数据可视化
钱塘数据
2018/03/06
3.9K0
只会Excel怎么够?这49款数据可视化神器推荐收藏
WebGIS开发框架及其特点
WebGIS(Web Geographic Information System)是基于Web技术的地理信息系统,能够通过浏览器实现地理数据的展示、分析和交互。以下是常见的WebGIS开发框架及其特点。
数字孪生开发
2024/12/31
4110
WebGIS开发框架及其特点
遥感数据、气象数据、土地土壤数据、农业数据、行政区数据...GIS数据获取网站整理
  本文对GIS行业相关的综合数据获取网站加以整理,包括但不限于遥感数据、气候数据、土地数据、土壤数据、农业数据、行政区数据、社会数据、经济数据等。数据较多,大家可以直接通过下方目录加以总览。
郭好奇同学
2021/05/28
5.2K0
遥感数据、气象数据、土地土壤数据、农业数据、行政区数据...GIS数据获取网站整理
【收藏】55 款可视化分析工具,优秀数据分析师必备!
俗话说的好:工欲善其事,必先利其器!一款好的工具可以让你事半功倍,尤其是在大数据时代,更需要强有力的工具通过使数据有意义的方式实现数据可视化,还有数据的可交互性;我们还需要跨学科的团队,而不是单个数据
CDA数据分析师
2018/02/11
2.6K0
【收藏】55 款可视化分析工具,优秀数据分析师必备!
R语言,你要怎样画地图?
不知道各位平常有没有过需要画地图的需求,有的时候需要在地图上标出特定位置的数据表现或者一些数值,然而怎么实现? 这里主要介绍下在R语言中绘制地图的个人琢磨的思路。绘制地图步骤有三: 你得需要绘制地图;(约等于废话) 你得有要绘制地图的地理信息,经纬度啊,边界啊等等; 你得利用2的数据在R中画出来。 以上步骤中,目前最关键的是2,一旦2的数据有了,在R中不就是把它们连起来嘛,这个对于R来说就是调戏它,就跟全民调戏小黄鸡一样。 R语言中绘制地图的思路也是由于2的获取方式不一样而分开的。 第一种思路:有一些R包
机器学习AI算法工程
2018/03/13
11.8K0
R语言,你要怎样画地图?
55款大数据分析神器:你还在用Excel?
来源:DataCastle数据城堡(ID:DataCastle2016)、大数据分析和人工智能(ID:datakong)
IT阅读排行榜
2019/11/12
1.3K0
55款大数据分析神器:你还在用Excel?
自动驾驶中基于车道线的高清制图方法回顾
HD Map,高清地图,在自动驾驶领域被看得很重,因为它能提供prior知识,让感知难度降低,同时让规划有的放矢。
YoungTimes
2022/04/28
1.1K0
自动驾驶中基于车道线的高清制图方法回顾
(数据科学学习手札41)folium基础内容介绍
  folium是js上著名的地理信息可视化库leaflet.js为Python提供的接口,通过它,我们可以通过在Python端编写代码操纵数据,来调用leaflet的相关功能,基于内建的osm或自行获取的osm资源和地图原件进行地理信息内容的可视化,以及制作优美的可交互地图。其语法格式类似ggplot2,是通过不断添加图层元素来定义一个Map对象,最后以几种方式将Map对象展现出来。
Feffery
2018/07/10
6.2K0
自动驾驶中基于车道线的高清制图方法回顾
HD Map,高清地图,在自动驾驶领域被看得很重,因为它能提供prior知识,让感知难度降低,同时让规划有的放矢。高清地图目前有两条路,即激光雷达扫描为主的高成本制图方法和摄像头为主的低成本制图方法。
小白学视觉
2020/06/19
1.6K0
自动驾驶中基于车道线的高清制图方法回顾
YashanDB在地理信息系统(GIS)领域的关键功能和技术优势
地理信息系统(Geographic Information System,简称GIS)是⼀种集成的计算机系统,⽤于捕获、存储、分析、管理和展⽰所有类型的地理数据。GIS的核⼼功能和原理可以从以下⼏个⽅⾯进⾏详细阐述:
用户10349277
2025/02/25
1260
【功能预告】地图可视化之兴趣点轮廓线可视化,最细颗粒度的自动化可视化地图数据包制作
只要是标准的POI搜索,就可以在高德地图上清晰地出现其轮廓线,此轮廓线就是我们接下来制作地图数据包的源材料。
Excel催化剂
2021/08/18
1.5K0
Cesium笔记(3):基本控件简介—ImageryProvider地图瓦片地图配
cesiumjs中可定制多种图层,可以使用互联网上很多地图提供商的图层数据,也可以使用自己的地图数据。Cesium支持多种标准化格式的GIS瓦片服务,可以把栅格图层绘制到地球的表面——cesiumjs的地图图层本质上是一些瓦片数据,这些图层的亮度、对比度、色相均可以动态调整。
周陆军
2020/06/06
5.5K0
谷歌开源交互式可视化 GPS 数据库(附 20+数据集)
【新智元导读】谷歌研究院官方博客(北京时间)今日更新,宣布开源与哈佛大学等高校和机构合作完成的一个交互式可视化 GPS 地球地震周期物理学数据库。不仅如此,本文后附 20+ 更多奇异有趣的数据集,万一哪天用上了呢? 谷歌希望借开源产品,打造数据数集生态 (文/Jimbo Wilson,Google Big Picture Team 软件工程师;Brendan Meade,哈佛大学地球与行星科学系教授)为了帮助研究人员更好地了解地震周期并探索相关数据,谷歌研究院发布了一种新的交互式数据可视化方法,通过相对于真
新智元
2018/03/26
2K0
谷歌开源交互式可视化 GPS 数据库(附 20+数据集)
如何使用Python和开放数据构建爱丁堡Beergardens的交互式地图
随着夏天终于到来,想知道在爱丁堡外面享用一杯美味的冷饮的好地方。因此将关于主席许可的开放数据集与一些地理编码相结合,并创建了一个在爱丁堡外部座位的交互式地图。
代码医生工作室
2019/07/05
2K0
如何使用Python和开放数据构建爱丁堡Beergardens的交互式地图
推荐阅读
相关推荐
谷歌地球接口Google Maps APIs地图样式设计调整与JSON或URL导出
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档