【发布时间】:2026-01-19 10:40:01
【问题描述】:
好的,我花了大约 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 部件,更重要的是,这是正确的方法,我应该能够让它工作。我不想不得不不断地解决它。
如果有人对可能导致问题的原因有更多的想法,我很想听听他们的意见。
【问题讨论】:
-
我只是想更新这篇文章。我仍然没有找到解决方案,而且似乎也没有任何事情对其他人敲响了警钟。同时,我更改了 Web 部件中的代码,以使用户像这样:
SPSite site = new SPSite(SPContext.Current.Web.Url.ToString());SPWeb web = site.OpenWeb("/");SPUser user = web.CurrentUser;
标签: sharepoint iis-7.5 windows-authentication impersonation delegation