Winapi SSO相当于Windows AccessCheck调用

Winapi SSO相当于Windows AccessCheck调用,winapi,single-sign-on,Winapi,Single Sign On,我们有一个作为管理帐户运行的windows应用程序,但我们需要确定登录到该应用程序的特定用户对文件和目录的访问权限 我们使用的一种解决方案是仅使用用户名生成访问掩码: BuildTrusteeWithName(&trustee, username); GetEffectiveRightsFromAcl(pSecurityInfo->pAcl, &trustee, pAccessMask); 问题是,在一些具有复杂DFS设置的客户站点上,这需要相当长的时间。我们相信查找用户

我们有一个作为管理帐户运行的windows应用程序,但我们需要确定登录到该应用程序的特定用户对文件和目录的访问权限

我们使用的一种解决方案是仅使用用户名生成访问掩码:

BuildTrusteeWithName(&trustee, username);
GetEffectiveRightsFromAcl(pSecurityInfo->pAcl, &trustee, pAccessMask);
问题是,在一些具有复杂DFS设置的客户站点上,这需要相当长的时间。我们相信查找用户组等所花费的时间

因此,我们使用的另一个解决方案是缓存用户名和密码以“模拟”用户,临时缓存“模拟”令牌的句柄:

// Here we get the handle to the 'impersonation' token
LogonUser(owner, NULL, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, pTempHandle);
DuplicateToken( *pTempHandle, DEFAULT_IMPERSONATION_LEVEL, pOwnerHandleCacheEntry->pHandle );

// This is then called for all files and directories traversed. pOwnerHandle is the handle of the 'impersonation' token obtained above.
// This means the overhead of getting the user's groups etc... is only done once.
AccessCheck(pSd, *pOwnerHandle, MAXIMUM_ALLOWED, &genericMapping, &privilegeSet, &dwPrivSetSize, &fileAccessMask, &accessStatus);
问题是,如果我们想引入单点登录,我们无法访问用户的密码。这将使一些希望将SSO用于性能不太好的系统的站点需要切换回第一个解决方案(如上所述)

因此,我的问题是:

1) 是否有一种方法可以缓存用于仅使用用户名构建访问权限的用户信息(以避免每次查找)?
2) 失败的问题1(如上所述),在SSO环境中是否存在与我们首选的解决方案等效的解决方案(例如:使用kerberos票证模拟用户)?

粗略地说,SSO等效于LogonUser。SSPI允许服务器在不需要客户端密码的情况下对客户端进行身份验证。成功验证客户机后,服务器将有权访问用户令牌,但与SSPI中的所有内容一样,如何获取用户令牌非常复杂。从那里,您可以调用AccessCheck,这应该非常快。

Sean,您能给我一些关于从哪里开始使用SSPI的建议吗。这是一个巨大的话题,虽然它可能是正确的方法,但我觉得你的答案有点简洁,可以获得200个代表奖金!:)具体来说,SSPI似乎依赖于为用户提供安全上下文,但在SSO上下文中,我们只有用户id。那么有没有一种方法可以在没有密码的情况下获得安全上下文?@DavidArno这就是我没有提供更多细节的部分原因。我不明白你的程序的结构。您说它以管理员身份运行,但也说用户登录。我必须假设您有一个服务器应用程序和一个客户端应用程序(或者客户端应用程序是浏览器?)。在SSO上下文中,身份验证仍然会发生,无论是使用密码、Kerberos票证还是其他方式。