这是我的情景。我创建了一个使用集成Windows身份验证的应用程序。在Application_AuthenticateRequest()
中,我使用HttpContext.Current.User.Identity
来获取我网站用户的当前WindowsPrincipal
。
现在这是有趣的部分。我们的一些用户最近结婚了,他们的名字也发生了变化。 (即用户的NT登录名从jsmith
更改为jjones
),当我的应用程序对其进行身份验证时,IIS会将其OLD LOGIN传递给我。我继续看到jsmith
传递给我的应用程序,直到我重启我的服务器!注销客户端不起作用。重新启动应用程序池不起作用。只有完全重启。
有谁知道这里发生了什么?是否有某种命令我可以用来刷新任何缓存给我这个问题?我的服务器配置错误了吗?
注意:我绝对不想重新启动IIS,我的应用程序池或计算机。由于这是一个生产箱,这些并不是真正可行的选择。
AviD -
是的,他们的UPN和他们的登录名一起被更改了。而Mark / Nick ......这是一个生产企业服务器...它不能只是重新启动或重新启动IIS。
跟进(后代):
Grhm的回答很明显。在您没有很多人使用您的应用程序的低容量服务器中会弹出此问题,但会有足够的请求将用户的身份保留在缓存中。 KB的关键部分似乎描述了默认情况下10分钟后缓存项未刷新的原因:
缓存条目会超时,但重复出现的可能性很大 应用程序的查询使现有的缓存条目保持活动状态 缓存条目的最长生命周期。
我不确定我们的代码中是什么造成了这种情况(定期查询),但对我们有效的解决方案是将LsaLookupCacheExpireTime
值从看似淫秽的默认值1周减少到只有几个小时。对我们而言,这可以将用户在现实世界中受到影响的概率降低到基本为零,但同时不会对我们的目录服务器造成极端数量的SID-Name查找。如果应用程序通过SID查找用户信息而不是将用户数据映射到文本登录名,则IMO将是更好的解决方案。 (请注意,供应商!如果您在应用程序中依赖AD身份验证,则需要将SID放入身份验证数据库中!)
答案 0 :(得分:25)
我最近遇到过类似的问题,正如Robert MacLean的answer所述,如果您没有以用户身份登录,AviD的群组政策更改将无效。
我发现更改了 LSA Lookup Cache 大小,如MS KB946358所述,无需重启或回收任何apppool或服务。
我发现这是对这个类似问题的回答:Wrong authentication after changing user's logon name。
您可能希望查看以下系统调用,例如以下系统调用:
LookupAccountName()
LookupAccountSid()
LsaOpenPolicy()
您可以使用它们编写C ++ / CLI(/ Managed-C ++)应用程序来查询LSA缓存。
答案 1 :(得分:4)
标识为AviD的问题是您可以通过registry控制的Active Directory缓存。根据您的解决方案,Avid的组策略选项将失败或工作,具体取决于您是否实际登录用户。
如何缓存它取决于您在IIS上进行身份验证的方式。我怀疑它可能是Kerberos所以要清除如果它是由Kerberos引起的,你可能想尝试使用清除选项klist来清除kerberos票据,这会在下一次尝试时强制引用AD更新细节。
我还建议考虑实施this,这稍微复杂一些,但更不容易出错。
答案 2 :(得分:4)
我知道我们过去也在IIS中缓存了凭据问题,在谷歌搜索了几天后,我们遇到了一个模糊的(至少对我们来说)命令,您可以使用它来查看和清除缓存的凭据。 / p>
开始 - >运行(或WinKey + R)并键入 control keymgr.dll
这解决了客户端计算机的问题。没有在服务器上尝试过,但如果服务器缓存凭据可能值得一试。我们的问题是我们获得了旧凭证,但仅限于客户机。如果用户在单独的客户端计算机上登录,一切都很好,但是如果他们在他们的办公桌上使用他们自己的机器,那么他们正常工作就有了缓存的旧凭证。
答案 3 :(得分:3)
如果不是只更改NT用户名的问题,那么认证服务似乎正在缓存旧用户名。
您可以将其定义为禁用,转到本地安全设置(在管理工具中),并且根据版本/编辑/配置,可能相关的设置(来自内存)是“先前登录的登录次数”和“执行不允许存储凭证......“。
需要考虑的其他因素:
因此,我建议您在部署生产之前先进行测试(当然)。
答案 4 :(得分:1)
重新启动IIS,而不是整个机器,应该可以解决问题。
答案 5 :(得分:1)
当这些用户的名字被更改时,您是否只更改了他们的NT登录名或者他们的UPN名称? UPN名称是专有名称,由Kerberos使用 - 这是IWA的默认协议;但是,如果您只是在ActiveDirectory中单击更改其名称,则只会更改NT登录名称 - 即使这是他们用于登录的内容(使用默认窗口GINA)。在窗口下,windows会将(新)NT登录名转换为(旧)Kerberos名称。这将持续到AD被强制根据NT登录名更新Kerberos名称...
答案 6 :(得分:1)
来自MicroSoft支持的此链接"Changing the Default Interval for User Tokens in IIS" 应该有所帮助。
答案 7 :(得分:0)
使用相关的新登录名登录到运行IIS的服务器。这将刷新凭据,而无需重新启动IIS或重新启动服务器。
答案 8 :(得分:0)
正如我们有一个完全相同的问题。似乎对我们有用的是进入Active Directory并执行“刷新”。在此之后,我们不得不在有此问题的Intranet站点上回收应用程序池。