我有一个API和一个客户端应用程序(Blazor web程序集)分别。客户机应用程序通过Azure活动目录对用户进行身份验证。在客户机中,当我通过API保存了任何文件时,我使用的是在Startup.cs上配置的静态文件,如:
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登录。
发布于 2022-05-11 21:28:58
您提到“API不保存任何用户信息”,但是无论身份验证流程如何,都必须为单个请求建立一些身份验证信息,以便评估授权。
在您所列出的示例代码中,您正在调用对HttpContext用户声明主体的检查,以查看用户是否经过身份验证,并且您提到它总是作为false返回,即使它来自您的客户端应用程序。这里值得注意的是,在执行授权之前,必须调用应用程序中的身份验证流。因为StaticFileMiddleware中没有任何固有的东西可以做到这一点,所以在请求过程中可能从未发生过这种情况。
您可以通过使用ChallengeAsync()方法来调用该身份验证流程,该方法旨在“使用默认的挑战方案来挑战当前请求。当未经身份验证的用户请求需要身份验证的端点时,可以发出身份验证挑战”:
您可能需要为特定情况自定义行为,特别是当您必须适应多个方案时,但是一般的起点是添加一个using Microsoft.AspNetCore.Authentication;以确保HttpContext扩展可用,然后在您的流程中添加相应的调用,如果用户没有身份验证的话。
一旦运行,您可以再次检查用户是否都经过身份验证,以及他们是否满足您希望拥有的安全静态文件的授权要求。
https://stackoverflow.com/questions/72202772
复制相似问题