Blazor(服务器端)认证和静态文件



根据Microsoft的建议,我使用自定义AuthenticationStateProvider服务来处理Blazor服务器页面的身份验证/授权。

在razor组件中,我可以使用[authorization]属性或AuthorizeView/Authorized/NotAuthorized标签。

现在,我想在wwwroot文件夹外提供静态文件,但要控制用户是否经过身份验证才能提供文件。

是否有一种方法来控制对wwwroot文件夹外提供的静态文件的访问?

我发现类似于(在程序或启动):

app.UseStaticFiles(new StaticFileOptions
{    
OnPrepareResponse = (context) =>
{        
if (context.Context.Request.Path.StartsWithSegments("/MyRequestPath"))
{
context.Context.Response.Headers.Add("Cache-Control", "no-store");
if (!context.Context.User.Identity.IsAuthenticated)
{
context.Context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
context.Context.Response.ContentLength = 0;
context.Context.Response.Body = Stream.Null;
}
}
},
FileProvider = new PhysicalFileProvider("PathToMyFilesOutsidewwwroot"),
RequestPath = "/RequestPath"
});

问题在于它使用了Context.User.Identity。IsAuthenticated,也就是说,它使用HTTPContext,这在Blazor页面中不可用(这就是为什么我们必须使用AuthenticationStateProvider)。

我想坚持使用Blazor的最佳实践,而不是试图通过脚手架,javascript或其他方式规避它。

提前感谢。

最后我坚持使用app.UseStaticFiles…方法,但为了使其工作,我必须通过cookie添加身份验证(在Blazor之外)。在Blazor内部,我仍然使用AuthenticationStateProvider,所以我必须注意的唯一一件事是在用户登录时同时通过cookie和AuthenticationStateProvider进行身份验证。我认为这是有道理的,因为通过cookie进行身份验证(在进入Blazor"环境"之前)也使我有机会在仍然(通过cookie)进行身份验证的同时,将控制器或其他页面调用到razor组件。

最新更新