ASP.Net MVC文件访问控制

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

文件根目录下增加“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));
}

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

posted @ 2023-08-13 17:55  静坐仰望星空  阅读(90)  评论(0编辑  收藏  举报