首页 新闻 会员 周边 捐助

netcore 3.0 基于策略Policy授权无效?

0
悬赏园豆:30 [已解决问题] 解决于 2019-10-15 15:24

情况是这样的,官网的基于策略授权:
https://docs.microsoft.com/zh-cn/aspnet/core/security/authorization/policies?view=aspnetcore-3.0
是无效的,

就是这里

 (context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext)?.HttpContext;

值是 null?

希望有在 netcore 3.0 使用自定义策略授权的,可以帮忙。

中间件是顺序是这样的:

老张的哲学的主页 老张的哲学 | 初学一级 | 园豆:2
提问于:2019-09-16 23:04
< >
分享
最佳答案
0

一原理:.netcore3.0 启用EndpointRouting后,权限filter不再添加到ActionDescriptor ,而将权限直接作为中间件运行,同时所有filter都会添加到endpoint.Metadata。因此,文中的context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext不再成立。

二解决方法,首先如果AuthorizationHandler不需要获取路由信息,这直接删除该代码。
同时在startup中除了app.UseAuthorization();还需要在前面需要添加app.UseAuthentication();
如果确实有获取路由信息,可以注入IHttpContextAccessor后获取。

收获园豆:25
dongfo | 菜鸟二级 |园豆:241 | 2019-10-03 13:25

你好,你这个方法确实可以,看来是都封装到了 IHttpContextAccessor
只不过这样的话,不能使用

        var filterContext = (context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext);

如果不能使用,那么就不用自定义返回类型了,希望你也能有更好的思路。

Tips:
这个 context 是这里注入的:
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement)

老张的哲学 | 园豆:2 (初学一级) | 2019-10-03 14:54

@老张的哲学: 您好,我现在也遇到了这个问题,请问是怎么解决的,谢谢

小手冰凉tel | 园豆:73 (初学一级) | 2020-01-10 10:13

@老张的哲学: 报错代码就是这样子的

小手冰凉tel | 园豆:73 (初学一级) | 2020-01-10 10:17
薛家明 | 园豆:354 (菜鸟二级) | 2020-04-29 09:37
其他回答(4)
0

你可以将 var filterContext = (context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext) 改为 var routContext = (context.Resource as Microsoft.AspNetCore.Routing.RouteEndpoint);获取url地址来鉴权

收获园豆:5
天空的湛蓝 | 园豆:193 (初学一级) | 2019-10-04 23:43

谢谢回答,你说的楼上的方法可以解决,通过IHttpContextAccessor 可以实现,而且也肯定获取到了httpcontext,

但是这样是没办法自定义错误返回类型了。

比如:错误码401,您无权查看或未登录,这样的

支持(0) 反对(0) 老张的哲学 | 园豆:2 (初学一级) | 2019-10-05 08:15

@老张的哲学: 基础的权限验证采用的微软的 JwtBearer 权限验证组件进行的授权和鉴权,因此对于 token 信息的基础鉴权操作,只需要我们在中间件中进行配置即可。

https://www.cnblogs.com/lonelyxmas/p/10337054.html 可以看看这篇文章。
访问时,如果token不正确就是401

支持(0) 反对(0) 天空的湛蓝 | 园豆:193 (初学一级) | 2019-10-07 16:21

@老张的哲学: 我测试了一下,我是通过
var http = (context.Resource as Microsoft.AspNetCore.Routing.RouteEndpoint);
var isAuthenticated = context.User.Identity.IsAuthenticated; 来检测token是否正确。

支持(1) 反对(0) 天空的湛蓝 | 园豆:193 (初学一级) | 2019-10-07 16:32

@天空的湛蓝: 我懂你的意思,我会验证,但是想自定义返回格式

比如:你好,你不能访问,你没有权限,权限不够,拒绝访问

这样的文字描述

支持(0) 反对(0) 老张的哲学 | 园豆:2 (初学一级) | 2019-10-07 16:54

@老张的哲学: 在startUp的授权注册中 有授权相关事件处理.比如

 s.Events = new JwtBearerEvents
                {
                    OnAuthenticationFailed = context =>
                    {
                        //Token expired
                        if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
                        {
                            context.Response.Headers.Add("Token-Expired", "true");
                        }
                        return Task.CompletedTask;
                    }
                };

个人猜测应该是在这里处理,尝试了一下,没起作用(欲哭无泪)

支持(0) 反对(0) 天空的湛蓝 | 园豆:193 (初学一级) | 2019-10-07 20:20

@天空的湛蓝: 您好,我也遇到了这个问题,刚刚看到你所说的,也验证了这个问题,现在就差最后一步,怎么返回到正确的url

 

支持(0) 反对(0) 小手冰凉tel | 园豆:73 (初学一级) | 2020-01-10 10:29

@梦中梦i: 我是在api项目写的,这个时候无权限,接口肯定不会返回数据过去, context.Fail();就可以了

支持(0) 反对(0) 天空的湛蓝 | 园豆:193 (初学一级) | 2020-05-17 10:23
0

先留名再研究

勇往直前(yoga) | 园豆:202 (菜鸟二级) | 2019-10-15 15:24
0

请问,怎么解决的

ZaraNet | 园豆:36 (初学一级) | 2019-12-26 17:38
0

using (var serviceScope = ApplicationBuilder.Instance.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
var accessor = serviceScope.ServiceProvider.GetService<IHttpContextAccessor>();
var url = accessor.HttpContext.Request.Path.Value.ToLower(); //获取到的当前页面URL
}

夜の魔王 | 园豆:441 (菜鸟二级) | 2020-05-12 12:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册