从基于Sharepoint声明的身份验证Web应用程序中的代码访问Windows共享

时间:2012-11-29 09:34:59

标签: sharepoint-2010 impersonation c2wts

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

using (wi = S4UClient.UpnLogon(upn))
{
    using(WindowsImpersonationContext wic2 = wi.Impersonate())
    {
     //code to access windows shares
    }  
} 

服务正在正确返回令牌,模拟成功的方式是当我使用以下代码返回当前登录用户的身份时:

WindowsIdentity.GetCurrent().Name;

我正在获取登录到sharepoint的用户的用户名。

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

    [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;
    }

我能够毫无问题地枚举服务器上的共享。

根据我在互联网上找到的信息正确配置服务以访问另一台服务器上的sql数据库,我需要在Active Directory中启用协议转换和约束委派,并将约束设置为mysql服务。我仍然不确定如何在这种情况下启用委派,因为我想要实现的是能够访问任何计算机上的任何共享,只要用户有权执行它。

总而言之,我想在基于Sharepoint声明的身份验证WebApplication中冒充用户来访问其他计算机上的网络共享,但即使使用c2wts进行强硬模拟似乎也是成功的(检查当前用户名时返回了正确的用户名)我不是能够访问另一台计算机上的资源。另一方面,当使用直接在代码中提供的登录名和密码进行模拟时,一切正常,但这对我来说不是一个选项。

1 个答案:

答案 0 :(得分:1)

好的,我确实设法解决了它。

我所做的是将我的webapplication的web.config中的模拟设置为false:

<identity impersonate="false" />

在那种情况下,我能够看到本地股票上的文件。要在其他计算机上启用acccess,我必须为运行web应用程序的帐户创建服务主体名称(SPN)。

SETSPN -A HTTP/ServerName myDomain\webAppAccountUserName
SETSPN -A HTTP/FQDNServerName myDomain\webAppAccountUserName
用于webapplication和c2wts(c2wts用作LocalSystem)的计算机的

和SPN正在运行

SETSPN -A HOST/ServerName ServerName 
SETSPN -A HOST/FQDNServerName ServerName 

下一步是配置约束委派和协议转换,以便我们可以委托另一台计算机上的文件共享来执行此操作,我们需要打开Active Directory用户和计算机工具并为Web应用程序帐户和计算机帐户配置委派c2wts正在努力。具体来说,我们需要:

  • 选择我们感兴趣的帐户,例如计算机帐户,
  • 右键单击,
  • 选择属性,
  • 选择委派标签,
  • 选择“信任此计算机以仅委派给指定的服务”和 “使用任何身份验证协议”,
  • 从计算机添加“常用互联网文件系统(cifs)”我们要连接到

我们需要为webapp帐户做同样的事情

设置值“信任此计算机以便委派任何服务”将不起作用!