这是我的场景。我创建了一个使用集成 Windows 身份验证才能工作的应用程序。在 Application_AuthenticateRequest(), , 我用 HttpContext.Current.User.Identity 得到当前的 WindowsPrincipal 我的网站的用户。

现在这是有趣的部分。我们的一些用户最近结婚了,他们的名字也发生了变化。(IE。用户的 NT 登录名更改为 jsmithjjones),当我的应用程序对它们进行身份验证时,IIS 将其 OLD LOGIN 传递给我。我继续看 jsmith 传递到我的应用程序,直到我重新启动我的服务器!注销客户端不起作用。重新启动应用程序池不起作用。只能完全重启。

有谁知道这是怎么回事?我可以使用某种命令来刷新给我带来这个问题的任何缓存吗?我的服务器配置错误吗?

笔记:我绝对不想重新启动 IIS、我的应用程序池或计算机。由于这是一个生产盒,因此这些并不是真正可行的选择。


阿维德-

是的,他们的 UPN 及其登录名已更改。还有马克/尼克……这是生产企业服务器...不能只是重新启动它或重新启动 IIS。


跟进(为了后代):

Grhm 的回答很准确。这个问题会出现在低容量服务器中,在这些服务器中没有很多人使用您的应用程序,但会发出足够的请求来将用户的身份保留在缓存中。的关键部分是 知识库 这似乎描述了为什么缓存项在默认 10 分钟后不刷新:

缓存条目确实超时了,但是很有可能通过应用程序重复查询使现有的高速缓存条目保持生命,以最大的寿命。

我不太确定我们的代码中是什么导致了这种情况(重复出现的查询),但对我们有用的解决方案是削减 LsaLookupCacheExpireTime 值从看似令人厌恶的默认值 1 周缩短到仅仅几个小时。对于我们来说,这将用户在现实世界中受到影响的可能性基本上降至零,但同时不会导致对我们的目录服务器进行大量的 SID 名称查找。在我看来,更好的解决方案是应用程序通过 SID 查找用户信息,而不是将用户数据映射到文本登录名。(小贩们请注意!如果您在应用程序中依赖 AD 身份验证,则需要将 SID 放入身份验证数据库中!)

有帮助吗?

解决方案

我最近遇到了类似的问题,正如罗伯特麦克莱恩所说的那样回答,如果您没有以用户身份登录,AviD的组策略更改将无效。

我发现更改了 LSA Lookup Cache 大小,如MS KB946358 在不重新启动或回收任何apppool或服务的情况下工作。

我发现这是对这个类似问题的回答:更改后的身份验证错误用户的登录名

您可能希望查看以下系统调用,例如以下系统调用:

LookupAccountName()

LookupAccountSid()

LsaOpenPolicy()

您可以使用它们编写C ++ / CLI(/ Managed-C ++)应用程序来查询LSA缓存。

其他提示

问题如 阿维德 标识的是 Active Directory 缓存,您可以通过 注册表. 。根据您的解决方案,Avid 的组策略选项将失败或起作用,具体取决于您是否实际登录用户。

它的缓存方式取决于您在 IIS 上进行身份验证的方式。我怀疑这可能是 Kerberos,所以如果它是由 Kerberos 引起的,您可能需要尝试进行清除 克利斯特 使用清除选项应该清除 kerberos 票证,这将在下次尝试时强制重新验证 AD 并更新详细信息。

我还建议考虑实施 这稍微复杂一些,但不容易出错。

我知道我们过去曾在IIS中缓存过凭据问题,在谷歌搜索了几天之后,我们遇到了一个模糊的(至少对我们来说)命令,您可以使用它来查看和清除缓存的凭据。 / p>

开始 - >运行(或WinKey + R)并键入 control keymgr.dll

这解决了客户端计算机的问题。没有在服务器上尝试过,但如果服务器缓存凭据可能值得一试。我们的问题是我们获得了旧凭证,但仅限于客户机。如果用户在单独的客户端计算机上登录,一切都很好,但是如果他们在他们的办公桌上使用他们自己的机器,那么他们正常工作就有了缓存的旧凭证。

如果这不是仅更改 NT 用户名的问题,那么身份验证服务似乎确实正在缓存旧用户名。
您可以将其定义为禁用,转到本地安全设置(在管理工具中),并且根据版本/版本/配置,可能相关的设置(从内存中)是“以前登录到缓存的次数”和“执行不允许存储凭据......”。

需要考虑的其他因素:

  • 域成员资格可能会影响这一点,因为成员服务器可能会继承域设置
  • 您可能仍然需要重新启动整个服务器一次才能生效(但这样您就不必担心将来的更新)。
  • 登录性能可能会受到影响。

因此,我建议您在部署到生产环境之前先进行测试(当然)。

重新启动IIS,而不是整个机器,应该可以解决问题。

当这些用户的名字被更改时,您是否只更改了他们的NT登录名或者他们的UPN名称? UPN名称是专有名称,由Kerberos使用 - 这是IWA的默认协议;但是,如果您只是在ActiveDirectory中单击更改其名称,则只会更改NT登录名称 - 即使这是他们用于登录的内容(使用默认的Windows GINA)。在窗口下,windows会将(新)NT登录名转换为(旧)Kerberos名称。这将持续到AD被强制根据NT登录名更新Kerberos名称...

此链接从MicroSoft支持“更改IIS中用户令牌的默认时间间隔”  应该有所帮助。

使用相关的新登录名登录到运行IIS的服务器。这将刷新凭据,而无需重新启动IIS或重新启动服务器。

正如我们有一个完全相同的问题。似乎对我们有用的是进入Active Directory并执行“刷新”。在此之后,我们不得不在有此问题的Intranet站点上回收应用程序池。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top