如何记录对 asp.net-core identity based application 的访问

How to log the visits on asp.net-core identity based application

我正在使用 Entity Framework 核心和 ASP.NET 核心身份,我想记录谁访问了 cars/details 页面。 log table 只有三列(visitidusernamevisittime)。

I am using Entity Framework Core & ASP.NET Core Identity and I want to log who visited the cars/details page. log table only have three columns (visitid, username, visittime).

我想你已经创建了一个包含三列(visitidusernamevisittime)的 LogModel,并且你已经生成了相关的 table 在数据库中。如果日志table没有创建,可以参考下面代码创建模型,然后add migration and update database to generate the table.

public class LogModel
{
    public int VisitId { get; set; }
    public string VisitName { get; set; }
    public DateTime VisitTime { get; set; }
}

然后,在controller details action方法中,可以新建一个LogModel,当用户访问这个action方法时,会把新的LogModel实例插入到数据库中。代码如下:

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;
    private readonly MvcMovieContext context;
    public HomeController(ILogger<HomeController> logger, MvcMovieContext movieContext)
    {
        _logger = logger;
        context = movieContext;
    }

    public IActionResult Details()
    { 
        //create a new log record.
        var newlog = new LogModel()
        {
            VisitId = 101, //set the value, or set this column as auto increase (Identity).
            VisitName = User.Identity.Name,  //get the current user name through the User.
            VisitTime = DateTime.Now
        };

        context.Logs.Add(newlog); //insert into the database 
        context.SaveChanges();  //save change.

        return RedirectToAction("Index");
    }

编辑:

使用Action Filter方法将当前用户信息记录到数据库中,可以先获取当前用户信息,然后在Action Filter中获取请求的action方法名,然后再向数据库中插入记录。

代码如下:

   public class TestActionFilter:IActionFilter
    {
        private readonly ApplicationDbContext _dbcontext;

        public TestActionFilter(ApplicationDbContext context)
        {
            _dbcontext = context;
        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
            //get current user name 
            var currentuser = context.HttpContext.User.Identity.Name; 
            //get the request action method, 
            var actionname = context.HttpContext.Request.RouteValues["action"];
            //based on the action method to insert record into database.
            //use _dbcontext to insert data.
            // Do something before the action executes.
            Console.WriteLine("TestActionExecuting:  " + context.HttpContext.Request.Path);
        }

        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Do something after the action executes.
            Console.WriteLine("TestActionExecuted:  " + context.HttpContext.Request.Path);
        }
    }

然后,在Startup.cs文件

的ConfigureServices方法中注册动作过滤器
        services.AddControllersWithViews(options=> {
            options.Filters.Add(typeof(TestActionFilter));
        });

更多关于ActionFilter的详细信息,参见:Filters in ASP.NET Core