首页 > 编程语言 >ASP.Net MVC文件访问控制

ASP.Net MVC文件访问控制

时间:2023-08-13 18:00:11浏览次数:38  
标签:ASP applicationPath HttpContext Request MVC context path Net Response

程序需求:通用的可以控制某个文件夹下所有所有文件的访问,且可后期扩展

文件根目录下增加“FileAccessControl.cs”的一般处理程序,代码如下:(文件名可以自定义)

/// <summary>
/// 用于文件是否可以访问的判断
/// </summary>
public class FileAccessControl: IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        string path = context.Request["path"].ToString();
        string pathLower = path.ToLower();
        
        string applicationPath = HttpContext.Current.Request.ApplicationPath == "/"
            ? ""
            : (HttpContext.Current.Request.ApplicationPath??"").ToLower();

        string returnUrl = applicationPath + "/";//不能访问的重定向地址
        if (path.Contains("../") || path.Contains("..\\"))
        {
            context.Response.Redirect(returnUrl);
            context.Response.Flush();
            context.Response.End();
        }
        if (pathLower.StartsWith(applicationPath + "/test/testfiles/"))
        {
            if (context.User.Identity.IsAuthenticated)
            {//登录后才能访问
                context.Response.ContentType = MimeMapping.GetMimeMapping(System.IO.Path.GetFileName(path));
                context.Response.WriteFile(path);
            }
            else
            {
                context.Response.Redirect(returnUrl);
            }
        }
        else
        {
            context.Response.Redirect(returnUrl);
        }        
    }
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

然后在Global中的“Application_BeginRequest”增加代码如下:

var context = HttpContext.Current;
string applicationPath = HttpContext.Current.Request.ApplicationPath == "/"
    ? ""
    : (HttpContext.Current.Request.ApplicationPath??"").ToLower();

//该路径不对外开放
if (context.Request.Path.ToLower().StartsWith(applicationPath + "/FileAccessControl.ashx"))
{
    context.RewritePath(applicationPath + "/");
}
if (context.Request.Path.ToLower().StartsWith(applicationPath + "/test/testfiles/"))
{
    context.RewritePath(applicationPath + "/FileAccessControl.ashx?path=" + Uri.EscapeDataString(context.Request.Path));
}

如果需要,可以在一般处理程序中控制某些角色可以访问的文件等都是可以轻松实现的。

标签:ASP,applicationPath,HttpContext,Request,MVC,context,path,Net,Response
From: https://www.cnblogs.com/itljf/p/17626920.html

相关文章

  • Netty源码学习1——NioEventLoopGroup的初始化
    系列文章目录和关于我零丶引入netty源码学习中,大家maybe都接触到如下的helloworld——netty客户端启动的demo:映入眼帘的第一个类就是NioEventLoopGroup,很多文章上来就是是Netty中的核心类,啥Channel,Pipeline,Context,Boostrap一通劈里啪啦,我看起来比较费劲。so本文不会上来就给......
  • 机器人编程教程3探索Raspberry Pi
    3探索RaspberryPi本章将涉及以下主题:探索RaspberryPi的功能选择连接什么是RaspberryPiOS?为RaspberryPiOS准备SD卡3.1探索RaspberryPi的功能控制器将决定机器人的输入和输出类型、电子设备的功率要求、可使用的传感器类型以及运行的代码。更改控制器可能意......
  • 注册中心 —— SpringCloud Netflix Eureka
    Eureka简介Eureka是一个基于REST的服务发现组件,SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务注册与发现,同时提供了负载均衡、故障转移等能力,目前Eureka2.0已经不再维护,故不推荐使用Eureka有两种角色组件:EurekaServer:服务注册中......
  • SpringMVC总结
    SpringMVC:Web层框架 @RestControll @Controller实例化对象,并添加到容器 @ResponseBody将返回结果转换为JSON格式 @RequestMapping(value="url可以定义多个",method=POST|GET)映射请求地址 value映射地址可以定义多个 method如果不写,则默认匹配所有请求方式。 @RequestPara......
  • oracle归档日志暴增原因分析,Oracle归档日志满导致数据库性能异常慢 转发 https://b
    ============= oracle数据库archivelog暴增分析====================前言归档量突然增长到981G/天,导致归档目录使用率告警归档日志量异常暴增会导致磁盘空间爆满,数据库异常1、归档日志量统计SELECTTRUNC(FIRST_TIME)"TIME",SUM(BLOCK_SIZE*BLOCKS)/1024/1024/102......
  • springmvc学习之com.fasterxml.jackson.core:jackson-databind:pom:2.15.2 failed to
    -错误的原因是我们通过坐标依赖导入的jar包没有完全下载,也就是下载了一半就停了,是个下载类型的文件而不是真正的jar包,出现这种错误的原因典型的就比如我这种情况,正在下载的时候断网了,然后这个网络链接突然中断,此时文件就是一个损坏的半成品,Maven中的代码似乎不能像迅雷那样继续下......
  • ASPICE流程编码和单元测试
    ASPICE流程编码和单元测试是指根据详细设计,编写符合ASPICE标准的代码,并对每个模块进行单元测试。这一过程包括以下步骤:编写代码:根据详细设计,编写符合ASPICE标准的代码,确保代码质量和可维护性。代码审查:对编写好的代码进行审查,发现并纠正潜在问题,确保代码质量和可靠性。单元测试计划......
  • VS2022 打开旧项目缺乏.net 4.5.1 & .net 4.5.2 依赖问题
    我操作系统是WIN10,.NET已经安装到最高4.8了。估计不给装4.5。按照网上提示,下载一个nuget包,解压后复制到系统相关位置,问题解决。1、首先从Microsoft.NETFramework.ReferenceAssemblies.net45下载一个依赖包https://www.nuget.org/packages/microsoft.netframework.referenceasse......
  • .net面试题
    第一问:C#中变量类型分为哪两种?​ 值类型和引用类型,值类型变量自身存储数据,引用类型存储的势实际数据的引用,通过引用找到实际的数据。第二问:Class和Struct的区别?​ Class为引用类型,可以被实例化,存储实际的引用;Struct为值类型,值类型自身存储数据数据。第三问:C#中类的修饰符和......
  • [MDP.Net] 平台架構
    MDP.Net將應用系統切割為:模組、隔離、平台三個分層,透過架構設計提供模組重用、參數調整、環境建置...等等面向的快速開發能力。-模組:企業的商業知識、共用的功能邏輯,在MDP.Net裡會被開發成為一個一個的「模組」,方便開發人員依照商業需求,快速組合出應用系統。-隔離:MDP.Net加......