Sharepoint 2010 从Sharepoint Claims Base Athentication Web应用程序中的代码访问windows共享
我想从代码访问另一台计算机上的共享资源。“我的环境”是一个Sharepoint 2010 Web应用程序,在声明身份验证模式下工作。应用程序的Windows标识是NT AUTHORITY\IUSR-不是已登录的用户,因此要访问另一台计算机上的网络共享资源,我需要执行模拟。由于我没有有效的windows令牌来执行模拟,我需要使用windows令牌服务声明,我已将其配置为能够被NT AUTHORITY\IUSR访问。该服务正在以本地系统帐户运行。我能够从服务获取模拟级别的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令牌,我正在使
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)”
设置值“信任此计算机以授权给任何服务”将不起作用 好的,我确实解决了这个问题 我所做的是将我的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)”