我正在尝试审核我在 Controller 上的操作事件。我想跟踪经过身份验证的用户的姓名、他的 IP 地址和调用的 Controller 操作。
我的过滤代码:
public class AuditAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext filterContext)
{
var request = filterContext.Request;
// get user name + ip address + controlleraction
base.OnActionExecuting(filterContext);
}
我在互联网上搜索只是为了查看如何为 Mvc 而不是为 HTTP 执行此操作的示例。例如,这里的链接讨论了如何审计 Mvc 的事件:http://rion.io/2013/03/03/implementing-audit-trails-using-asp-net-mvc-actionfilters/
然而,此链接讨论了如何为 HTTP 网络应用捕获 IP 地址:Capture request IP Address in Web API Authentication Filter 但我正在努力遵循它。不确定将这段代码放在哪里。
感谢您的帮助。
最佳答案
尝试使用下面的代码。
更新: 对于 asp.net web api,请试试这个
public class AuditAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var context = actionContext.RequestContext;
var user = context.Principal.Identity.IsAuthenticated ? context.Principal.Identity.Name : string.Empty;
var ip = GetClientIpAddress(actionContext.Request);
var action = actionContext.ActionDescriptor.ActionName;
var controller = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
base.OnActionExecuting(actionContext);
}
private string GetClientIpAddress(HttpRequestMessage request)
{
if (request.Properties.ContainsKey("MS_HttpContext"))
{
return IPAddress.Parse(((HttpContextBase)request.Properties["MS_HttpContext"]).Request.UserHostAddress).ToString();
}
if (request.Properties.ContainsKey("MS_OwinContext"))
{
return IPAddress.Parse(((OwinContext)request.Properties["MS_OwinContext"]).Request.RemoteIpAddress).ToString();
}
return String.Empty;
}
}
对于asp.net MVC,你可以试试这个
public class AuditAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// get user name + ip address + controlleraction
var controller = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
var action = filterContext.ActionDescriptor.ActionName;
var ip = filterContext.HttpContext.Request.UserHostAddress;
var dateTime = filterContext.HttpContext.Timestamp;
var user = GetUserName(filterContext.HttpContext);
}
private string GetUserName(HttpContext httpContext)
{
var userName = string.Empty;
var context = httpContext.Current;
if (context != null && context.User != null && context.User.Identity.IsAuthenticated)
{
userName = context.User.Identity.Name;
}
else
{
var threadPincipal = Thread.CurrentPrincipal;
if (threadPincipal != null && threadPincipal.Identity.IsAuthenticated)
{
userName = threadPincipal.Identity.Name;
}
}
return userName;
}
}
更新 2: 检索客户端 IP 地址始终是一件棘手的事情,因为需要考虑很多因素。客户如何访问应用程序?他们是通过代理服务器来的吗? IP地址可以被欺骗,所以没有100%可靠的方法。查看 Http Headers 将使您在 web api 和 mvc 方面取得一定程度的成功。但您始终必须考虑这样一个事实,即会出现客户端 IP 无效的情况。
关于c# - 如何获取经过身份验证的用户名、IP 地址和从 HTTP 过滤器调用的 Controller 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40992485/