首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过.Net核心5.0API控制对静态文件的访问

如何通过.Net核心5.0API控制对静态文件的访问
EN

Stack Overflow用户
提问于 2022-05-11 14:24:11
回答 1查看 887关注 0票数 1

我有一个API和一个客户端应用程序(Blazor web程序集)分别。客户机应用程序通过Azure活动目录对用户进行身份验证。在客户机中,当我通过API保存了任何文件时,我使用的是在Startup.cs上配置的静态文件,如:

代码语言:javascript
复制
 app.UseStaticFiles(new StaticFileOptions()
        {
            FileProvider = new PhysicalFileProvider(Path.Combine(@"c:\", @"Resources")),
            RequestPath = new PathString("/secureFile"),
        });

问题是客户端应用程序工作正常。但是,如果有人检查Html并获取图像源,他们就可以像https://localhost:44397/secureFile/profile.jpg这样通过浏览器直接访问文件。

另一方面,由于我使用Azure活动目录登录,API不保存任何用户信息。所以我不能用这样的场景:

代码语言:javascript
复制
 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也始终是假的。

但可能客户端应用程序正在进行身份验证:

代码语言:javascript
复制
  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登录。

EN

回答 1

Stack Overflow用户

发布于 2022-05-11 21:28:58

您提到“API不保存任何用户信息”,但是无论身份验证流程如何,都必须为单个请求建立一些身份验证信息,以便评估授权。

在您所列出的示例代码中,您正在调用对HttpContext用户声明主体的检查,以查看用户是否经过身份验证,并且您提到它总是作为false返回,即使它来自您的客户端应用程序。这里值得注意的是,在执行授权之前,必须调用应用程序中的身份验证流。因为StaticFileMiddleware中没有任何固有的东西可以做到这一点,所以在请求过程中可能从未发生过这种情况。

您可以通过使用ChallengeAsync()方法来调用该身份验证流程,该方法旨在“使用默认的挑战方案来挑战当前请求。当未经身份验证的用户请求需要身份验证的端点时,可以发出身份验证挑战”:

https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.authentication.authenticationhttpcontextextensions.challengeasync?view=aspnetcore-6.0

您可能需要为特定情况自定义行为,特别是当您必须适应多个方案时,但是一般的起点是添加一个using Microsoft.AspNetCore.Authentication;以确保HttpContext扩展可用,然后在您的流程中添加相应的调用,如果用户没有身份验证的话。

一旦运行,您可以再次检查用户是否都经过身份验证,以及他们是否满足您希望拥有的安全静态文件的授权要求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72202772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档