asp.net core 控制静态文件的授权
静态文件访问在网站中是一项重要的服务,用于向前端提供可以直接访问的文件,如js,css,文档等,方法是在Startup的Configure中添加UseStaticFiles()管道。
但是,如果我想让我的文档也经过授权才能访问,而不是随便一个请求就能下载,要怎么做呢?
先说一下我的环境,认证服务用的是identityserver4。访问api通过在HttpHeader中添加bearer token传递认证信息。
我想到的方法有两个:
1)首先就是把访问的文件通过API的方式返回给前端,这样就能在API加上[Authorize]标签来控制文件的访问。大概就像下面的代码
[Authorize]
public IActionResult BannerImage()
{
var file = Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles", "images", "banner1.svg");
return PhysicalFile(file, "image/svg+xml");
}
这样子会有两个问题,首先是我的项目中token信息都是存在localStore中,然后在访问api时添加到HttpHeader中,如果在浏览器里直接键入访问路径或者通过a标签打开链接的话,请求会被拒绝掉。那怎么办呢?我考虑的解决方法是把token放在cookie中,这样服务器就能通过
cookie取到token信息了,这也是asp.net core默认的方式。这个方法我没试过,算是经验之谈吧。
还有一个问题是我面试时被面试官问的,大意就是这样子的话程序就得先读取文件流再返回给前端,这样当请求数多的时候程序的内存压力不就大了么?这问题我一时没法回答,因为我觉得有点道理。但是我转念想就算把压力转移给IIS,IIS也是一样要读取文件的吧,不知道IIS有没
有针对静态文件访问做过优化。等有空再测一下这两个的性能差别。
2) 第二个方法是我现在用的,可以解决浏览器键入或者a标签访问的问题,也用不到cookie。简单说思路就是把token信息放到请求链接中,然后在后台处理token信息,把授权与认证管道放到访问静态文件目录之前。
以下是代码,假设我的要访问的静态目录是 "Storage"。
首先,处理链接中的token信息:
//在Startup中配置服务,这里只列出关键代码
services.AddAuthentication(options=> {
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var path = context.HttpContext.Request.Path;
if (!string.IsNullOrEmpty(path) &&
(path.StartsWithSegments("/Storage")))
{
var accessToken = context.Request.Query["access_token"];
context.Token = accessToken; //把token信息设置到上下文中
}
return Task.CompletedTask;
}
};
});
在Configure中配置管道
app.UseAuthentication();
app.UseAuthorization(); app.UseMiddleware<AuthorizeStaticFilesMiddleware>();
app.UseFileServer(new FileServerOptions //注意静态文件要写在授权和认真管道后面
{
RequestPath = "/storage",
FileProvider = new PhysicalFileProvider("your direcotry path"),
});
编写授权判断的管道文件
public class AuthorizeStaticFilesMiddleware
{
RequestDelegate _next;
public AuthorizeStaticFilesMiddleware(RequestDelegate next )
{
this._next = next;
}
public async Task Invoke(HttpContext context)
{
if (context.Request.Path.StartsWithSegments("/storage"))
{
if (context.User.Identity.IsAuthenticated) //判断用户是否认真
{
await this._next(context);
}
else
{
await context.ForbidAsync();
}
}
else
{
await this._next(context);
}
}
}
以上,就是静态文件的授权方式啦。
asp.net core 控制静态文件的授权的更多相关文章
- 基于 Vue.js 之 iView UI 框架非工程化实践记要 使用 Newtonsoft.Json 操作 JSON 字符串 基于.net core实现项目自动编译、并生成nuget包 webpack + vue 在dev和production模式下的小小区别 这样入门asp.net core 之 静态文件 这样入门asp.net core,如何
基于 Vue.js 之 iView UI 框架非工程化实践记要 像我们平日里做惯了 Java 或者 .NET 这种后端程序员,对于前端的认识还常常停留在 jQuery 时代,包括其插件在需要时就引 ...
- 这样入门asp.net core 之 静态文件
本文章主要说明asp.net core中静态资源处理方案: 一.静态文件服务 首先明确contentRoot和webroot这两个概念 contentRoot:web的项目文件夹,其中包含webroo ...
- ASP.NET Core使用静态文件、目录游览与MIME类型管理
前言 今天我们来了解了解ASP.NET Core中的静态文件的处理方式. 以前我们寄宿在IIS中的时候,很多静态文件的过滤 和相关的安全措施 都已经帮我们处理好了. ASP.NET Core则不同,因 ...
- 利用ASP .NET Core的静态文件原理实现远程访问Nlog日志内容及解决遇到的坑
最近项目上试运行发现,很多时候网站出了问题或者某个功能不正常,常常需要运维人员去服务器里面查看一下日志,看看日志里面会产生什么异常,这样导致每次都要去远程服务器很不方便,有时服务器是客户保管的不能让我 ...
- IIS6中ASP.NET实现对静态文件的授权控制
后台使用html+ashx+js开发 在VS2008调试并未发现问题 发布到IIS6才发现不需要验证也能访问html文件 解决这个问题配置IIS即可了 方法如下: IIS配置:网站->属性-&g ...
- asp.net core 之静态文件目录的操作
文章前言 之前写了一篇关于模拟登录的文章,自我感觉内容不太丰富,今天的这篇文章,希望在内容上能丰富些.本人缺少写文章的经验,技术上也是新手,但我会努力的,希望大家多多支持小弟. asp.net cor ...
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
C#编译器优化那点事 使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的.优化代码 ...
- 使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)——第1部分
原文:使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)--第1部分 原文链接:https://www.codeproject.com/Articles/5160941/ASP- ...
- asp.net core配置下载文件
asp.net core的wwwroot文件夹下默认时保存静态文件的地方,外面可以直接访问,但是如果是一些无法识别的后缀文件,如(.apk),会报错404 如果想要实现下载这些文件,在配置静态文件中间 ...
随机推荐
- 操作RDS文档说明
操作RDS文档,让你对阿里云的知识更加了解.
- SAP Marketing Cloud里的contact main facet是什么意思
界面如下: Basically, contact data for SAP Hybris Marketing can be loaded from various sources, such as a ...
- 【Hibernate】一级缓存
一.概述 二.证明Hibernate的一级缓存的存在 三.一级缓存中快照区 四.管理一级缓存 五.Hibernate一级缓存的刷出时机 六.操作持久化对象的方法 一.概述 什么是缓存: 缓存将数据库/ ...
- 【leetcode】339. Nested List Weight Sum
原题 Given a nested list of integers, return the sum of all integers in the list weighted by their dep ...
- CA、证书及openssl用法
CA和证书 摘要:涉及到网络安全这一块,想必大家都听过CA吧.像百度.淘宝.京东等这些知名网站,每年都要花费一笔money来买CA证书.但其实简单的企业内的CA认证,我们自己就可以实现,今天我就讲解一 ...
- 13 Windows编程——系统内置窗口子类型之静态子窗口
静态子窗口类型 wndclass:static 源码 #include<Windows.h> #include<Windowsx.h> HINSTANCE G_h; LRESU ...
- idou老师教你学Istio 19 : Istio 流量治理功能原理与实战
一.负载均衡算法原理与实战 负载均衡算法(load balancing algorithm),定义了几种基本的流量分发方式,在Istio中一共有4种标准负载均衡算法. •Round_Robin: 轮询 ...
- Python借助argv和input()制作命令行工具
命令行执行.py文件并传递参数 代码示例如下,将参数解包 from sys import argv import requests import json import time script, us ...
- python----四种内置数据结构(dict、list、tuple、set)
1.dict 无序,可更改 2.tuple 有序,不可更改 3.list 有序,可更改(增加,删除) 4.set 无序,可能改 {元素1,元素2,元素3.....}和字典一样都是用大括号定义,不过不同 ...
- Vue 组件的通信
vue不得不了解的就是组件间的数据通信(暂且不谈vuex插件). 通信方式根据组件之间的关系有不同之处. 组件关系有下面三种:父-->子.子-->父.非父子 1.父-->子 父向子传 ...