首页 新闻 会员 周边 捐助

ASP.NET Core中如何对静态文件进行授权

0
悬赏园豆:30 [已解决问题] 解决于 2018-07-12 17:55

在 ASP.NET Core SPA 应用中,首先访问的是一个 index.html ,请问如何基于 ASP.NET Core 的 Authorization 机制对静态文件进行授权?

dudu的主页 dudu | 高人七级 | 园豆:29789
提问于:2018-07-10 18:23
< >
分享
最佳答案
0

不知道这样是否可行?写一个中间件,并把中间件放到 app.UseAuthentication() 和 app.UseStaticFiles() 之间。在中间件里根据url判断是否有权限,如没有权限就context.Response.Redirect到其他页面。

app.UseAuthentication();
app.UseMiddleware<MyMiddleware>();
app.UseStaticFiles();
收获园豆:30
大豆男生 | 小虾三级 |园豆:608 | 2018-07-12 11:25

赞!最终就是按照这个思路实现的

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 | 园豆:29789 (高人七级) | 2018-07-12 17:55

@dudu: Startup.POLICY_NAME 是什么呢,怎么配置的

0539 | 园豆:442 (菜鸟二级) | 2018-11-20 11:01

@多安分: 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 | 园豆:29789 (高人七级) | 2018-11-20 12:19

@dudu: 收到 谢谢

0539 | 园豆:442 (菜鸟二级) | 2018-11-20 13:55
其他回答(2)
0

恩 提供思路吧,新建一个过滤器,继承系统的IResourceFilter过滤器对指定的URL进行验证

过滤器的实现参考:https://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-4_4_3-filters.html

长沙大鹏 | 园豆:214 (菜鸟二级) | 2018-07-11 14:42

静态文件不走过滤器

支持(0) 反对(0) dudu | 园豆:29789 (高人七级) | 2018-07-12 17:47
0

非常好,解决了我的问题

runningprogrammer | 园豆:214 (菜鸟二级) | 2019-03-24 09:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册