在 ASP.NET Core SPA 应用中,首先访问的是一个 index.html ,请问如何基于 ASP.NET Core 的 Authorization 机制对静态文件进行授权?
不知道这样是否可行?写一个中间件,并把中间件放到 app.UseAuthentication() 和 app.UseStaticFiles() 之间。在中间件里根据url判断是否有权限,如没有权限就context.Response.Redirect到其他页面。
app.UseAuthentication(); app.UseMiddleware<MyMiddleware>(); app.UseStaticFiles();
赞!最终就是按照这个思路实现的
Startup.Configure() 中的代码:
app.UseDefaultFiles();
app.UseCnblogsCookieAuthentication();
app.UseWhen(
c => c.Request.Path.Value == "/index.html",
_ => _.UseMiddleware<AuthorizeStaticFilesMiddleware>());
app.UseStaticFiles();
AuthorizeStaticFilesMiddleware 的实现代码:
public class AuthorizeStaticFilesMiddleware
{
private readonly RequestDelegate _next;
public AuthorizeStaticFilesMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context, IAuthorizationService authorService)
{
if(!context.User.Identity.IsAuthenticated)
{
await context.ChallengeAsync();
return;
}
var result = await authorService.AuthorizeAsync(context.User, Startup.POLICY_NAME);
if (!result.Succeeded)
{
await context.ForbidAsync();
}
else
{
await _next(context);
}
}
}
@dudu: Startup.POLICY_NAME 是什么呢,怎么配置的
@多安分: Startup 中对应的代码如下
public class Startup {
public const string POLICY_NAME = "xxx";
public void ConfigureServices (IServiceCollection services) {
services.AddAuthorization (options => {
options.AddPolicy (POLICY_NAME, policy => {
policy.RequireAuthenticatedUser ().RequireRole (ROLE_NAME);
});
});
}
}
@dudu: 收到 谢谢
恩 提供思路吧,新建一个过滤器,继承系统的IResourceFilter过滤器对指定的URL进行验证
过滤器的实现参考:https://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-4_4_3-filters.html
静态文件不走过滤器
非常好,解决了我的问题