Cir*_*iao 6 security sql-server t-sql sql-server-2012 logins
我创建了两个对应于两个 Windows 组的 SQL Server 登录名:
MachineName\MyAppAmdin
MachineName\MyAppUser
Run Code Online (Sandbox Code Playgroud)
然后在数据库中,我创建了两个具有相同名称的用户并将它们映射到登录名。
在 Windows 服务器中,我将我的域帐户添加MyDomain\MyAccount到MachineName\MyAppAmdin组中。
现在我可以通过 Windows 身份验证通过MyDomain\MyAccount.
问题是,我想确切地知道我正在使用哪个 Windows 组登录,但我不知道如何。
我试过:
ORIGINAL_LOGIN()
SYSTEM_USER
SUSER_SNAME
SELECT * FROM dm_exec_sessions
Run Code Online (Sandbox Code Playgroud)
以上所有内容都会返回MyDomain\MyAccount,但我需要知道的是我是否通过MachineName\MyAppAmdin.
总结一下,我的问题是:
有没有办法准确判断当前连接使用的是哪个 Windows 组登录(或用户)?
或者有什么方法可以检查是否MyDomain\MyAccount与特定用户或登录名相关联?
我知道我可以使用 C# 或命令来解析域帐户是否属于特定的 Windows 组,但是我们有一些新的 IT 策略,所以我正在考虑使用 TSQL 实现类似结果的方法。
Windows Authentication是token-based身份验证,您可以阅读tokens此处的访问令牌和此处的基于令牌的身份验证
基于令牌的身份验证系统背后的一般概念很简单。允许用户输入用户名和密码以获得令牌,从而允许他们获取特定资源 - 无需使用用户名和密码。
当用户登录系统时,登录服务会生成访问令牌,并且根据身份验证数据库对用户提供的凭据进行身份验证。身份验证数据库包含构建登录会话的初始令牌所需的凭据信息,包括其用户 ID、主要组 ID、其所属的所有其他组以及其他信息。该令牌附加到用户会话中创建的初始进程,并由初始进程创建的后续进程继承。
因此,当您使用Windows Authentication登录时,您需要向服务器呈现您的Windows token.
您可以使用以下代码查看属于您的所有服务器主体login token:
select *
from sys.login_token
--where principal_id > 0; -- uncomment here to see only mapped principals
Run Code Online (Sandbox Code Playgroud)
如果您想探索login token其他登录名,您应该首先模拟它:
execute as login = 'some_login';
select *
from sys.login_token
where principal_id > 0;
revert;
Run Code Online (Sandbox Code Playgroud)
当然,您应该获得IMPERSONATE许可some_login才能执行impersonate此操作。
因此,您对服务器的权限是根据构成令牌的所有主体的权限“总和”来定义的。DENY与往常一样,GRANT如果您是某个对象上两个成员之一Win groups(其中一个拥有grant另一个)的成员deny,您将被拒绝访问它。
| 归档时间: |
|
| 查看次数: |
2555 次 |
| 最近记录: |