【问题标题】:Overhead of LogonUser?LogonUser 的开销?
【发布时间】:2011-09-08 14:23:31
【问题描述】:

在阅读了大量有关验证用户的信息(在 SO 土地和互联网上)之后,很明显,验证用户的“最佳”方法(从而检测过期密码等)是调用 Win32 LogonUser(),而不是尝试在 .NET 中使用 PrincipalContext.ValidateCredentials

但是,我并不完全清楚 LogonUser 实际做了什么 - 因此它带来了哪些开销? MSDN's not entirely clear on this,我最关心的部分就在最后,它说 LogonUser 调用了 NPLoginNotify(),它的作用并不完全清楚(除了准备登录脚本),也不知道调用结果会发生什么.

我最初担心 LogonUser 加载了用户的个人资料,但一些进一步的阅读已经把这种担忧作为一个非问题(除非我在这个问题上错了,但据我所知,LogonUser 从未加载过个人资料- 这必须通过不同的函数调用显式加载)。

上下文是一个需要针对 Active Directory 进行身份验证的 Intranet Web 应用程序,因此该应用程序将有许多登录和注销:最初可能不会那么多,但将来可能会大幅增加。似乎使用 LOGIN32_LOGIN_NETWORK 类型调用 LoginUser 然后立即丢弃它给我的令牌可能是最好的前进路线。

是否有任何我不知道的开销,或者我只是过度担心?

【问题讨论】:

    标签: .net authentication active-directory


    【解决方案1】:

    MSDN 页面看起来很清晰:

    LOGON32_LOGON_NETWORK 登录类型最快,但有以下限制:

    该函数返回一个模拟令牌,而不是主令牌。您不能直接在 CreateProcessAsUser 函数中使用此令牌。但是,您可以调用 DuplicateTokenEx 函数将令牌转换为主令牌,然后在 CreateProcessAsUser 中使用。

    如果将令牌转换为主令牌并在 CreateProcessAsUser 中使用它来启动进程,则新进程无法通过重定向器访问其他网络资源,例如远程服务器或打印机。一个例外是,如果网络资源不受访问控制,那么新进程将能够访问它。

    【讨论】:

    • 嗯,这告诉我它与其他登录类型相比是最快的,但这并不能真正告诉我它在后台做了什么,当然也不能说明 NPLoginNotify 有什么影响。与将内容加载到内存中相比,速度不是问题。对于开销,您还可以阅读副作用。
    • @Chris J:这可能是真的,但如果您需要对用户进行身份验证,您实际上没有其他选择。
    猜你喜欢
    • 2010-11-03
    • 2010-12-02
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    相关资源
    最近更新 更多