通過 windows 身份驗證登錄時如何判斷我使用了哪個 windows 組登錄
我創建了兩個對應於兩個 Windows 組的 SQL Server 登錄名:
MachineName\MyAppAmdin MachineName\MyAppUser
然後在數據庫中,我創建了兩個具有相同名稱的使用者並將它們映射到登錄名。
在 windows 伺服器中,我將我的域帳戶添加
MyDomain\MyAccount
到MachineName\MyAppAmdin
組中。現在我可以通過
MyDomain\MyAccount
.問題是,我想確切地知道我正在使用哪個 Windows 組登錄,但我不知道如何。
我試過:
ORIGINAL_LOGIN() SYSTEM_USER SUSER_SNAME SELECT * FROM dm_exec_sessions
以上所有返回
MyDomain\MyAccount
,但我需要知道的是我是否通過組成員身份登錄MachineName\MyAppAmdin
。總結一下,我的問題是:
有沒有辦法準確判斷目前連接正在使用哪個 Windows 組登錄(或使用者)?
或者有什麼方法可以檢查是否
MyDomain\MyAccount
與特定使用者或登錄相關聯?我知道如果域帳戶屬於特定的 Windows 組,我可以使用 C# 或命令來解析,但是我們有一些新的 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
如果你想探索
login token
另一個登錄,你應該首先模擬它:execute as login = 'some_login'; select * from sys.login_token where principal_id > 0; revert;
當然,您應該獲得
IMPERSONATE
許可some_login
才能使用impersonate
它。因此,您對伺服器的權限是根據構成您的令牌的所有主體的權限的“總和”定義的。
DENY
一如既往地具有優先權,GRANT
因此,如果您是某個對像上的兩個Win groups
wichgrant
和另一個的成員deny
,您將被拒絕訪問它。