之前給公司開發了一個文件管理服務,最基本的功能就是文件的上傳下載,以及更新刪除、預覽;負責公司各個子系統的相關附件的管理,所有的接口都通過AOP來進行身份攔截認證了,但是在進行預覽的時候,因為采用的是生成一個全新的預覽文件,然后直接返回預覽文件的Url通過瀏覽器查看的這種模式,於是需要系統開放靜態文件的預覽功能,這個很簡單:
app.UseStaticFiles(new StaticFileOptions() { ContentTypeProvider = provider, OnPrepareResponse = ctx => { ctx.Context.Response.Headers.Append("Cache-Control", "public,max-age=600"); } }); app.UseFileServer(new FileServerOptions() { FileProvider = new PhysicalFileProvider ( Path.Combine(Directory.GetCurrentDirectory(),"wwwroot","FileFactory")), //實際目錄地址 RequestPath = new Microsoft.AspNetCore.Http.PathString("/文件中心"), //用戶訪問地址 EnableDirectoryBrowsing = true //開啟目錄瀏覽 });
在startup的Configure方法內加入上述代碼即可完成這個操作。
然后如果僅僅是這樣的話,不管那個用戶,只要知道了這個鏈接,其實就相當於獲得了整個文件服務系統的文件查看權限了,這肯定是違背數據安全性原則的,所以需要有一個中間件來對用戶的靜態文件訪問權限進行過濾。
中間件的代碼很簡單
public class AuthorizeStaticFilesMiddleware { private readonly RequestDelegate _next; public AuthorizeStaticFilesMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { if (new IdentityCheck().IdentityCheckMethod(context)) await _next(context); else await context.Response.WriteAsync("您無權查看該文件",Encoding.UTF8); } }
這里的判斷自己去實現,一般實現單點登錄的都是通過token,可以通過token的相關安全性判斷權限的合理性。
直接在startup的Configure方法里面使用中間件即可:
app.UseWhen( c => c.Request.Path.Value.Contains("文件中心"), _ => _.UseMiddleware<AuthorizeStaticFilesMiddleware>());
至此,則完成了對靜態文件的數據驗證功能。
ps:當然這里是有一些問題的,比如某個本來不需要加驗證的api也包含攔截關鍵字,那么會被直接拒掉,這種情況應該和后端開發協調,盡量避免使用這種Api。
