如何使Azure门户托管的ASP.NET Core Web App仅每周固定时段可访问?
该需求完全可以实现,推荐采用ASP.NET Core自定义中间件结合Azure Database配置读取的方案实现,适配性高且对新手友好,具体实现思路如下:
实现思路
1. 核心逻辑:自定义访问控制中间件
中间件是ASP.NET Core处理请求的管道组件,所有访问请求都会先经过中间件处理,刚好适合做全局的访问时段校验,无需在每个页面单独加判断逻辑。
具体开发步骤:
- 先定义访问时段的配置实体类,和你Azure Database里的配置表结构对应,核心包含
允许访问的星期、开放开始时间、开放结束时间三个字段即可。 - 编写自定义中间件,逻辑如下:
- 每次收到请求时,先从Azure Database读取最新的允许访问时段配置(可以加10-30分钟的内存缓存,无需每次都查库,减少数据库压力)
- 获取当前请求的时间(注意要和你配置的时区统一,比如统一用北京时间的话要做时区转换,避免Azure服务器默认UTC时区和你配置的时段不匹配)
- 校验当前时间是否在允许的时段内:如果符合条件就放行请求,走后续的应用逻辑;如果不符合就返回403禁止访问,或者跳转到自定义的「非开放时段」提示页。
- 在
Program.cs里注册这个中间件,要放在路由、静态文件处理这些业务中间件的前面,保证所有请求都先经过校验。
简化的中间件代码示例:
// 访问时段配置实体类,和Azure Database表结构对应 public class AccessTimeConfig { public int Id { get; set; } // 存储星期枚举值,比如周二对应DayOfWeek.Tuesday public DayOfWeek AllowedDayOfWeek { get; set; } public TimeSpan StartTime { get; set; } public TimeSpan EndTime { get; set; } } // 自定义访问时段校验中间件 public class AccessTimeMiddleware { private readonly RequestDelegate _next; public AccessTimeMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context, AppDbContext dbContext) { // 跳过静态资源、健康检查等不需要校验的路径,可按需调整 if (context.Request.Path.StartsWithSegments("/static") || context.Request.Path.StartsWithSegments("/health")) { await _next(context); return; } // 从数据库读取最新的开放时段配置,多时段配置可自行遍历校验 var accessConfig = await dbContext.AccessTimeConfigs.FirstOrDefaultAsync(); if (accessConfig == null) { context.Response.StatusCode = 403; await context.Response.WriteAsync("未配置访问时段,暂时无法访问"); return; } // 时区转换示例:转换为北京时间(UTC+8) var chinaZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time"); var now = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, chinaZone); // 校验当前时间是否在允许范围 var isAllowed = now.DayOfWeek == accessConfig.AllowedDayOfWeek && now.TimeOfDay >= accessConfig.StartTime && now.TimeOfDay <= accessConfig.EndTime; if (isAllowed) { await _next(context); return; } // 非开放时段返回提示 context.Response.StatusCode = 403; await context.Response.WriteAsync("当前为非开放时段,仅每周二14:00-16:30允许访问"); } } // Program.cs 注册中间件,需放在所有业务中间件之前 app.UseMiddleware<AccessTimeMiddleware>();
2. Azure侧适配配置
你托管在Azure Web App上,不需要额外配置定时任务/工作流,只需要保证两点即可:
- 你的Web App已经配置好了Azure Database的连接字符串,可正常读取数据库数据
- 如果你的应用面向多时区用户使用,建议统一用UTC时间存储和校验时段配置,避免时区冲突
3. 可选增强方案(按需选用)
- 如果后续需要支持动态更新配置且不用重启应用,可以搭配Azure App Configuration服务存储时段配置,比数据库读取效率更高,还支持热更新
- 如果需要在开放/关闭时段时触发额外通知,比如给管理员发消息,可以搭配Azure Logic Apps做定时任务,到点触发通知逻辑即可,不属于核心必需功能
内容的提问来源于stack exchange,提问作者trx
相关产品推荐
相关产品推荐

