Пример #1
0
        public async ValueTask LogAsync(Auditlog <TUserBrief> auditlog)
        {
            auditlog.Operator = await userServices.FindFirstAsync(
                u => u.Id == auditlog.Operator.Id, u => mapper.Map <TUserBrief>(u));

            await collection.InsertOneAsync(auditlog);
        }
        public void SyncFromDmz()
        {
            foreach (var auditlogEntry in _dmzAuditlogRepo.AsQueryable())
            {
                // Check if logentry with same id allready exists in masterrepo, which means it was saved earlier, but deletion from dmz failed.
                if (!_masterAuditlogRepo.AsQueryable().Where(x => x.Id == auditlogEntry.Id).Any())
                {
                    Auditlog auditlogToInsert = new Auditlog();
                    auditlogToInsert.Id   = auditlogEntry.Id;
                    auditlogToInsert.Date = auditlogEntry.Date;
                    try
                    {
                        auditlogToInsert.User = Encryptor.DecryptUser(auditlogEntry.User);
                    }
                    catch (Exception)
                    {
                        auditlogToInsert.User = auditlogEntry.User;
                    }
                    auditlogToInsert.Location         = auditlogEntry.Location;
                    auditlogToInsert.Controller       = auditlogEntry.Controller;
                    auditlogToInsert.Action           = auditlogEntry.Action;
                    auditlogToInsert.Parameters       = auditlogEntry.Parameters;
                    auditlogToInsert.WrittenToLogFile = false;

                    // Save logentry if it was not found in master repo, and delete from dmz either way.
                    _masterAuditlogRepo.Insert(auditlogToInsert);
                }
                _dmzAuditlogRepo.Delete(auditlogEntry);
            }

            try
            {
                _masterAuditlogRepo.Save();
            }
            catch (Exception e)
            {
                _logger.Error($"{ this.GetType().Name},SyncFromDmz(), Error when trying to save auditlogs from dmz to masterdatabase", e);
                _logger.LogForAdmin("Auditlogs fra DMZ serveren kunne ikke gemmes på den interne server, og ligger derfor stadig på dmz serveren");
                return; // Do not delete auditlogs from dmz, if saving in masterrepo failed.
            }

            try
            {
                _dmzAuditlogRepo.Save();
            }
            catch (Exception e)
            {
                _logger.Error($"{ this.GetType().Name},SyncFromDmz(), Error when trying to delete auditlogs from dmz", e);
                _logger.LogForAdmin("Auditlogs fra DMZ serveren kunne ikke slettes på DMZ serveren efter de er blevet gemt på den interne server");
                return;
            }

            WriteAuditRecordsToLogfile();
        }
Пример #3
0
        public async ValueTask LogAsync(Guid userId, Operation operation, OperatedObjectInfo objectInfo, LogLevel logLevel = LogLevel.Info)
        {
            await Task.Yield();

            var userBrief = await userServices.FindFirstAsync(
                u => u.Id == userId, u => mapper.Map <TUserBrief>(u));

            var log = new Auditlog <TUserBrief>()
            {
                Operator = userBrief, Operation = operation, OperatedObjectInfo = objectInfo, LogLevel = logLevel
            };
            await collection.InsertOneAsync(log);
        }
Пример #4
0
        public void AuditLog(string user, string userLocation, string controller, string action, string parameters)
        {
            Auditlog logEntry = new Auditlog
            {
                Date       = DateTime.Now.ToString(),
                User       = user ?? "not available",
                Location   = userLocation ?? "not available",
                Controller = controller ?? "not available",
                Action     = action ?? "not available",
                Parameters = parameters ?? "not available"
            };

            _auditlogRepo.Insert(logEntry);
            _uow.Save();
        }
Пример #5
0
 public async ValueTask LogErrorAsync(Exception err, HttpContext context)
 {
     try
     {
         var id   = (Guid)(err?.Data?["id"] == null ? Guid.Empty : err?.Data?["id"]);
         var type = (OperatedType)(err?.Data?["operatedtype"] == null ? OperatedType.UnKnown : err?.Data?["operatedtype"]);
         var op   = Activator.CreateInstance <TUserBrief>();
         op.Id = Guid.Parse(context.User.Identity.Name);
         var dic      = new Dictionary <string, object>();
         var extradic = err?.Data?["_infos"] as Dictionary <string, object>;
         if (extradic == null)
         {
             extradic = new Dictionary <string, object>();
         }
         foreach (var item in extradic)
         {
             dic.Add(item.Key, item.Value);
         }
         var reader = new StreamReader(context.Request.Body);
         dic.Add("inner", err.ToString());
         dic.Add("message", err.Message);
         dic.Add("path", context.Request.Path.Value);
         dic.Add("query", context.Request.QueryString.Value);
         dic.Add("method", context.Request.Method);
         dic.Add("body", await reader.ReadToEndAsync());
         reader.Dispose();
         var log = new Auditlog <TUserBrief>()
         {
             LogLevel           = LogLevel.Error,
             Operator           = op,
             Operation          = (Operation)(err?.Data?["operation"] == null ? Operation.UnKnown : err?.Data?["operation"]),
             OperatedObjectInfo = new OperatedObjectInfo(id, type, dic)
         };
         var t = LogAsync(log);
     }
     catch (Exception)
     {
         //logger本身报错可能会导致循环报错,暂时不处理
     }
 }
Пример #6
0
 public override void OnActionExecuting(ActionExecutingContext context)
 {
     try
     {
         var logEntry = new Auditlog();
         logEntry.Location   = context.HttpContext.Connection.RemoteIpAddress.ToString();
         logEntry.Action     = ((ControllerActionDescriptor)context.ActionDescriptor).ActionName;
         logEntry.Controller = ((ControllerActionDescriptor)context.ActionDescriptor).ControllerName;
         logEntry.Parameters = JsonConvert.SerializeObject(context.ActionArguments, new JsonSerializerSettings()
         {
             ContractResolver = new IgnorePropertiesResolver(new[] { "GuId", "Password" })
         });
         logEntry.Timestamp = DateTime.Now;
         _auditlogRepo.Insert(logEntry);
         _auditlogRepo.Save();
     }
     catch (Exception e)
     {
         _logger.LogError(e, "OnActionExecuting(), Auditlogging failed.");
         context.Result = new BadRequestResult();
     }
     base.OnActionExecuting(context);
 }
Пример #7
0
 public override void OnActionExecuting(ActionExecutingContext context)
 {
     try
     {
         var logEntry = new Auditlog();
         var person   = GetLoggedInPerson(context.HttpContext.User);
         logEntry.UserId     = person.Id;
         logEntry.User       = person.FullName;
         logEntry.Location   = context.HttpContext.Connection.RemoteIpAddress.ToString();
         logEntry.Action     = ((ControllerActionDescriptor)context.ActionDescriptor).ActionName;
         logEntry.Controller = ((ControllerActionDescriptor)context.ActionDescriptor).ControllerName;
         logEntry.Parameters = GetODataParameters(context);
         logEntry.Timestamp  = DateTime.Now;
         _auditlogRepo.Insert(logEntry);
         _auditlogRepo.Save();
     }
     catch (Exception e)
     {
         _logger.LogWarning(e, "OnActionExecuting(), Auditlogging failed.");
         context.Result = new BadRequestResult();
     }
     base.OnActionExecuting(context);
 }
Пример #8
0
        public MessageDto <TUserBrief> MapLogToMessage(Auditlog <TUserBrief> log)
        {
            var dto = new MessageDto <TUserBrief>();

            dto.user = log.Operator;
            switch (log.Operation)
            {
            case Operation.Create:
                break;

            case Operation.Update:
                break;

            case Operation.Delete:
                break;

            case Operation.Access:
                break;

            case Operation.Login:
                break;

            case Operation.Logout:
                break;

            case Operation.Invite:
                break;

            case Operation.Kick:
                break;

            case Operation.Praise:
                switch (log.OperatedObjectInfo.type)
                {
                case OperatedType.Article:
                {
                    var article = log.OperatedObjectInfo.Infos["article"] as ArticleLog;
                    dto.message = $"点赞了您的文章<a href=\"/readarticle/{article.ManagedId}\">{article.Title}</a>";
                }
                break;

                case OperatedType.Project:
                {
                    var project = log.OperatedObjectInfo.Infos["project"] as ProjectLog;
                    dto.message = $"赞了您的项目<a href=\"/ProjectHome/{project.Id}\">{project.Name}</a>";
                }
                break;

                case OperatedType.User:
                {
                    dto.message = "赞了您";
                }
                break;

                case OperatedType.UnKnown:
                    break;

                case OperatedType.Comment:
                {
                    var article = log.OperatedObjectInfo.Infos["article"] as ArticleLog;
                    var comment = log.OperatedObjectInfo.Infos["comment"] as CommentLog;
                    dto.message = $"赞了你在文章{article.Title}的<a href=\"/readarticle/{article.ManagedId}#{comment.Id}\">回复</a>:\n{comment.CommentMessage}";
                }
                break;

                default:
                    break;
                }
                break;

            case Operation.UnKnown:
                break;

            case Operation.Star:
                switch (log.OperatedObjectInfo.type)
                {
                case OperatedType.Article:
                {
                    var article = log.OperatedObjectInfo.Infos["article"] as ArticleLog;
                    dto.message = $"收藏了您的文章<a href=\"/readarticle/{article.ManagedId}\">{article.Title}</a>";
                }
                break;

                case OperatedType.Project:
                {
                    var project = log.OperatedObjectInfo.Infos["project"] as ProjectLog;
                    dto.message = $"收藏了您的项目<a href=\"/ProjectHome/{project.Id}\">{project.Name}</a>";
                }
                break;

                case OperatedType.UnKnown:
                    break;

                default:
                    break;
                }
                break;

            case Operation.Follow:
            {
                dto.message = "关注了你";
            }
            break;

            case Operation.Examine:
            {
                var article = log.OperatedObjectInfo.Infos["article"] as ArticleLog;
                dto.message = $"审核通过了您的文章<a href=\"/readarticle/{article.ManagedId}\">{article.Title}</a>";
            }
            break;

            case Operation.UnExamine:
            {
                var article = log.OperatedObjectInfo.Infos["article"] as ArticleLog;
                dto.message = $"您的文章<a href=\"/readarticle/{article.ManagedId}\">{article.Title}</a>需要修改后再次审核,原因:{log.OperatedObjectInfo.Infos["reason"]}";
            }
            break;

            case Operation.Comment:
            {
                var article = log.OperatedObjectInfo.Infos["article"] as ArticleLog;
                var comment = log.OperatedObjectInfo.Infos["comment"] as CommentLog;
                switch (log.OperatedObjectInfo.type)
                {
                case OperatedType.Article:
                    dto.message = $"评论了你的文章<a href=\"/readarticle/{article.ManagedId}#{comment.Id}\">{article.Title}</a>:\n{comment.CommentMessage}";
                    break;

                case OperatedType.Comment:
                    dto.message = $"回复了你在文章{article.Title}的<a href=\"/readarticle/{article.ManagedId}#{comment.Id}\">评论</a>:\n{comment.CommentMessage}";
                    break;

                default:
                    throw new _500Exception("错误的OperatedType");
                }
            }
            break;

            default:
                break;
            }
            return(dto);
        }
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            Stopwatch timer = Stopwatch.StartNew();
            // Do something before the action executes.
            var resultContext = await next();

            // next() calls the action method.
            timer.Stop();
            try
            {
                Auditlog audit = new Auditlog();

                //获取路由信息
                var ActionDescriptor = context.ActionDescriptor as Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor;
                audit.Controller = ActionDescriptor.ControllerName;
                audit.Action     = ActionDescriptor.ActionName;
                audit.Route      = context.HttpContext.Request.Path.ToString();
                audit.Parameters = JsonSerializer.Serialize(context.ActionArguments);

                audit.ClientIpAddress        = context.HttpContext.Request.Headers["X-Forwarded-For"].FirstOrDefault() ?? "";
                audit.ClientVirtualIpAddress = context.HttpContext.Connection.RemoteIpAddress.ToString();

                //太耗时,暂未解决
                //audit.Clientname = Dns.GetHostEntry(audit.Clientipaddress).HostName;
                audit.BrowserInfo = context.HttpContext.Request.Headers["User-Agent"];
                //audit.BrowserInfo = (context.HttpContext.Request.Headers).;
                audit.MethodType = IsAjax(context.HttpContext.Request) ? context.HttpContext.Request.Method : "Page";

                //获取返回结果
                if (resultContext.Exception == null)
                {
                    object data = new object();
                    if (resultContext.Result is ContentResult)
                    {
                        data = (resultContext.Result as ContentResult).Content;
                    }
                    else if (resultContext.Result is ObjectResult)
                    {
                        data = (resultContext.Result as ObjectResult).Value;
                    }
                    else if (resultContext.Result is JsonResult)
                    {
                        data = (resultContext.Result as JsonResult).Value;
                    }
                    audit.Result = JsonSerializer.Serialize(data);
                }
                else
                {
                    audit.ExceptionMessage = resultContext.Exception.Message;
                    audit.Exception        = $"异常类型:{resultContext.Exception.GetType().Name}\r\n异常消息:{resultContext.Exception.Message}\r\n堆栈信息:{resultContext.Exception.StackTrace}\r\n";
                }
                //audit.Userid = context.HttpContext.User.Identity.GetLoginUser();
                //audit.UserName = context.HttpContext.User.Identity.GetLoginUserName();
                audit.ExecutionDuration = timer.ElapsedMilliseconds;
                Ser_Auditlog.Insert(audit);
            }
            catch (Exception ex)
            {
                LogFactory logger = LogFactory.GetLogger(typeof(SampleAsyncActionFilter));
                logger.Error(ex, "审计日志记录出错:");
            }
            // resultContext.Result is set.
            // Do something after the action executes.
        }