예제 #1
0
        public async Task HandleAsync(AuthorizationHandlerContext context)
        {
            var isAuthenticated = context.User?.Identity?.IsAuthenticated;

            if (isAuthenticated == true)
            {
                // 注意:令牌失效,需返回401。默认返回403
                //if (context.Resource is AuthorizationFilterContext)
                //{
                //    var httpContext = (context.Resource as AuthorizationFilterContext).HttpContext;
                //}

                var httpContext = _httpContextAccessor?.HttpContext;
                if (httpContext == null)
                {
                    context.Fail();
                    return;
                }

                // https://stackoverflow.com/questions/51119926/jwt-authentication-usermanager-getuserasync-returns-null
                // default the value of UserIdClaimType is ClaimTypes.NameIdentifier
                var    identityId = httpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);
                string token      = httpContext.Request.Headers["Authorization"];
                if (string.IsNullOrWhiteSpace(token))
                {
                    token = httpContext.Request.Query["access_token"];
                }

                if (string.IsNullOrWhiteSpace(identityId) || string.IsNullOrWhiteSpace(token) || !int.TryParse(identityId, out int userId) || userId <= 0)
                {
                    httpContext.Response.StatusCode = StatusCodes.Status401Unauthorized;
                }
                else
                {
                    string path;
                    if (httpContext.GetEndpoint() is RouteEndpoint endpoint && endpoint != null)
                    {
                        path = endpoint.RoutePattern.RawText;
                    }
                    else
                    {
                        path = httpContext.Request?.Path.Value;
                    }

                    path = $"{httpContext.Request.Method}:/{path?.Trim().Trim('/')}";

                    // 访问期间验证令牌并自动续签
                    if (!_workContext.ValidateToken(userId, token.Substring($"{JwtBearerDefaults.AuthenticationScheme} ".Length).Trim(), out int statusCode, path))
                    {
                        if (statusCode != StatusCodes.Status403Forbidden)
                        {
                            httpContext.Response.StatusCode = StatusCodes.Status401Unauthorized;
                        }
                    }
                }