public async Task Invoke(HttpContext context, IAuthContext userContext, IOptions <JwtOption> optionContainer)
        {
            //检查当前url是否可以匿名访问,如果可以就直接通过,不做验证了;如果不是可以匿名访问的路径,那就继续
            if (userContext.IsAllowAnonymous(context.Request.Path))
            {
                await next(context);

                return;
            }

            var option = optionContainer.Value;

            #region   设置自定义jwt 的秘钥
            if (!string.IsNullOrEmpty(option.SecurityKey))
            {
                JwtHandler.securityKey = option.SecurityKey;
            }
            #endregion

            #region 身份验证,并设置用户Ruser值

            //获取当前http头部携带的jwt(存放在头部的 Authorization中)
            var result = context.Request.Headers.TryGetValue("Authorization", out StringValues authStr);
            if (!result || string.IsNullOrEmpty(authStr.ToString()))
            {
                throw new UnauthorizedAccessException("未授权");
            }
            result = JwtHandler.Validate(authStr.ToString().Substring("Bearer ".Length).Trim(), payLoad =>
            {
                var success = true;
                //可以添加一些自定义验证,用法参照测试用例
                //验证是否包含aud 并等于 roberAudience
                success = success && payLoad["aud"]?.ToString() == option.Audience;
                if (success)
                {
                    //在获取jwt的时候把当前用户存放在payLoad的user键中
                    //如果用户信息比较多,建议放在缓存中,payLoad中存放缓存的Key值
                    //获取当前访问用户信息,把用户的基本信息放在payLoad["user"]中
                    userContext.TryInit(payLoad["user"]?.ToString());
                }
                return(success);
            });
            if (!result)
            {
                throw new UnauthorizedAccessException("未授权");
            }

            #endregion
            #region 权限验证
            if (!userContext.Authorize(context.Request.Path))
            {
                throw new UnauthorizedAccessException("未授权");
            }
            #endregion

            await next(context);
        }
Пример #2
0
        /// <summary>
        /// 常用自定义验证策略,模仿自定义中间件JwtCustomerauthorizeMiddleware的验证范围
        /// </summary>
        /// <param name="context"></param>
        /// <param name="requirement"></param>
        /// <returns></returns>
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, PolicyRequirement requirement)
        {
            var httpContext = accssor.HttpContext;

            //var httpContext = (context.Resource as AuthorizationFilterContext).HttpContext;

            #region 身份验证,并设置用户Ruser值

            var result = httpContext.Request.Headers.TryGetValue("Authorization", out StringValues authStr);
            if (!result || string.IsNullOrEmpty(authStr.ToString()))
            {
                return(Task.CompletedTask);
            }
            result = JwtHandler.Validate(authStr.ToString().Substring("Bearer ".Length).Trim(), payLoad =>
            {
                var success = true;
                //可以添加一些自定义验证,用法参照测试用例
                //验证是否包含aud 并等于 roberAudience
                success = success && payLoad["aud"]?.ToString() == jwtOption.Value.Audience;
                if (success)
                {
                    //设置Ruse值,把user信息放在payLoad中,(在获取jwt的时候把当前用户存放在payLoad的ruser键中)
                    //如果用户信息比较多,建议放在缓存中,payLoad中存放缓存的Key值
                    userContext.TryInit(payLoad["ruser"]?.ToString());
                }
                return(success);
            });
            if (!result)
            {
                return(Task.CompletedTask);
            }

            #endregion
            #region 权限验证
            if (!userContext.Authorize(httpContext.Request.Path))
            {
                return(Task.CompletedTask);
            }
            #endregion

            //context.Succeed(requirement);是验证成功,如果没有这个,就默认验证失败
            context.Succeed(requirement);
            return(Task.CompletedTask);
        }