问题标签 [application-role]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
115 浏览

sql-server - 连接关闭后重置 SQL 应用程序角色

我正在使用 .net 应用程序中的 sql 应用程序角色。我有一个连接丢失时发生的问题。举个例子,我有这个代码块,它打开一个连接,设置应用程序角色,从数据库中进行选择并处理我的连接。如果我第二次运行此代码,则在尝试再次设置应用角色时失败(sys.sp_setapprole 的 ExecuteNonQuery() 行)。

异常是 SqlException:当前命令发生严重错误。结果,如果有的话,应该丢弃。

我尝试使用 @fCreateCookie 参数并调用 sys.sp_unsetapprole 来重置角色,但这没有区别。

请帮忙?

0 投票
0 回答
286 浏览

sql-server - SQL Server 更改密码后无法设置应用程序角色

最初,我的应用程序可以通过命令更改应用程序角色。

在我将应用程序角色的密码更改为“PASS02”后,我发现

不起作用并返回错误的密码。

我将代码更改为后发现它有效

令我困惑的是为什么原始代码可以工作?以及密码是如何设置的?

0 投票
1 回答
319 浏览

sql-server - 在只读可用性组副本上使用 sp_setapprole 的快照隔离错误

我正在调查 SQL Server Always On 可用性组,在只读副本数据库上设置应用程序角色时遇到了问题。真正让我恼火的是这种行为,我不知道如何解释错误信息。

我所做的就是打电话

第一次尝试效果很好。在第二次和所有以下尝试中,我收到以下错误:

消息 3961,级别 16,状态 1,过程 sp_setapprole,第 44 行 [批处理开始第 25 行] 数据库“AGTest”中的快照隔离事务失败,因为该语句访问的对象自启动以来已被另一个并发事务中的 DDL 语句修改本次交易。这是不允许的,因为元数据没有版本化。如果与快照隔离混合,对元数据的并发更新可能会导致不一致。

当我在主数据库上执行相同的语句时,我可以再次在副本上设置 approle - 一次。

我测试了不同的隔离级别设置(尽管我不愿意为后来的生产数据库更改它),但没有奏效。我目前没有进一步的方法来解决这个问题,谷歌几乎没有我的信息。

0 投票
2 回答
1239 浏览

c# - 允许应用程序角色执行 DBCC CHECKDB

我的 (C#) 应用程序运行,连接到具有应用程序角色的 SQL 服务器数据库。

但是,我需要它来运行 a DBCC CHECKDB,但出现异常:

用户“MyAppRole”无权为数据库“MyDatabase”运行 DBCC checkdb。

我发现要运行此命令,我不能只授予应用程序角色执行此操作的权限,我需要成为该db_owner角色的成员。

我尝试过的事情:

1:在 SQL Management Studio 中,勾选该数据库的 MyAppRole 属性中的 db_owner 框。但是我得到了同样的例外。

2:添加db_owner角色。

但是现在当我运行应用程序时,我在执行 DBCC CHECKDB 时遇到了这个异常:

服务器主体“MYDOMAIN\MyWindowsUsername”无法在当前安全上下文下访问数据库“MyDatabase”。

这尤其令人困惑,因为在 SQL Managment Studio 中,我可以在使用 Windows 身份验证登录后轻松运行该命令。

3:创建一个以所有者身份执行的存储过程

...并给予我MyAppRole 执行许可。但我仍然得到例外:

服务器主体“MYDOMAIN\MyWindowsUsername”无法在当前安全上下文下访问数据库“MyDatabase”。

...如果我尝试从 SQL Management Studio 执行这个存储过程,我也会得到。

4:授予应用程序角色“控制”权限(其中一些似乎违背了应用程序角色的目的,但无论如何,抓住了稻草)

但这会在应用程序尝试运行检查时导致原始错误。

用户“MyAppRole”无权为数据库“MyDatabase”运行 DBCC checkdb

如何正确授予我的应用程序角色执行此检查的权限?

0 投票
2 回答
6397 浏览

sql-server - 如何将 db_owner 权限授予应用程序角色?

如何将db_owner固定数据库角色的所有权限和特权授予应用程序角色?

精简版

命令:

将是我想要的,但它失败了:

消息 15151,级别 16,状态 1,第 23 行
找不到对象“数据库名称”,因为它不存在或您没有权限。

研究工作

我正在调查使用 SQL Server Application Roles

  • 它就像一个用户(因为它有一个用户名和密码)
  • 就像一个角色

一旦连接到服务器,您的应用程序就会运行一个存储过程来“登录”自己作为应用程序:

db_owner 的权限

通常,应用程序作为db_owner固定角色成员的用户登录。该角色具有以下权限:db_owner

  • 对一切
  • 在每张桌子上
  • 每个视图
  • 每个存储过程、函数
  • 对于所有现有对象
  • 以及未来将存在的所有对象

同时:

  • 您可以将用户放入数据库角色
  • 您可以将用户置于应用程序角色中

您不能将应用程序角色放入数据库角色

那么,接下来的问题是:如何授予我的应用程序角色所有权限(即做所有事情)?

角色的权限

所以,现在是授予角色权限的时候了。按照此页面的建议

这很有趣,但它并没有授予所有特权——它只授予SELECTINSERTUPDATEDELETE. 我想授予一切——尤其是当我不知道所有特权是(或可能是)什么时。

我盲目地尝试:

以下出现在“消息”选项卡中:

ALL 权限已被弃用,仅为了兼容性而维护。它并不意味着在实体上定义的所有权限。

好的,所以授予ALL并不授予所有。这……太可怕了。

所以我回到:

除了这并不能授予一切。例如,我碰巧知道有能力继续授予他人特权(具有的特权db_owner)。所以我必须将我的声明更改为:

好的,这样更接近了,但它只适用于一张桌子。

我需要适用于所有表格的东西:

虽然,事实证明我错过了一些特权:

  • 选择✔️
  • 插入✔️
  • 更新✔️
  • 删除✔️
  • 参考文献❌</li>
  • 改变❌</li>

当然,我可以更新我的脚本:

但是,而不是这个猫捉老鼠的猜谜游戏:我想授予所有权限。

几乎所有

在上面的警告中,SQL Server 指出ALL并不授予所有权限。但他们确实记录了所有授予的内容:

控制所有权限

原来他们都被骗了。为创建另一个权限。一项统治他们的权限

  • 控制

授予受让人类似所有权的能力。被授权者实际上拥有对安全对象的所有已定义权限。已被授予 CONTROL 的主体也可以授予对安全对象的权限。由于 SQL Server 安全模型是分层的,因此特定范围内的 CONTROL 隐式包含对该范围内所有安全对象的 CONTROL。例如,对数据库的 CONTROL 意味着对数据库的所有权限、对数据库中所有程序集的所有权限、对数据库中所有架构的所有权限以及对数据库内所有架构内对象的所有权限。

他们继续枚举当您拥有CONTROL时隐含的权限:

  • 改变
  • 控制
  • 删除
  • 执行
  • 插入
  • 收到
  • 参考
  • 控制
  • 取得所有权
  • 更新
  • 查看更改跟踪
  • 查看定义

那好多了。而不必知道所有的权限,我只授予一个。我不知道哪些权限适用于哪些类型的对象,我只授予一个。因为这条线:

已被授予 CONTROL 的主体也可以授予对安全对象的权限。

我不必GRANT WITH GRANT

对所有对象

我的问题是我需要为数据库中的每个对象授予 CONTROL 权限。并且无论何时添加任何新对象,我都必须确保返回并将其添加到应用程序角色中。

我需要的是微软暗示的东西:

例如,对数据库的 CONTROL 意味着对数据库的所有权限、对数据库中所有程序集的所有权限、对数据库中所有架构的所有权限以及对数据库内所有架构内对象的所有权限。

CONTROL重申一下,如果您授予数据库,那么您将拥有所有权限:

  • 在数据库上
    • 所有对象
    • 数据库中的所有程序集
    • 所有模式

就是我想要的。我想将数据库GRANT CONTROL权限授予应用程序角色:Grobber[Contoso.exe]

我可能几乎解决了我的问题,只是停在 1 码线。

或者,我可能不在附近。所以我问:

如何将 db_owner 权限授予另一个角色?

编辑:警告:不要使用应用程序角色 - 它会破坏一切

当您的客户端登录到应用程序角色时,该身份是该连接的持久属性。并且使用连接池(在 ADO.net、ADO 和 ODBC 中是首选和默认选项),即使在您关闭连接之后,连接也会长时间保持打开状态。

当您的应用程序(即网络服务器)尝试打开一个新连接时,它会从连接池中获取一个。SqlConnection所做的第一件事是尝试将连接状态重置为默认值(使用sp_reset_connection)。

尝试做的一件事是撤销您是应用角色用户sp_reset_connection的事实。这是不允许的(因为服务器不知道你以前是谁)。因此,通过使用应用程序角色,当您尝试连接到服务器时会突然出错。

“修复”它的唯一方法是禁用连接池。

这是你不想做的事情。

因此解决方案是不在生产环境中使用应用程序角色。

0 投票
2 回答
418 浏览

c# - 在 C# Windows 应用程序中使用 Azure AD 和获取应用角色

我需要在客户端对用户进行身份验证并将令牌传递给服务器端应用程序。服务器端应用程序解析令牌并根据角色返回结果。所以我们创建了 C# windows 应用程序作为客户端和 Java 应用程序作为服务器端。

我正在尝试使用以下https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-v2-windows-desktop示例在客户端进行身份验证并传递获取授权令牌。但我没有将应用角色分配给用户。

我已经通过应用程序注册在 Azure Active Directory 中注册了应用程序,并在清单文件中添加了应用程序角色。

当我收到授权令牌时,我拥有所有详细信息,但角色并没有作为令牌的一部分出现。你能指导我吗,因为我对 Azure 活动目录的了解非常有限

0 投票
1 回答
44 浏览

sql - 使用触发器和应用程序角色插入另一个数据库

我目前在 SQL Server 2019 数据库服务器上实现触发器时遇到问题。

我在 DB_A 数据库的表 A1 中有一个触发器,当数据插入 DB_A 数据库的表 A1 时,它应该插入到 DB_B 数据库的表 B1 中。

两个数据库都在同一个实例上。

当我使用直接对两个数据库具有权限的用户插入数据时,此触发器工作正常。

问题是连接到此数据库的应用程序使用应用程序角色来阻止用户对表进行直接请求,并且当触发器尝试插入远程表时,我收到以下错误:

消息 916,级别 14,状态 2,过程 XXX,第 6 行 [批处理开始行 1]
服务器主体“XXXX”无法在当前安全上下文下访问数据库“XXX”。

DB1 数据库具有仅对该数据库具有权限的应用程序角色,我知道应用程序角色仅在数据库级别具有范围,我也知道我无法将应用程序角色映射到其他数据库,但我该如何解决这个同一个实例的数据库之间的访问问题?