zoukankan      html  css  js  c++  java
  • netcore 下的policy授权自定义返回结果

    目前一直在用policy做权限校验,但是好像组里需要将返回结果统一,之前用的都是直接继承AuthorizationHandler然后调用context.Fail(),但是这样会导致没办法自定义返回结果比如{code:403,msg:'未授权',data:null},

    也百度了下https://q.cnblogs.com/q/120091/ 这里也说了3.0后就改掉了之前可以通过result来返回,但是现在不行了,之后又查了下资料无果,今天心血来潮直接用httpcontext来返回结果可以了。。。。。

    直接上代码吧

        public class ApiUrlPermissionHandler : AuthorizationHandler<ApiUrlPermissionRequirement>
        {
            private readonly IHttpContextAccessor _accessor;
            private readonly ILogger<ApiUrlPermissionHandler> _logger;
            private readonly IPermissionWatchDog _permissionWatchDog;
    
            public ApiUrlPermissionHandler(IHttpContextAccessor accessor,ILogger<ApiUrlPermissionHandler> logger, IPermissionWatchDog permissionWatchDog)
            {
                this._accessor = accessor;
                this._logger = logger;
                this._permissionWatchDog = permissionWatchDog;
            }
            protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, ApiUrlPermissionRequirement requirement)
            {
                var httpContext = _accessor.HttpContext;
    
                var isAuthenticated = context.User.Identity.IsAuthenticated;
                if (isAuthenticated)
                {
                    var uid = httpContext.User.Claims.FirstOrDefault(s => s.Type == "uid")?.Value;
                    if (uid.IsNullOrWhiteSpace())
                    {
                        context.Fail();
                        return;
                    }
                    //判断是否有权限
                    var questUrl = httpContext.Request.Path.Value.ToLower();
                    if (!await _permissionWatchDog.PassApiPermAsync(uid, questUrl))
                    {
                        context.Fail();
                        return;
                    }
                    context.Succeed(requirement);
                }
                else
                {
                    httpContext.Response.ContentType =  "application/json; charset=UTF-8";
                    await httpContext.Response.WriteAsync(JsonConvert.SerializeObject(new { a="123",b="435"}));
                    await httpContext.Response.Body.FlushAsync();
                    //context.Fail();
                }
            }
        }
    

      有不对或者更好的方法希望园友提供指出谢谢

  • 相关阅读:
    Duilib 入门教程: 怎么创建一个自定义的窗口
    从屏幕右下角升起的弹窗
    最小化窗口至右下角
    MFC 使程序不在任务栏显示
    创建数据库
    sqlite入门基础(一):sqlite3_open,sqlite3_exec,slite3_close
    VC++、MFC中最好的开源项目
    在MFC中,利用GDI绘制橡皮筋效果-直线,圆,椭圆,矩形
    WCHAR char CString等常用类型互转
    CGAL 计算机几何算法库
  • 原文地址:https://www.cnblogs.com/xuejiaming/p/12799959.html
Copyright © 2011-2022 走看看