Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NETMVC中,有没有办法实现用户操作的审核跟踪_C#_Asp.net_.net_Asp.net Mvc - Fatal编程技术网

C# 在.NETMVC中,有没有办法实现用户操作的审核跟踪

C# 在.NETMVC中,有没有办法实现用户操作的审核跟踪,c#,asp.net,.net,asp.net-mvc,C#,Asp.net,.net,Asp.net Mvc,我是.NETMVC的新手。我使用Ado.NETCRUD操作设计了一个web应用程序,没有实体框架。我在互联网上搜索了如何在.NETMVC应用程序上实现审计跟踪,但我得到了在EF应用程序上实现审计跟踪的结果。有人能提供任何资源参考或示例吗?提前谢谢你们 我需要捕获用户访问的页面以及在该页面上执行的操作 您可以实现一个HttpModule,它记录.NETMVC应用程序中所有访问的页面 使用HttpModule,您可以访问所有请求/响应属性,包括头、cookie、FormData参数 namespac

我是.NETMVC的新手。我使用Ado.NETCRUD操作设计了一个web应用程序,没有实体框架。我在互联网上搜索了如何在.NETMVC应用程序上实现审计跟踪,但我得到了在EF应用程序上实现审计跟踪的结果。有人能提供任何资源参考或示例吗?提前谢谢你们

我需要捕获用户访问的页面以及在该页面上执行的操作

您可以实现一个HttpModule,它记录.NETMVC应用程序中所有访问的页面

使用HttpModule,您可以访问所有请求/响应属性,包括头、cookie、FormData参数

namespace MyApplication
{
    public class DatabaseAuditHttpModule : IHttpModule
    {
        private class Properties
        {
            public string Url { get; set; }
            public string HttpMethod { get; set; }
            public int StatusCode { get; set; }
            
            // add other important HTTP properties
        }
        
        public void Init(HttpApplication context)
        {
            context.BeginRequest += BeginRequest;
            context.EndRequest += EndRequest;
        }

        private void BeginRequest(object sender, EventArgs e)
        {
            HttpContext ctx = HttpContext.Current;
            var request = ctx.Request;

            var requestHeaders = request.Unvalidated.Headers;
            var requestFormData = request.Unvalidated.Form;

            var properties = new Properties
            {
                Url = request.Url.ToString(),
                HttpMethod = request.HttpMethod
            };

            ctx.Items["X-Properties"] = properties;
        }


        private void EndRequest(object sender, EventArgs e)
        {
            HttpContext ctx = HttpContext.Current;

            // get the properties for the current HTTP request
            Properties properties = (Properties)HttpContext.Current.Items["X-Properties"];

            properties.StatusCode = ctx.Response.StatusCode;
            
            // TODO:
            // log these values in the database
        }

        public void Dispose()
        {

        }
    }
}
在Global.asax中注册HttpModule:

记录存储过程执行示例:

public class DatabaseService
{
    public static async Task ExecuteStoredProcedureAsync(string connectionString, string storedProcedureName, ILogger logger)
    {
        logger.LogTrace($"'{storedProcedureName}' Stored Procedure executing");
        long totalDuration = 0;

        Stopwatch sw = new Stopwatch();
        sw.Start();

        using(var connection = new SqlConnection(connectionString))
        {
            connection.Open();
            
            sw.Stop();
            totalDuration += sw.ElapsedMilliseconds;

            logger.LogTrace($"connection.Open() Duration:{sw.ElapsedMilliseconds}");

            sw.Restart();
            
            using (var command = SqlCommand(storedProcedureName, connection))
            {
                command.CommandType = CommandType.StoredProcedure;

                using (var reader = await command.ExecuteReaderAsync())
                {
                    sw.Stop();
                    totalDuration += sw.ElapsedMilliseconds;

                    logger.LogTrace($"'{storedProcedureName}' Stored Procedure ExecuteReader Duration:{sw.ElapsedMilliseconds}");

                    sw.Restart();

                    do
                    {
                        while (await reader.ReadAsync())
                        {
                            // read the data
                        }

                    } while (await reader.NextResultAsync());
                }

                sw.Stop();
                totalDuration += sw.ElapsedMilliseconds;

                logger.LogTrace($"'{storedProcedureName}' Stored Procedure executed. Duration:{totalDuration}");

                return result;
            }
        }
    }
}
我需要捕获用户访问的页面以及在该页面上执行的操作

您可以实现一个HttpModule,它记录.NETMVC应用程序中所有访问的页面

使用HttpModule,您可以访问所有请求/响应属性,包括头、cookie、FormData参数

namespace MyApplication
{
    public class DatabaseAuditHttpModule : IHttpModule
    {
        private class Properties
        {
            public string Url { get; set; }
            public string HttpMethod { get; set; }
            public int StatusCode { get; set; }
            
            // add other important HTTP properties
        }
        
        public void Init(HttpApplication context)
        {
            context.BeginRequest += BeginRequest;
            context.EndRequest += EndRequest;
        }

        private void BeginRequest(object sender, EventArgs e)
        {
            HttpContext ctx = HttpContext.Current;
            var request = ctx.Request;

            var requestHeaders = request.Unvalidated.Headers;
            var requestFormData = request.Unvalidated.Form;

            var properties = new Properties
            {
                Url = request.Url.ToString(),
                HttpMethod = request.HttpMethod
            };

            ctx.Items["X-Properties"] = properties;
        }


        private void EndRequest(object sender, EventArgs e)
        {
            HttpContext ctx = HttpContext.Current;

            // get the properties for the current HTTP request
            Properties properties = (Properties)HttpContext.Current.Items["X-Properties"];

            properties.StatusCode = ctx.Response.StatusCode;
            
            // TODO:
            // log these values in the database
        }

        public void Dispose()
        {

        }
    }
}
在Global.asax中注册HttpModule:

记录存储过程执行示例:

public class DatabaseService
{
    public static async Task ExecuteStoredProcedureAsync(string connectionString, string storedProcedureName, ILogger logger)
    {
        logger.LogTrace($"'{storedProcedureName}' Stored Procedure executing");
        long totalDuration = 0;

        Stopwatch sw = new Stopwatch();
        sw.Start();

        using(var connection = new SqlConnection(connectionString))
        {
            connection.Open();
            
            sw.Stop();
            totalDuration += sw.ElapsedMilliseconds;

            logger.LogTrace($"connection.Open() Duration:{sw.ElapsedMilliseconds}");

            sw.Restart();
            
            using (var command = SqlCommand(storedProcedureName, connection))
            {
                command.CommandType = CommandType.StoredProcedure;

                using (var reader = await command.ExecuteReaderAsync())
                {
                    sw.Stop();
                    totalDuration += sw.ElapsedMilliseconds;

                    logger.LogTrace($"'{storedProcedureName}' Stored Procedure ExecuteReader Duration:{sw.ElapsedMilliseconds}");

                    sw.Restart();

                    do
                    {
                        while (await reader.ReadAsync())
                        {
                            // read the data
                        }

                    } while (await reader.NextResultAsync());
                }

                sw.Stop();
                totalDuration += sw.ElapsedMilliseconds;

                logger.LogTrace($"'{storedProcedureName}' Stored Procedure executed. Duration:{totalDuration}");

                return result;
            }
        }
    }
}

如果您使用的是MS SQL,则可以查看更改数据捕获,也可以使用触发器跟踪更改

不过,这必须在SQL server级别上完成

我建议更改数据捕获。您可以访问对表所做的更改,还可以包括历史数据更改

SQL Server 2019 15.x提供了两个跟踪数据库中数据更改的功能:更改数据捕获和更改跟踪。这些特性使应用程序能够确定对数据库中的用户表进行的DML更改插入、更新和删除操作。可以在同一数据库上启用变更数据捕获和变更跟踪;不需要特别考虑。有关支持更改数据捕获和更改跟踪的SQL Server版本,请参阅SQL Server 2016版本支持的功能。SQL数据库支持更改跟踪。更改数据捕获仅在SQL Server和Azure SQL托管实例中受支持

更改数据捕获 更改数据捕获通过捕获DML更改的事实和更改的实际数据,为用户表提供历史更改信息。通过使用异步进程捕获更改,该进程读取事务日志,对系统的影响较小

看看如何使用触发器

正如您可能知道的,数据库中的触发器是在事件发生时执行的简单程序。我们将利用这个概念,在插入、更新或删除表中的记录时执行触发器。如果您有一个非常大的数据库,您可以控制在哪些列或表上安装触发器。这样就可以更好地控制其他内置技术,以便在SQL Server中实现更改跟踪


如果您使用的是MS SQL,则可以查看更改数据捕获,也可以使用触发器跟踪更改

不过,这必须在SQL server级别上完成

我建议更改数据捕获。您可以访问对表所做的更改,还可以包括历史数据更改

SQL Server 2019 15.x提供了两个跟踪数据库中数据更改的功能:更改数据捕获和更改跟踪。这些特性使应用程序能够确定对数据库中的用户表进行的DML更改插入、更新和删除操作。可以在同一数据库上启用变更数据捕获和变更跟踪;不需要特别考虑。有关支持更改数据捕获和更改跟踪的SQL Server版本,请参阅SQL Server 2016版本支持的功能。SQL数据库支持更改跟踪。更改数据捕获仅在SQL Server和Azure SQL托管实例中受支持

更改数据捕获 更改数据捕获通过捕获DML更改的事实和更改的实际数据,为用户表提供历史更改信息。通过使用异步进程捕获更改,该进程读取事务日志,对系统的影响较小

看看如何使用触发器

正如您可能知道的,数据库中的触发器是在事件发生时执行的简单程序。我们将利用这个概念,在插入、更新或删除表中的记录时执行触发器。如果您有一个非常大的数据库,您可以控制在哪些列或表上安装触发器。这样就可以更好地控制其他内置技术,以便在SQL Server中实现更改跟踪


建立你自己的?一个非常简单的版本是一个审计表,您可以在其中记录哪些用户在某个给定时间编辑了哪些实体,哪些实体被编辑了

值发生了变化。如果您有CRUD存储库,他们可以将这些信息推送到审核表。@trashr0x感谢您的回答,您可以用一个简单的示例或参考来解释捕获用户访问的页面和执行的操作。我同意你的观点,我们可以使用数据库触发器来记录对数据库表的任何更改。但是我需要捕获用户访问的页面以及在该页面上执行的操作。例如,如果用户编辑了一条记录,我需要捕获记录的旧值和新值record@KattaOmkareshwar这个问题还不清楚,因为跟踪网站用户的问题与ADO.NET或EF关系不大。网站几十年来一直在跟踪用户。最简单的审计跟踪由web服务器的日志提供。每个动作都映射到一个不同的URL,因此日志分析器可以很好地模拟用户在应用程序中的移动方式。其他工具,如App Insights,则会注入跟踪脚本,使它们甚至可以跟踪脚本操作。这就是他们如何向您显示用户在应用程序中的路径。您在审计跟踪中需要哪些信息?例如,您可能需要执行所有sql语句,或者需要对表行进行更改,或者可能需要有关http请求的所有信息。请具体一点。建立你自己的?一个非常简单的版本是一个审计表,您可以在其中记录哪个用户在某个给定时间编辑了哪个实体,以及哪些值发生了更改。如果您有CRUD存储库,他们可以将这些信息推送到审核表。@trashr0x感谢您的回答,您可以用一个简单的示例或参考来解释捕获用户访问的页面和执行的操作。我同意你的观点,我们可以使用数据库触发器来记录对数据库表的任何更改。但是我需要捕获用户访问的页面以及在该页面上执行的操作。例如,如果用户编辑了一条记录,我需要捕获记录的旧值和新值record@KattaOmkareshwar这个问题还不清楚,因为跟踪网站用户的问题与ADO.NET或EF关系不大。网站几十年来一直在跟踪用户。最简单的审计跟踪由web服务器的日志提供。每个动作都映射到一个不同的URL,因此日志分析器可以很好地模拟用户在应用程序中的移动方式。其他工具,如App Insights,则会注入跟踪脚本,使它们甚至可以跟踪脚本操作。这就是他们如何向您显示用户在应用程序中的路径。您在审计跟踪中需要哪些信息?例如,您可能需要执行所有sql语句,或者需要对表行进行更改,或者可能需要有关http请求的所有信息。请具体说明。需要将ado.net调用SDML的审核日志捕获到数据库存储过程吗?在这种情况下,我建议您使用内置SDK,它可以帮助您记录所有这些详细信息。您可以查看一下-这是我为监视.NET应用程序而构建的SDK。免责声明:我是KissLog的开发者。任何审核ado.net存储过程XML和DML查询的示例代码都将非常有用。请检查更新的答案。这是使用记录器跟踪存储过程执行的基本示例。要跟踪实际的数据库更改,必须从数据库级别执行。这无法从.NET应用程序内部实现。检查是否需要将ado.net调用SDML的审核日志捕获到数据库存储过程?在这种情况下,我建议您使用内置SDK,它可以帮助您记录所有这些详细信息。您可以查看一下-这是我为监视.NET应用程序而构建的SDK。免责声明:我是KissLog的开发者。任何审核ado.net存储过程XML和DML查询的示例代码都将非常有用。请检查更新的答案。这是使用记录器跟踪存储过程执行的基本示例。要跟踪实际的数据库更改,必须从数据库级别执行。这无法从.NET应用程序内部实现。检查你好,欢迎访问SO!请阅读,并添加链接是伟大的。但最好是展示他们是如何解决这个问题的。谢谢@TomerShetah会查看链接并将其保存在mindHello中,欢迎访问SO!请阅读,并添加链接是伟大的。但最好是展示他们是如何解决这个问题的。谢谢@TomerShetah会查看链接并记住它