You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:15:03