问题
当在Windows身份验证设置为true,匿名身份验证设置为false的IIS后面托管Asp.Net Core 2.0或2.1 Web应用程序时,User.Identity.Name
属性为null,User.Identity.IsAuthenticated
为false。 / p>
根据文档here,在通过IIS托管时,Windows身份验证应仅在Asp.Net Core 2.x中工作。
背景
我正在按照Migrate from ASP.NET MVC to ASP.NET Core MVC guide的要求将Asp.Net 4.x MVC应用程序迁移到Asp.Net Core。
我正在当前托管使用Windows身份验证的Asp.Net 4.x MVC应用程序的服务器上测试站点。 Windows用户的身份可以按预期使用。
完成迁移指南并解决所有构建问题后,我在Web项目属性的“调试”下创建了“本地IIS”配置文件,并将“启动”选项设置为“ IIS”。我只勾选了“启用Windows身份验证”,然后浏览到该网站。尽管使用有效的域凭据登录,User.Identity.Name
仍然为空。
我在开始迁移过程之前安装了.Net Core 2.1 SDK,并且以前已经安装了.Net Core 1.0.1 SDK Preview。该服务器运行带有IIS 7的Windows 2008 R2。
我尝试过的事情
为了确保在迁移过程中没有引入此问题,我使用MVC模板并针对.NET Framework 4.7.2创建了一个新的ASP.NET Core Web应用程序。选择模板时,我配置了“ Windows身份验证”。在确认使用IIS Express时Windows身份验证有效后,我如上所述配置了本地IIS。当浏览到IIS下时,导航栏的右上角显示“ Hello,!”。我尝试使用Asp.Net Core SDK 2.0和2.1中的模板进行此操作。
我遵循了各种指南,而Stackoverflow回答了所有与在Asp.Net Core应用程序本身中配置Windows身份验证有关的问题。结果要么没有变化,要么是连续登录提示,它们从不接受有效的用户名和密码。这些解决方案似乎是为框架的较旧版本或开发人员尝试组合多种身份验证方法的方案而编写的。
答案 0 :(得分:0)
原因
服务器已安装了过时的.Net Core 2.0 IIS模块,默认情况下它不转发Windows身份验证详细信息。此处描述了此问题:.Net Core 2.0 Project With Windows Authentication Fail When Published to IIS。安装最新的.Net Core 2.0 Runtime应该可以解决此问题。
可以通过在PowerShell中运行以下命令对此进行验证:
(Get-Item $env:SystemDrive\Windows\System32\inetsrv\aspnetcore.dll).VersionInfo
这将提供以下输出:
ProductVersion FileVersion FileName
-------------- ----------- --------
7.1.1967.0 7.1.1967.0 C:\Windows\System32\inetsrv\aspnetcore.dll
服务器要求使用7.1.1972.0或更高版本。
解决方案1-项目修复
在配置本地IIS时由Visual Studio 2017生成的web.config中,将forwardWindowsAuthToken="true"
作为属性添加到<aspNetCore>
元素:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="bin\IISSupport\VSIISExeLauncher.exe" arguments="-argFile IISExeLauncherArgs.txt" stdoutLogEnabled="false" forwardWindowsAuthToken="true" />
</system.webServer>
</location>
<system.web>
<authentication mode="Windows" />
</system.web>
</configuration>
解决方案2-系统范围修复
从.Net downloads页下载并安装最新的.Net Core运行时。运行时包括Windows Hosting Bundle和必需的IIS模块。如果已经安装了SDK,则它将包含运行时,但是,可能仍需要再次单独安装运行时才能解决此问题(选择修复选项)。