情况是这样的,官网的基于策略授权:
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 使用自定义策略授权的,可以帮忙。
中间件是顺序是这样的:
一原理:.netcore3.0 启用EndpointRouting后,权限filter不再添加到ActionDescriptor ,而将权限直接作为中间件运行,同时所有filter都会添加到endpoint.Metadata。因此,文中的context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext不再成立。
二解决方法,首先如果AuthorizationHandler不需要获取路由信息,这直接删除该代码。
同时在startup中除了app.UseAuthorization();还需要在前面需要添加app.UseAuthentication();
如果确实有获取路由信息,可以注入IHttpContextAccessor后获取。
你好,你这个方法确实可以,看来是都封装到了 IHttpContextAccessor
只不过这样的话,不能使用
var filterContext = (context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext);
如果不能使用,那么就不用自定义返回类型了,希望你也能有更好的思路。
Tips:
这个 context 是这里注入的:
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement)
@老张的哲学: 您好,我现在也遇到了这个问题,请问是怎么解决的,谢谢
@老张的哲学: 报错代码就是这样子的
你可以将 var filterContext = (context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext) 改为 var routContext = (context.Resource as Microsoft.AspNetCore.Routing.RouteEndpoint);获取url地址来鉴权
谢谢回答,你说的楼上的方法可以解决,通过IHttpContextAccessor 可以实现,而且也肯定获取到了httpcontext,
但是这样是没办法自定义错误返回类型了。
比如:错误码401,您无权查看或未登录,这样的
@老张的哲学: 基础的权限验证采用的微软的 JwtBearer 权限验证组件进行的授权和鉴权,因此对于 token 信息的基础鉴权操作,只需要我们在中间件中进行配置即可。
https://www.cnblogs.com/lonelyxmas/p/10337054.html 可以看看这篇文章。
访问时,如果token不正确就是401
@老张的哲学: 我测试了一下,我是通过
var http = (context.Resource as Microsoft.AspNetCore.Routing.RouteEndpoint);
var isAuthenticated = context.User.Identity.IsAuthenticated; 来检测token是否正确。
@天空的湛蓝: 我懂你的意思,我会验证,但是想自定义返回格式
比如:你好,你不能访问,你没有权限,权限不够,拒绝访问
这样的文字描述
@老张的哲学: 在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;
}
};
个人猜测应该是在这里处理,尝试了一下,没起作用(欲哭无泪)
@天空的湛蓝: 您好,我也遇到了这个问题,刚刚看到你所说的,也验证了这个问题,现在就差最后一步,怎么返回到正确的url
@梦中梦i: 我是在api项目写的,这个时候无权限,接口肯定不会返回数据过去, context.Fail();就可以了
先留名再研究
请问,怎么解决的
using (var serviceScope = ApplicationBuilder.Instance.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
var accessor = serviceScope.ServiceProvider.GetService<IHttpContextAccessor>();
var url = accessor.HttpContext.Request.Path.Value.ToLower(); //获取到的当前页面URL
}