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); }
/// <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); }