.net Core如何對靜態文件的訪問進行鑒權操作?


之前給公司開發了一個文件管理服務,最基本的功能就是文件的上傳下載,以及更新刪除、預覽;負責公司各個子系統的相關附件的管理,所有的接口都通過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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM