7

好的,我花了大约 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。在每一步之后,我检查了应用程序行为的任何变化,但从未发现任何变化。

总之,我做了以下事情:

  1. 我设置了一个域用户帐户来运行应用程序池。为了测试,我让这个用户成为 Domain Admins 组的成员。
  2. 我将 web.config 中的一行更改为<add key="aspnet:AllowAnonymousImpersonation" value="false" />(确实如此)。这阻止了 NT AUTHORITY\IUSR 用户运行应用程序,而是在我创建的用于运行应用程序池的域帐户下运行。我现在可以登录到 SharePoint 并访问我的 WebPart,但正如预期的那样,它向我显示了运行应用程序池的域用户的 AD 信息,而不是经过身份验证的域用户。所以我知道 WebPart 正在工作并且具有必要的权限等,但System.Security.Principal.WindowsIdentity.GetCurrent().Name;仍在返回运行应用程序池的用户,即。模拟仍然不起作用
  3. 在 AD 用户和计算机中,我Trust this computer for delegation to any service为这一切运行的虚拟服务器授予了权限。
  4. 由于我没有运行应用程序池的域用户帐户的“委托”选项卡,因此我必须为用户注册一个 SPN。在注册了我从服务器的 SPN 列表中复制的所有 SPN 以及我在网上找到的几个 http SPN 以及Trust this user for delegation to any service对用户进行设置后,应用程序的行为没有任何变化。
  5. 我确保我登录的域用户不受委派保护
  6. 我进入 SharePoint 服务器上的本地策略编辑器,并确保允许运行应用程序池的域用户“作为操作系统的一部分”和“在身份验证后模拟客户端”。
  7. 我尝试过的其他事情
    • 在 IIS 网站上添加Negotiate:Kerberos为 Windows Auth 的身份验证提供程序
    • 确认 SharePoint web.config 中存在这两行:

以下是我在 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 部件,更重要的是,这是正确的方法,我应该能够让它工作。我不想不得不不断地解决它。

如果有人对可能导致问题的原因有更多的想法,我很想听听他们的意见。

4

1 回答 1

1

不确定您是否还有问题,以下帖子可能会有所帮助。 ASP.NET 4 中的双跳模拟、协议转换和约束委派

于 2012-10-10T19:20:32.760 回答