c# - 如何获取经过身份验证的用户名、IP 地址和从 HTTP 过滤器调用的 Controller 操作?

标签 c# asp.net-mvc action-filter

我正在尝试审核我在 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 无效的情况。

How can I get the client's IP address in ASP.NET MVC?

关于c# - 如何获取经过身份验证的用户名、IP 地址和从 HTTP 过滤器调用的 Controller 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40992485/

相关文章:

c# - 如何加密log4net日志文件

c# - 多个 MediaElement 停止工作 wp8

c# - 具有 utf-8 文件名的 Zip 文件

asp.net-mvc - Kendo UI MVC 日期选择器本地化

c# - ValidateAntiForgeryToken 过滤器不起作用

c# - 在 OnResultExecuting 中更改 filterContext.Result

C# Web 异常意外的 EOF

asp.net-mvc - 使用 Entity Framework 4.1 执行更新/插入存储过程?

asp.net-mvc-4 - 如何在 OnActionExecuted 中获取 ActionParameters

c# - 如果不使用锁定,这不应该失败吗?简单生产者消费者