【问题标题】:Downscope Azure SQL Server permissions缩小 Azure SQL Server 权限
【发布时间】:2020-08-05 15:15:53
【问题描述】:

在 Azure 中的应用服务上运行时,我想使用托管服务标识对具有两组权限的 Azure SQL Server 进行身份验证。在我的服务中,我想要一个读/写 DBContext 和一个只读 DBContext。有没有办法在认证后降级访问?

我不一定有权访问具有只读副本的 AG,因此我认为我不能使用 applicationintent=readonlyEXECUTE AS 似乎只适用于存储过程或函数。

还有其他建议吗?

【问题讨论】:

  • 不确定我是否理解这个问题....在 SQL 服务器上设置 MSI 时,身份在 SQL 中管理,就像可以运行 SQL 脚本以分配用户权限的任何其他用户一样.
  • 是的,但我想将我的应用程序逻辑分离为具有读取表面 (API) 和写入表面(入站服务总线消息)。如果没有两个不同的权限级别,API 也将具有写访问权限。
  • 2 个 MSI?我建议您首先在没有 MSI 的情况下使用此功能,因为您可以在 SQL 中使用 2 个登录名/2 个用户轻松完成此操作
  • 哦,我们当然可以只使用用户名和密码,这看起来很简单。 Azure 应用服务是否能够获得两个身份?

标签: azure entity-framework-core azure-sql-database azure-web-app-service


【解决方案1】:

关于 EXECUTE AS 不能在存储的过程/函数之外工作是错误的(我发现 this 文档具有误导性,后来发现 this

因此,我最终采用了以下解决方案:

  1. 创建一个没有登录的只读用户

    CREATE USER [readonly_user] WITHOUT LOGIN
    ALTER ROLE [db_datareader] ADD MEMBER [readonly_user]
    
  2. 我创建了一个拦截器,用于查找要在连接字符串中设置的 applicationintent=readonly 标志

    public class SessionContextDbConnectionInterceptor: DbCommandInterceptor {
      /// <inheritdoc />
      public override Task<InterceptionResult<DbDataReader>> ReaderExecutingAsync(
        DbCommand command,
        CommandEventData eventData,
        InterceptionResult<DbDataReader> result,
        CancellationToken cancellationToken = new CancellationToken()) {
        if (eventData.Connection.ConnectionString.Contains("applicationintent=readonly",
                                                           StringComparison.InvariantCultureIgnoreCase)) {
          command.CommandText = $"EXECUTE AS USER = 'readonly_user';\n{command.CommandText};\nREVERT;";
        }
        return base.ReaderExecutingAsync(command, eventData, result, cancellationToken);
      }
    }
    
  3. 然后用数据库上下文注册拦截器

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(configuration.GetConnectionString("DefaultConnection"))
        .AddInterceptors(new SessionContextDbConnectionInterceptor()));
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多