好的,我花了大约 15 个小时试图解决这个问题,我终于辞职在这里发帖试图解决它。我知道这篇文章很长,但我已经完成了我将被告知尝试的所有正常事情,所以我想确保它很清楚,这样我们就不会浪费时间了。
我在 ESXi 5.0 服务器上托管了一个 Win Server 2008 R2 虚拟机。在这台服务器上,我安装了 SharePoint Foundation 2013 Preview 以及所有先决条件等。我在这台服务器上运行所有东西(MSSQL、IIS 7.5、SharePoint 服务),因为我们的使用量非常有限,只有大约 30 个用户。我迫切需要添加到 SharePoint 的一件事是用户能够在 Active Directory (Server 2003) 中修改他们的信息,因为我们的 AD 几乎没有填充并且已经过时。我找到了一个完美的 WebPart,它非常适合编辑用户。
当我想将 WebPart 配置为只允许用户编辑自己时,问题就出现了。WebPart(正确)在 C#.NET 中使用这行代码:。获取当前登录的身份,该身份已通过 IIS 中的 Windows 身份验证进行身份验证。然而,这将返回本地用户 NT AUTHORITY/IUSR。(我知道这对任何人都不是新闻)。
System.Security.Principal.WindowsIdentity.GetCurrent().Name;
所以我开始了我的研究并确定了以下几点。
在我的 SharePoint 的 web.config 中,我有以下内容:
<authentication mode="Windows" />
<identity impersonate="true" />
在 IIS 中,我对包含我的 SharePoint 安装的 IIS 网站具有以下身份验证设置:
Anonymous Authentication Disabled
ASP.NET Impersonation Enabled
Basic Authentication Disabled HTTP 401 Challenge
Digest Authentication Disabled HTTP 401 Challenge
Forms Authentication Disabled HTTP 302 Login/Redirect
Windows Authentication Enabled HTTP 401 Challenge
所以我知道即使我禁用了匿名身份验证,该站点仍在使用匿名用户登录。我遇到了有关与我的问题相匹配的双跳问题的信息,我遇到了这个链接并遵循了这篇文章中的所有指示:http: //blogs.technet.com/b/taraj/archive/2009/01/29 /checklist-for-double-hop-issues-iis-and-sql-server.aspx。在每一步之后,我检查了应用程序行为的任何变化,但从未发现任何变化。
总之,我做了以下事情:
- 我设置了一个域用户帐户来运行应用程序池。为了测试,我让这个用户成为 Domain Admins 组的成员。
- 我将 web.config 中的一行更改为
<add key="aspnet:AllowAnonymousImpersonation" value="false" />
(确实如此)。这阻止了 NT AUTHORITY\IUSR 用户运行应用程序,而是在我创建的用于运行应用程序池的域帐户下运行。我现在可以登录到 SharePoint 并访问我的 WebPart,但正如预期的那样,它向我显示了运行应用程序池的域用户的 AD 信息,而不是经过身份验证的域用户。所以我知道 WebPart 正在工作并且具有必要的权限等,但System.Security.Principal.WindowsIdentity.GetCurrent().Name;
仍在返回运行应用程序池的用户,即。模拟仍然不起作用 - 在 AD 用户和计算机中,我
Trust this computer for delegation to any service
为这一切运行的虚拟服务器授予了权限。 - 由于我没有运行应用程序池的域用户帐户的“委托”选项卡,因此我必须为用户注册一个 SPN。在注册了我从服务器的 SPN 列表中复制的所有 SPN 以及我在网上找到的几个 http SPN 以及
Trust this user for delegation to any service
对用户进行设置后,应用程序的行为没有任何变化。 - 我确保我登录的域用户不受委派保护
- 我进入 SharePoint 服务器上的本地策略编辑器,并确保允许运行应用程序池的域用户“作为操作系统的一部分”和“在身份验证后模拟客户端”。
- 我尝试过的其他事情
- 在 IIS 网站上添加
Negotiate:Kerberos
为 Windows Auth 的身份验证提供程序 - 确认 SharePoint web.config 中存在这两行:
- 在 IIS 网站上添加
以下是我在 DC 上的 SPN 记录:
setspn -l SPserver
Registered ServicePrincipalNames for CN=SPserver,CN=Computers,DC=DOMAIN,DC=local:
MSSQLSvc/SPserver.DOMAIN.local:appPoolUser
WSMAN/SPserver
WSMAN/SPserver.DOMAIN.local
TERMSRV/SPserver
TERMSRV/SPserver.DOMAIN.local
RestrictedKrbHost/SPserver
HOST/SPserver
RestrictedKrbHost/SPserver.DOMAIN.local
HOST/SPserver.DOMAIN.local
setspn -l appPoolUser
Registered ServicePrincipalNames for CN=appPoolUser,OU=Utility,OU=Users,OU=Company Name,DC=DOMAIN,DC=local:
http/subdomain.domain.com
http/SPserver.DOMAIN.local
RestrictedKrbHost/appPoolUser.DOMAIN.local
RestrictedKrbHost/appPoolUser
MSSQLSvc/appPoolUser.DOMAIN.local:appPoolUser
HOST/appPoolUser
HOST/appPoolUser.DOMAIN.local
在此过程中,我也多次重新启动服务器和 IIS。当我登录时,我的 Web 部件仍将我标识为运行应用程序池的用户。我知道有一些解决方法,例如使用经典模式应用程序池,但已弃用。还有其他方法可以在 .NET 中获得正确的名称,但我不想更改 Web 部件,更重要的是,这是正确的方法,我应该能够让它工作。我不想不得不不断地解决它。
如果有人对可能导致问题的原因有更多的想法,我很想听听他们的意见。