public Task OnAuthorizationAsync(AuthorizationFilterContext context)
        {
            _logger.LogInformation("Authorize request header");
            var correlationHeader = context.HttpContext.Request.Headers[Identifiers.CorrelationId];
            //TODO:replace the following correlation id, since it's correlating all operation from this assembly instance.
            var correlationId = _operationalUnit.InstanceId;

            if (!string.IsNullOrEmpty(correlationHeader) && Guid.TryParse(correlationHeader, out Guid paresedCorId))
            {
                correlationId = paresedCorId;
            }

            //TODO: remove bypassing authorization
            if (false && string.IsNullOrEmpty(context.HttpContext.Request.Headers["authorization"]))
            {
                var messageHeader = new MessageHeader {
                    CorrelationId = correlationId
                };

                var messageFooter = new MessageFooter
                {
                    Sender      = context.ActionDescriptor.DisplayName,
                    Environment = _operationalUnit.Environment,
                    Assembly    = _operationalUnit.Assembly,
                    FingerPrint = context.ActionDescriptor.Id,
                    Route       = JsonConvert.SerializeObject(context.RouteData.Values.ToDictionary(key => key.Key, value => value.Value?.ToString()), Defaults.JsonSerializerSettings),
                    Hint        = Enum.GetName(typeof(ResponseHint), ResponseHint.UnAuthorized)
                };
                messageHeader.GetType().GetProperties()
                .ToList().ForEach(prop =>
                {
                    context.HttpContext.Response.Headers.Add(prop.Name, new StringValues(prop.GetValue(messageHeader)?.ToString()));
                });
                messageFooter.GetType().GetProperties()
                .ToList().ForEach(prop =>
                {
                    context.HttpContext.Response.Headers.Add(prop.Name, new StringValues(prop.GetValue(messageFooter)?.ToString()));
                });

                context.Result = new ContentResult()
                {
                    StatusCode  = context.HttpContext.Response.StatusCode,
                    ContentType = Identifiers.ApplicationJson,
                    Content     = JsonConvert.SerializeObject(Enum.GetName(typeof(ResponseHint), ResponseHint.UnAuthorized), Defaults.JsonSerializerSettings)
                };
                _logger.LogInformation("Override response!");
                return(Task.CompletedTask);
            }
            return(Task.CompletedTask);
        }
Пример #2
0
        public Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
        {
            var correlationHeader = context.HttpContext.Request.Headers[Identifiers.CorrelationId];
            //TODO:replace the following correlation id, since it's correlating all operation from this assembly instance.
            var correlationId = _operationalUnit.InstanceId;

            if (!string.IsNullOrEmpty(correlationHeader) && Guid.TryParse(correlationHeader, out Guid paresedCorId))
            {
                correlationId = paresedCorId;
            }
            var messageHeader = new MessageHeader(isSucceed: context.HttpContext.Response.StatusCode == 200)
            {
                CorrelationId = correlationId
            };

            var messageFooter = new MessageFooter
            {
                Sender      = context.ActionDescriptor.DisplayName,
                Environment = _operationalUnit.Environment,
                Assembly    = _operationalUnit.Assembly,
                FingerPrint = context.ActionDescriptor.Id,
                Route       = JsonConvert.SerializeObject(context.RouteData.Values.ToDictionary(key => key.Key, value => value.Value?.ToString()), Defaults.JsonSerializerSettings),
                Hint        = Enum.GetName(typeof(ResponseHint), ResponseHint.OK)
                              //TODO: infer the hint from HTTP status code
            };

            messageHeader.GetType().GetProperties()
            .ToList().ForEach(prop =>
            {
                context.HttpContext.Response.Headers.Add(prop.Name, new StringValues(prop.GetValue(messageHeader)?.ToString()));
            });
            messageFooter.GetType().GetProperties()
            .ToList().ForEach(prop =>
            {
                context.HttpContext.Response.Headers.Add(prop.Name, new StringValues(prop.GetValue(messageFooter)?.ToString()));
            });

            context.Result = new ContentResult()
            {
                StatusCode  = context.HttpContext.Response.StatusCode,
                ContentType = Identifiers.ApplicationJson,
                Content     = JsonConvert.SerializeObject(getContentResult(context.Result), Defaults.JsonSerializerSettings)
            };
            _logger.LogInformation("Override response!");
            return(next.Invoke());

            object getContentResult(IActionResult result)
            {
                switch (result)
                {
                case ContentResult CntR:
                {
                    return(CntR?.Content);
                }

                case ObjectResult ObjR:
                {
                    return(ObjR?.Value);
                }

                case JsonResult JsonR:
                {
                    return(JsonR?.Value);
                }

                default:
                {
                    return(result);
                }
                }
            };
        }
 void OnServerMessage(object sender, MessageHeader msghdr)
 {
     Log.Debug($"OnServerMessage() type:{msghdr.GetType().Name}");
 }
Пример #4
0
        public Task OnExceptionAsync(ExceptionContext context)
        {
            _logger.LogCritical(context.Exception, context.Exception.Message);

            var correlationHeader = context.HttpContext.Request.Headers[Identifiers.CorrelationId];
            //TODO:replace the following correlation id, since it's correlating all operation from this assembly instance.
            var correlationId = _operationalUnit.InstanceId;

            if (!string.IsNullOrEmpty(correlationHeader) && Guid.TryParse(correlationHeader, out Guid paresedCorId))
            {
                correlationId = paresedCorId;
            }

            var exception = context.Exception;

            (int code, string message, ResponseHint responseHint) = (exception is CustomException ex) ? ex.CustomMessage : (exception.HResult, exception.Message, ResponseHint.SystemError);

            var messageHeader = new MessageHeader(isSucceed: false)
            {
                CorrelationId = correlationId
            };

            var messageFooter = new MessageFooter
            {
                Sender      = context.ActionDescriptor.DisplayName,
                Environment = _operationalUnit.Environment,
                Assembly    = _operationalUnit.Assembly,
                FingerPrint = context.ActionDescriptor.Id,
                Route       = JsonConvert.SerializeObject(context.RouteData.Values.ToDictionary(key => key.Key, value => value.Value?.ToString()), Defaults.JsonSerializerSettings),
                Hint        = Enum.GetName(typeof(ResponseHint), responseHint)
            };

            context.ExceptionHandled = true;
            messageHeader.GetType().GetProperties()
            .ToList().ForEach(prop =>
            {
                context.HttpContext.Response.Headers.Add(prop.Name, new StringValues(prop.GetValue(messageHeader)?.ToString()));
            });
            messageFooter.GetType().GetProperties()
            .ToList().ForEach(prop =>
            {
                context.HttpContext.Response.Headers.Add(prop.Name, new StringValues(prop.GetValue(messageFooter)?.ToString()));
            });

            context.Result = new ContentResult()
            {
                StatusCode  = StatusCodes.Status500InternalServerError,
                ContentType = Identifiers.ApplicationJson,
                Content     = JsonConvert.SerializeObject(closureGenerateErrorMessage(), Defaults.JsonSerializerSettings)
            };

            _logger.LogInformation("Override response!");
            return(Task.CompletedTask);

            object closureGenerateErrorMessage()
            {
                return(new
                {
                    //TODO: system message only should share user friendly messages for system messages, as well to not break system security.
                    code,
                    message,
                    systemMessage = exception.Message
                });
            }
        }