簡體   English   中英

如何通過.Net core 5.0控制對static文件的訪問 API

[英]How to control access on static files through .Net core 5.0 API

我分別有一個 API 和一個客戶端應用程序(Blazor web 程序集)。 客戶端應用程序通過 Azure 活動目錄對用戶進行身份驗證。 在客戶端中,當我通過 API 保存任何文件時,我正在使用在Startup.cs上配置的 static 文件,例如:

 app.UseStaticFiles(new StaticFileOptions()
        {
            FileProvider = new PhysicalFileProvider(Path.Combine(@"c:\", @"Resources")),
            RequestPath = new PathString("/secureFile"),
        });

問題是客戶端應用程序工作正常。 但是,如果有人檢查 Html 並獲取圖像源,他們可以通過瀏覽器直接訪問文件,如https://localhost:44397/secureFile/profile.jpg

另一方面,因為我使用的是Azure活動目錄登錄,所以API沒有保存任何用戶信息。 這就是為什么我不能使用這樣的場景:

 app.UseAuthentication();
 app.UseAuthorization();
 app.UseStaticFiles(new StaticFileOptions()
        {
            FileProvider = new PhysicalFileProvider(Path.Combine(@"c:\", @"Resources")),
            RequestPath = new PathString("/secureFile"),

            OnPrepareResponse = ctx =>
            {                   
                if (!ctx.Context.User.Identity.IsAuthenticated)
                {
                    // respond HTTP 401 Unauthorized.
                    ctx.Context.Response.StatusCode = (int) HttpStatusCode.Unauthorized;
                    ctx.Context.Response.ContentLength = 0;
                    ctx.Context.Response.Body = Stream.Null;
                    // ctx.Context.Response.Redirect("/")

                }
            }
        });

這里.ctx.Context.User.Identity.IsAuthenticated始終為假,即使客戶端應用程序正在調用。

可能客戶端應用程序正在驗證:

  services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.Audience = Configuration["AAD:ResourceId"];
                options.Authority = $"{Configuration["AAD:InstanceId"]}{Configuration["AAD:TenantId"]}";

            });

如果客戶端應用程序正在調用圖像源,我的目標是授予對https://localhost:44397/secureFile/profile.jpg的訪問權限。 但如果有人直接通過 URL 呼叫,應該阻止。

任何線索都會對我有很大幫助。 我已經關注了文章,但在我的場景中沒有用,因為我使用的是 AAD 登錄。

您提到“API 不保存任何用戶信息”,但無論身份驗證流程如何,都必須為單個請求臨時建立一些身份驗證信息,以便可以評估授權。

在您列出的示例代碼中,您正在調用對 HttpContext 用戶聲明主體的檢查以查看用戶是否經過身份驗證,並且您提到它總是返回錯誤,即使它來自您的客戶端應用程序。 這里值得注意的是,在執行授權之前,某些東西必須調用應用程序中的身份驗證流程。 因為 StaticFileMiddleware 中沒有任何內容固有地執行此操作,所以在該請求期間它可能永遠不會發生。

您可以通過使用ChallengeAsync()方法自行調用該身份驗證流程,該方法旨在“使用默認挑戰方案挑戰當前請求。當未經身份驗證的用戶請求需要身份驗證的端點時,可以發出身份驗證挑戰”:

https://learn.microsoft.com/en-us/do.net/api/microsoft.as.netcore.authentication.authenticationhttpcontextextensions.challengeasync?view=as.netcore-6.0

您可能需要針對您的特定情況自定義行為,尤其是當您必須適應多種方案時,但一般的起點是添加一個using Microsoft.AspNetCore.Authentication; 以確保 HttpContext 擴展可用,然后在用戶未通過身份驗證的情況下在您的流程中添加對await ctx.Context.ChallengeAsync()的相應調用。

運行后,您可以再次檢查用戶是否已通過身份驗證以及他們是否滿足您希望對安全 static 文件擁有的授權要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM