Browse Source

Added HttpMethod & Url to audit log

pull/395/head
Halil ibrahim Kalkan 8 years ago
parent
commit
6492fdd158
  1. 9
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs
  2. 86
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Auditing/AspNetCoreAuditLogContributor.cs
  3. 60
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Auditing/HttpContextClientInfoProvider.cs
  4. 5
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AbpAuditingOptions.cs
  5. 6
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditLogInfo.cs
  6. 31
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/ClientInfoAuditLogContributor.cs
  7. 11
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IClientInfoProvider.cs
  8. 14
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/NullClientInfoProvider.cs

9
framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs

@ -1,5 +1,6 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Auditing;
using Volo.Abp.Auditing;
using Volo.Abp.Authorization;
using Volo.Abp.Domain;
@ -30,12 +31,14 @@ namespace Volo.Abp.AspNetCore
{
public void ConfigureServices(ServiceConfigurationContext context)
{
AddAspNetServices(context.Services);
context.Services.Configure<AbpAuditingOptions>(options =>
{
options.Contributors.Add(new AspNetCoreAuditLogContributor());
});
AddAspNetServices(context.Services);
context.Services.AddObjectAccessor<IApplicationBuilder>();
context.Services.AddConfiguration();
context.Services.AddAssemblyOf<AbpAspNetCoreModule>();
}

86
framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Auditing/AspNetCoreAuditLogContributor.cs

@ -0,0 +1,86 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.Auditing;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.AspNetCore.Auditing
{
public class AspNetCoreAuditLogContributor : AuditLogContributor, ITransientDependency
{
public ILogger<AspNetCoreAuditLogContributor> Logger { get; set; }
public AspNetCoreAuditLogContributor()
{
Logger = NullLogger<AspNetCoreAuditLogContributor>.Instance;
}
public override Task ContributeAsync(AuditLogContributionContext context)
{
var httpContext = context.ServiceProvider.GetRequiredService<IHttpContextAccessor>().HttpContext;
if (httpContext == null)
{
return Task.CompletedTask;
}
if (context.AuditInfo.HttpMethod == null)
{
context.AuditInfo.HttpMethod = httpContext.Request.Method;
}
if (context.AuditInfo.Url == null)
{
context.AuditInfo.Url = BuildUrl(httpContext);
}
if (context.AuditInfo.ClientIpAddress == null)
{
context.AuditInfo.ClientIpAddress = GetClientIpAddress(httpContext);
}
if (context.AuditInfo.BrowserInfo == null)
{
context.AuditInfo.BrowserInfo = GetBrowserInfo(httpContext);
}
//TODO: context.AuditInfo.ClientName
return Task.CompletedTask;
}
protected virtual string GetBrowserInfo(HttpContext httpContext)
{
return httpContext?.Request?.Headers?["User-Agent"];
}
protected virtual string GetClientIpAddress(HttpContext httpContext)
{
try
{
return httpContext?.Connection?.RemoteIpAddress?.ToString();
}
catch (Exception ex)
{
Logger.LogException(ex, LogLevel.Warning);
return null;
}
}
protected virtual string BuildUrl(HttpContext httpContext)
{
//TODO: Add options to include/exclude query, schema and host
var uriBuilder = new UriBuilder();
uriBuilder.Scheme = httpContext.Request.Scheme;
uriBuilder.Host = httpContext.Request.Host.Host;
uriBuilder.Path = httpContext.Request.Path.ToString();
uriBuilder.Query = httpContext.Request.QueryString.ToString();
return uriBuilder.Uri.AbsolutePath;
}
}
}

60
framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Auditing/HttpContextClientInfoProvider.cs

@ -1,60 +0,0 @@
using System;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.Auditing;
namespace Volo.Abp.AspNetCore.Auditing
{
public class HttpContextClientInfoProvider : IClientInfoProvider
{
public string BrowserInfo => GetBrowserInfo();
public string ClientIpAddress => GetClientIpAddress();
public string ComputerName => GetComputerName();
public ILogger<HttpContextClientInfoProvider> Logger { get; set; }
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly HttpContext _httpContext;
/// <summary>
/// Creates a new <see cref="HttpContextClientInfoProvider"/>.
/// </summary>
public HttpContextClientInfoProvider(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
_httpContext = httpContextAccessor.HttpContext;
Logger = NullLogger<HttpContextClientInfoProvider>.Instance;
}
protected virtual string GetBrowserInfo()
{
var httpContext = _httpContextAccessor.HttpContext ?? _httpContext;
return httpContext?.Request?.Headers?["User-Agent"];
}
protected virtual string GetClientIpAddress()
{
try
{
var httpContext = _httpContextAccessor.HttpContext ?? _httpContext;
return httpContext?.Connection?.RemoteIpAddress?.ToString();
}
catch (Exception ex)
{
Logger.LogException(ex, LogLevel.Warning);
}
return null;
}
protected virtual string GetComputerName()
{
return null; //TODO: Implement!
}
}
}

5
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AbpAuditingOptions.cs

@ -30,10 +30,7 @@ namespace Volo.Abp.Auditing
IsEnabled = true;
IsEnabledForAnonymousUsers = true;
Contributors = new List<AuditLogContributor>
{
new ClientInfoAuditLogContributor()
};
Contributors = new List<AuditLogContributor>();
IgnoredTypes = new List<Type>
{

6
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditLogInfo.cs

@ -28,6 +28,10 @@ namespace Volo.Abp.Auditing
public string BrowserInfo { get; set; }
public string HttpMethod { get; set; }
public string Url { get; set; }
public List<AuditLogActionInfo> Actions { get; set; }
public List<Exception> Exceptions { get; }
@ -50,7 +54,7 @@ namespace Volo.Abp.Auditing
{
var sb = new StringBuilder();
sb.AppendLine("AUDIT LOG:");
sb.AppendLine($"AUDIT LOG: [{HttpMethod ?? "?"}] {Url}");
sb.AppendLine($"- UserId : {UserId}");
sb.AppendLine($"- ClientIpAddress : {ClientIpAddress}");
sb.AppendLine($"- ExecutionDuration : {ExecutionDuration}");

31
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/ClientInfoAuditLogContributor.cs

@ -1,31 +0,0 @@
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
namespace Volo.Abp.Auditing
{
public class ClientInfoAuditLogContributor : AuditLogContributor
{
public override Task ContributeAsync(AuditLogContributionContext context)
{
var clientInfoProvider = context.ServiceProvider.GetRequiredService<IClientInfoProvider>();
if (context.AuditInfo.ClientIpAddress.IsNullOrEmpty())
{
context.AuditInfo.ClientIpAddress = clientInfoProvider.ClientIpAddress;
}
if (context.AuditInfo.BrowserInfo.IsNullOrEmpty())
{
context.AuditInfo.BrowserInfo = clientInfoProvider.BrowserInfo;
}
if (context.AuditInfo.ClientName.IsNullOrEmpty())
{
context.AuditInfo.ClientName = clientInfoProvider.ComputerName;
}
return Task.CompletedTask;
}
}
}

11
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IClientInfoProvider.cs

@ -1,11 +0,0 @@
namespace Volo.Abp.Auditing
{
public interface IClientInfoProvider
{
string BrowserInfo { get; }
string ClientIpAddress { get; }
string ComputerName { get; }
}
}

14
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/NullClientInfoProvider.cs

@ -1,14 +0,0 @@
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Auditing
{
[Dependency(TryRegister = true)]
public class NullClientInfoProvider : IClientInfoProvider, ISingletonDependency
{
public string BrowserInfo => null;
public string ClientIpAddress => null;
public string ComputerName => null;
}
}
Loading…
Cancel
Save