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

基于.NET与Microsoft SQL Server的类Azure按需购功能Web应用架构选型咨询

Hey there! 针对你要构建类似Azure那种按需付费模块的.NET Web应用需求,结合你现有的.NET + SQL Server技术栈,我整理了几个落地性强的架构思路和入门步骤,应该能帮你快速上手:

1. 核心架构思路:基于RBAC扩展的权限与模块管控

首先,权限管控是核心——我们可以基于经典的RBAC(角色访问控制)模型做扩展,改成**「用户/角色 + 权限组 + 模块」**的三层结构:

  • 每个付费模块对应一组专属权限(比如「发票模块」对应「创建发票」「查看发票统计」等权限)
  • 用户购买模块后,系统将该模块的权限组绑定到用户账号或其所属角色
  • 访问模块功能时,系统校验用户是否拥有对应模块的有效权限

数据库表设计参考(SQL Server)

你可以基于ASP.NET Identity的现有表扩展,新增以下核心表:

  • Modules:存储模块信息(ID、名称、描述、价格、计费周期)
  • UserModuleSubscriptions:记录用户的订阅详情(用户ID、模块ID、订阅开始/结束日期、状态:活跃/过期/已取消)
  • ModulePermissions:关联模块与具体权限(模块ID、权限名称、权限描述)
2. 订阅与计费模块的核心实现

这部分要覆盖从模块展示到订阅生命周期管理的全流程:

  • 产品目录管理:在后台维护可购买的模块列表,支持配置价格、计费周期(月/年)、功能说明
  • 订单与支付集成:对接主流支付网关(比如Stripe、PayPal),支付成功后生成订阅记录并标记为「活跃」;注意处理支付回调的幂等性,避免重复创建订阅
  • 订阅生命周期自动化:用.NET的Hosted Service或Hangfire搭建定时任务,每天扫描过期订阅,自动将状态改为「过期」并取消对应权限
3. 功能权限校验的代码实现

在.NET Web应用中,你可以通过自定义授权过滤器来实现模块级别的权限校验:

自定义模块授权属性

public class ModuleAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    private readonly string _moduleName;

    public ModuleAuthorizeAttribute(string moduleName)
    {
        _moduleName = moduleName;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var userId = context.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
        if (string.IsNullOrEmpty(userId))
        {
            context.Result = new ChallengeResult();
            return;
        }

        // 从依赖注入获取数据库上下文
        var dbContext = context.HttpContext.RequestServices.GetRequiredService<AppDbContext>();
        var hasActiveSubscription = dbContext.UserModuleSubscriptions
            .Any(s => s.UserId == userId 
                    && s.Module.Name == _moduleName 
                    && s.Status == SubscriptionStatus.Active 
                    && s.EndDate > DateTime.UtcNow);

        if (!hasActiveSubscription)
        {
            // 可自定义跳转至购买页面,而非直接返回403
            context.Result = new RedirectToActionResult("Buy", "Subscription", new { module = _moduleName });
            return;
        }
    }
}

在控制器中使用

[ModuleAuthorize("InvoiceModule")]
public class InvoiceController : Controller
{
    public IActionResult Create()
    {
        // 仅订阅了InvoiceModule的用户可访问
        return View();
    }
}
4. 入门落地步骤
  1. 先搭数据库基础:创建上述的Modules、UserModuleSubscriptions等核心表,建立关联关系
  2. 实现权限校验逻辑:编写自定义授权过滤器,完成模块访问的权限拦截
  3. 开发订阅购买流程:做一个模块展示页面,对接支付网关,完成订阅记录的创建
  4. 添加订阅过期处理:注册Hosted Service定时任务,自动清理过期订阅
  5. 优化用户体验:在用户访问未订阅模块时,引导至购买页面,而非直接返回错误
5. 关键优化点
  • 缓存优化:将用户的订阅信息缓存到MemoryCache或Redis中,避免每次请求都查询数据库,提升性能
  • 实时权限更新:用SignalR在用户完成购买后,实时更新前端的权限状态,无需用户重新登录
  • 数据一致性:支付回调必须处理幂等性,比如用支付订单号作为唯一键,防止重复创建订阅记录

内容的提问来源于stack exchange,提问作者Edwards Moses

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:04:12