Sharepoint 2010 从Sharepoint Claims Base Athentication Web应用程序中的代码访问windows共享

Sharepoint 2010 从Sharepoint Claims Base Athentication Web应用程序中的代码访问windows共享,sharepoint-2010,impersonation,c2wts,Sharepoint 2010,Impersonation,C2wts,我想从代码访问另一台计算机上的共享资源。“我的环境”是一个Sharepoint 2010 Web应用程序,在声明身份验证模式下工作。应用程序的Windows标识是NT AUTHORITY\IUSR-不是已登录的用户,因此要访问另一台计算机上的网络共享资源,我需要执行模拟。由于我没有有效的windows令牌来执行模拟,我需要使用windows令牌服务声明,我已将其配置为能够被NT AUTHORITY\IUSR访问。该服务正在以本地系统帐户运行。我能够从服务获取模拟级别的windows令牌,我正在使

我想从代码访问另一台计算机上的共享资源。“我的环境”是一个Sharepoint 2010 Web应用程序,在声明身份验证模式下工作。应用程序的Windows标识是NT AUTHORITY\IUSR-不是已登录的用户,因此要访问另一台计算机上的网络共享资源,我需要执行模拟。由于我没有有效的windows令牌来执行模拟,我需要使用windows令牌服务声明,我已将其配置为能够被NT AUTHORITY\IUSR访问。该服务正在以本地系统帐户运行。我能够从服务获取模拟级别的windows令牌,我正在使用该服务使用以下代码执行模拟:

using (wi = S4UClient.UpnLogon(upn))
{
    using(WindowsImpersonationContext wic2 = wi.Impersonate())
    {
     //code to access windows shares
    }  
} 
WindowsIdentity.GetCurrent().Name;
    [DllImport("advapi32.dll", SetLastError = true)]
    private static extern Int32 LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, Int32 dwLogonType, Int32 dwLogonProvider, ref IntPtr phToken);

    [DllImport("advapi32.dll", SetLastError = true)]
    private static extern Int32 ImpersonateLoggedOnUser(IntPtr hToken);

private static IntPtr ImpersonateUser(string user, string domain, string password)
    {
        IntPtr lnToken = new IntPtr(0);
        Int32 TResult = LogonUser(user, domain, password, LOGON32_LOGON_NETWORK_CLEARTEXT, LOGON32_PROVIDER_WINNT50, ref lnToken);

        if (TResult > 0)
        {
            ImpersonateLoggedOnUser(lnToken);
        }

        return lnToken;
    }
当我使用以下代码返回当前loggedin用户身份时,服务正确返回令牌,模拟成功:

using (wi = S4UClient.UpnLogon(upn))
{
    using(WindowsImpersonationContext wic2 = wi.Impersonate())
    {
     //code to access windows shares
    }  
} 
WindowsIdentity.GetCurrent().Name;
    [DllImport("advapi32.dll", SetLastError = true)]
    private static extern Int32 LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, Int32 dwLogonType, Int32 dwLogonProvider, ref IntPtr phToken);

    [DllImport("advapi32.dll", SetLastError = true)]
    private static extern Int32 ImpersonateLoggedOnUser(IntPtr hToken);

private static IntPtr ImpersonateUser(string user, string domain, string password)
    {
        IntPtr lnToken = new IntPtr(0);
        Int32 TResult = LogonUser(user, domain, password, LOGON32_LOGON_NETWORK_CLEARTEXT, LOGON32_PROVIDER_WINNT50, ref lnToken);

        if (TResult > 0)
        {
            ImpersonateLoggedOnUser(lnToken);
        }

        return lnToken;
    }
我正在获取登录到sharepoint的用户的用户名

问题是在尝试访问网络资源时出现“拒绝访问”错误。问题很明显是因为通过c2wts进行模拟,因为我使用以下代码提供了模拟用户的实际凭据(登录名和密码):

using (wi = S4UClient.UpnLogon(upn))
{
    using(WindowsImpersonationContext wic2 = wi.Impersonate())
    {
     //code to access windows shares
    }  
} 
WindowsIdentity.GetCurrent().Name;
    [DllImport("advapi32.dll", SetLastError = true)]
    private static extern Int32 LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, Int32 dwLogonType, Int32 dwLogonProvider, ref IntPtr phToken);

    [DllImport("advapi32.dll", SetLastError = true)]
    private static extern Int32 ImpersonateLoggedOnUser(IntPtr hToken);

private static IntPtr ImpersonateUser(string user, string domain, string password)
    {
        IntPtr lnToken = new IntPtr(0);
        Int32 TResult = LogonUser(user, domain, password, LOGON32_LOGON_NETWORK_CLEARTEXT, LOGON32_PROVIDER_WINNT50, ref lnToken);

        if (TResult > 0)
        {
            ImpersonateLoggedOnUser(lnToken);
        }

        return lnToken;
    }
我能够毫无问题地枚举服务器上的共享

根据我在internet上找到的信息,要正确配置服务以访问另一台服务器上的sql数据库,我需要在Active Directory中启用协议转换和受约束的委派,并将其设置为约束到mysql服务。我仍然不知道如何在这种情况下启用委派,因为我试图实现的是能够访问任何机器上的任何共享,只要用户有权限这样做


总而言之,我想从基于Sharepoint声明的身份验证WebApplication中模拟用户以访问其他计算机上的网络共享,但即使使用c2wts进行艰难的模拟也似乎成功(检查当前用户名时返回正确的用户名)。我无法访问其他计算机上的资源。另一方面,当使用代码中直接提供的登录名和密码进行模拟时,一切正常,但这不是我的选择。

好,我实际上解决了这个问题

我所做的是将我的web应用程序的web.config中的模拟设置为false:

<identity impersonate="false" />
webapplication和c2wts(c2wts作为本地系统工作)运行的计算机的SPN

SETSPN -A HOST/ServerName ServerName 
SETSPN -A HOST/FQDNServerName ServerName 
下一步是配置受约束的委派和协议转换,以便我们可以委派到另一台计算机上的文件共享。为此,我们需要打开Active Directory用户和计算机工具,并为c2wts正在处理的web应用程序帐户和计算机帐户配置委派。具体而言,我们需要:

  • 选择我们感兴趣的帐户,如计算机帐户
  • 右键单击
  • 选择属性
  • 选择委派选项卡
  • 选择“仅信任此计算机以委派给指定的服务”,然后 “使用任何身份验证协议”
  • 从我们要连接的计算机添加“通用internet文件系统(cifs)”
我们需要对webapp帐户执行完全相同的操作


设置值“信任此计算机以授权给任何服务”将不起作用

好的,我确实解决了这个问题

我所做的是将我的web应用程序的web.config中的模拟设置为false:

<identity impersonate="false" />
webapplication和c2wts(c2wts作为本地系统工作)运行的计算机的SPN

SETSPN -A HOST/ServerName ServerName 
SETSPN -A HOST/FQDNServerName ServerName 
下一步是配置受约束的委派和协议转换,以便我们可以委派到另一台计算机上的文件共享。为此,我们需要打开Active Directory用户和计算机工具,并为c2wts正在处理的web应用程序帐户和计算机帐户配置委派。具体而言,我们需要:

  • 选择我们感兴趣的帐户,如计算机帐户
  • 右键单击
  • 选择属性
  • 选择委派选项卡
  • 选择“仅信任此计算机以委派给指定的服务”,然后 “使用任何身份验证协议”
  • 从我们要连接的计算机添加“通用internet文件系统(cifs)”
我们需要对webapp帐户执行完全相同的操作

设置值“信任此计算机以授权给任何服务”将不起作用