迁移至Windows Server2022后某ASP.NET WebService无法获取User.Identity.Name
我正将一款Windows XP时代的旧ASP.NET应用迁移至Windows Server2022。同一机器运行服务端与客户端时程序正常,但服务端移至Windows Server2022后,其中一个WebService(WebService1)无法通过User.Identity.Name获取用户名,另一关联WebService(WebService2)可正常获取。
两者IIS身份验证设置完全一致:禁用匿名身份验证、ASP.NET模拟、表单身份验证,启用Windows身份验证。预期通过Windows身份验证实现用户免密登录。
本地管理员账号测试显示,两个WebService均可通过WindowsIdentity.GetCurrent().Name获取到IIS APPPOOL\DefaultAppPool,符合预期。问题出在Session_Start()事件中访问User.Identity:WebService1触发异常,错误信息为“Public member 'Identity' on type SecurityIdentifier not found at Microsoft.VisualBasic.CompilerServices.Symbols.Container.GetMembers(...)”;WebService2则可正常获取MyDomain\MyName格式的正确用户名。
已将新服务器上WebService1的Web.config与原正常服务器配置对齐,但问题依旧,且因差异过大无法与WebService2的Web.config对齐。
临时方案(均存在问题)
- 使用
My.User.Name:需启用WebService1的匿名身份验证,此时Windows安全中心会弹出密码提示(已启用Windows身份验证),输入密码后可获取用户名,但每次启动程序都会重复提示,即使勾选“记住凭据”。 - 使用
My.User.CurrentPrincipal.Identity.Name:需禁用匿名身份验证,同样会触发密码提示,输入后可获取用户名,但仍无法访问User.Identity。
客户端配置情况
客户端EXE程序已在Visual Studio2017项目属性中启用“使用Windows身份验证”(项目属性→服务→启用客户端应用服务→使用Windows身份验证)。
尝试过的无效方案
尝试为WebService1的VB代码添加<Authorize>属性,但需引入Microsoft.AspNetCore.Authorization命名空间,在Visual Studio2017中无法找到该命名空间及对应DLL,且WebService2的C#代码无此属性仍正常工作,故怀疑此方案无效。
问题列表
- 为何IIS设置相同,WebService1无法访问
User.Identity而WebService2可以? - 为何启用WebService1的匿名身份验证后,Windows安全中心仍会弹出密码提示?如何停止该提示?
- 是否有其他方法强制客户端EXE始终使用Windows身份验证?
- 如何测试WebService1是否确实使用Windows身份验证?直接在浏览器访问两个WebService的URL均会弹出账号密码提示,但WebService2实际可正常使用Windows身份验证,故该测试无效。
内容的提问来源于stack exchange,提问作者Jay C

