欢迎光临
我们一直在努力

c# 网站登录次数统计

在C#中实现网站登录次数统计,通常需要结合数据库来存储和查询登录信息,以下是使用ASP.NET MVC和Entity Framework Core的示例:

创建数据库模型

创建一个名为UserLoginStats的数据库表来存储登录信息,这个表可以包含以下字段:

字段名 数据类型 描述
Id int 主键,自增
UserId string 用户ID
LoginTime DateTime 登录时间

2. 配置Entity Framework Core

在ASP.NET MVC项目中,安装Entity Framework Core包,并配置数据库连接字符串,在appsettings.json文件中添加数据库连接字符串:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\mssqllocaldb;Database=YourDatabaseName;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Startup.cs中配置DbContext:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        // 其他服务配置...
    }
    // 其他配置方法...
}

创建实体类和DbContext

创建与UserLoginStats表对应的实体类:

public class UserLoginStat
{
    public int Id { get; set; }
    public string UserId { get; set; }
    public DateTime LoginTime { get; set; }
}

创建ApplicationDbContext类:

public class ApplicationDbContext : DbContext
{
    public DbSet<UserLoginStat> UserLoginStats { get; set; }
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {
    }
}

实现登录逻辑并记录登录次数

在登录控制器中,当用户成功登录时,向UserLoginStats表中插入一条记录:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(string username, string password, string returnUrl = null)
{
    var user = await _userManager.FindByNameAsync(username);
    if (user != null && await _userManager.CheckPasswordAsync(user, password))
    {
        // 登录成功,记录登录信息
        _context.UserLoginStats.Add(new UserLoginStat { UserId = user.Id, LoginTime = DateTime.Now });
        await _context.SaveChangesAsync();
        // 执行登录后的其他操作...
    }
    else
    {
        // 登录失败的处理...
    }
    return View();
}

查询登录次数统计

可以通过编写LINQ查询来获取用户的登录次数统计信息,获取某个用户在特定时间段内的登录次数:

public async Task<int> GetLoginCount(string userId, DateTime startTime, DateTime endTime)
{
    return await _context.UserLoginStats
        .Where(ul => ul.UserId == userId && ul.LoginTime >= startTime && ul.LoginTime <= endTime)
        .CountAsync();
}

前端展示登录次数统计

在前端页面中,通过调用后端提供的API接口来获取登录次数统计信息,并将其展示给用户,可以使用图表库(如Chart.js)来更直观地展示统计数据。

优化和扩展

性能优化:对于大量数据的查询和统计,可以考虑使用索引、缓存等技术来提高性能。

功能扩展:可以进一步扩展功能,如按日期、设备类型等维度进行登录次数统计,或者生成登录报告等。

安全性考虑:确保数据库的安全性,防止SQL注入等攻击,对敏感信息(如密码)进行加密存储。

FAQs

Q1: 如果需要统计所有用户的总登录次数,应该如何修改代码?

A1: 要统计所有用户的总登录次数,可以在查询方法中去掉UserId的条件限制,如下所示:

public async Task<int> GetTotalLoginCount()
{
    return await _context.UserLoginStats.CountAsync();
}

这样就能获取到所有用户的总登录次数,如果还需要按照不同的时间段或其他条件进行统计,可以在上述基础上添加相应的条件过滤。

Q2: 如何防止恶意用户频繁登录导致数据库压力过大?

A2: 为了防止恶意用户频繁登录导致数据库压力过大,可以采取以下措施:

验证码验证:在登录页面添加验证码功能,要求用户输入正确的验证码才能登录,这样可以有效防止自动化工具的恶意登录尝试。

登录频率限制:设置登录频率限制,例如在一定时间内(如5分钟)允许每个用户最多登录N次(如3次),如果超过限制次数,则提示用户稍后再试或采取其他限制措施(如锁定账号一段时间),可以通过在客户端或服务器端记录用户的登录尝试次数来实现。

分布式缓存:使用分布式缓存(如Redis)来缓存用户的登录信息,减少对数据库的直接访问压力,当用户登录时,先检查缓存中是否存在该用户的登录记录,如果存在且未超过限制次数,则允许登录;如果超过限制次数,则返回相应的提示信息,定期清理缓存中的过期记录。

赞(0) 打赏
未经允许不得转载:九八云安全 » c# 网站登录次数统计

评论 抢沙发