>

设投身份模拟,用户不具备所需的权限

- 编辑:www.bifa688.com -

设投身份模拟,用户不具备所需的权限

作者:eaglet

作者:eaglet

 

转发请表明出处

转发请评释出处

化解办法:在web.config中的在<system.web>下进入

IIS柒 与 IIS 陆 比较有了比比较大的退换,原来在 IIS 陆 下得以的设置到了 IIS 7下有的会产生变化。身份模拟的陈设上,IIS七 和 IIS陆有不小分歧,英特网IIS陆的地方模拟的稿子比较多,但介绍IIS七的相比较少,笔者把的局地魔难的经历在这篇博客中写下去,以供参照他事他说加以考查。

IIS七 与 IIS 六 相比较有了一点都不小的变动,原来在 IIS 六 下能够的安装到了 IIS 7下有的会爆发变化。身份模拟的布局上,IIS7 和 IIS陆有非常的大分裂,互联网IIS陆的身价模拟的稿子相比较多,但介绍IIS七的可比少,作者把的一些祸患的经验在那篇博客中写下去,以供参考。

  <identity impersonate="false" />

IIS 7 有两种 ASP.NET Application Mode。

 

================================================================================

壹种是 集成情势(Integrated Mode) 这些是默许的格局,也是微软推举的格局,另壹种是 优秀情势(Classic Mode) ,那种格局是用于兼容老版本。集成形式接纳更有益而且安全性更加好,无需把模拟帐户的用户名和密码写在陈设文件中,那样更安全也更方便。既然大家早就用了IIS 7,那么大家依旧按微软引荐的点子使用集成方式相比好。

IIS 7 有两种 ASP.NET Application Mode。

 

合并格局下,身份模拟能够完全通过界面来形成:

1种是 集成方式(Integrated Mode) 那个是私下认可的方式,也是微软推举的形式,另一种是 美丽形式(Classic Mode) ,那种格局是用来包容老版本。集成形式采纳更利于而且安全性更加好,没有须求把模拟帐户的用户名和密码写在布局文件中,那样更安全也更方便。既然大家早已用了IIS 7,那么大家依旧按微软推荐的方法使用集成情势相比好。

在ASP.NET应用程序中使用地点模拟(Impersonation)

图片 1

购并方式下,身份模拟能够完全通过分界面来达成:


第二如上图所示,IIS 7 在 Server Level 下有个 IIS-> Authentication ,双击这几个Logo大家看来下边那么些图:

图片 2

 

 

先是如上海体育场面所示,IIS 柒 在 Server Level 下有个 IIS-> Authentication ,双击那个Logo大家看到下边这些图:

缺省意况下,ASP.NET应用程序以本机的ASPNET帐号运维,该帐号属于普通用户组,权限受到鲜明的限定,以保全ASP.NET应用程序运维的平安。但是有时供给某个ASP.NET应用程序只怕程序中的某段代码推行须求一定权限的操作,比如有个别文件的存取,那时就供给给该程序或相应的某段代码赋予有个别帐号的权限以实施该操作,那种措施称之为身份模拟(Impersonation)。本文介绍了在ASP.NET应用程序中运用地方模拟的三种办法,并相比了它们各自适用的限制。

图片 3

 

在读书本文在此之前,提议您先阅读小说:《ASP .NET 中的身份验证:.NET 安全性教导》 以便对ASP.NET的安控有1个总体的询问。

 

图片 4


在那个图中我们来看 IIS7 多了一个 ASP.NET Impersonation 的效率,在 Actions 里面点 Enable 开启身份模拟成效,然后点 艾德it 编辑身份模拟。

 

目录

图片 5 

在这么些图中我们看出 IIS七 多了一个 ASP.NET Impersonation 的坚守,在 Actions 里面点 Enable 开启身份模拟功效,然后点 艾德it 编辑身份模拟。

  • ASP.NET中的身份模拟
  • 仿照IIS认证帐号
  • 在某些ASP.NET应用程序中效仿钦命的用户帐号
  • 在代码中模仿IIS认证帐号
  • 在代码中模拟钦命的用户帐号
  • 越多新闻

我们来看上边这一个编辑框,在那一个编辑框中,大家钦赐要举行身份模拟的帐号,那么些帐号必须是地点曾经存在的帐号,点 Set 输入那些帐号的称谓和密码。

图片 6 


然后点OK。

我们看到地点那个编辑框,在那么些编辑框中,大家钦赐要开始展览身份模拟的帐号,那么些帐号必须是本地曾经存在的帐号,点 Set 输入这一个帐号的名目和密码。

ASP.NET中的身份模拟

到这边,遵照 MSDN 中的帮忙文书档案,身份模拟应该就是设置成功了。

然后点OK。

ASP.NET 通过使用身份验证提供程序来促成身份验证,一般景况下,ASP.NET的身份验证提供程序包蕴表单身份验证、Windows身份验证和Passport身份验证三种。当通过身份验证后,ASP.NET会检查是或不是启用身份模拟。借使启用,ASP .NET 应用程序使用客户端标志以客户端的地方有采用地实行。不然,ASP.NET应用程序使用本机身份标记运营(一般接纳本机的ASPNET帐号),具体流程如下图所示:

然后小编做了三个轻易易行的测试页面看看身份模拟是还是不是成功,测试程序如下:

到此处,根据 MSDN 中的帮衬文书档案,身份模拟应该便是设置成功了。

图片 7

 

接下来作者做了一个大致的测试页面看看身份模拟是还是不是成功,测试程序如下:

在ASP.NET应用程序中使用地方模拟一般用于财富访问调节,主要有如下三种办法:

protected void Page_Load(object sender, EventArgs e)
{
    Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name);
}

 

  • 宪章IIS认证帐号
  • 在有些ASP.NET应用程序中模仿钦赐的用户帐号
  • 在代码中模拟IIS认证帐号
  • 在代码中效仿钦命的用户帐号

运维的结果竟然是:

protected void Page_Load(object sender, EventArgs e)
{
    Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name);
}


NT AUTHORITYIUSR

 

仿照IIS认证帐号

也正是说 Asp.net 未有用笔者设置的这一个 MyAccount 帐号模拟运转,而是还是用IUS奥德赛帐号模拟运行。查了遥远,才意识是底下难题导致:

运维的结果依旧是:

那是最简便易行的壹种艺术,使用经过IIS认证的帐号施行应用程序。您须求在Web.config文件中加多<identity>标志,并将impersonate属性设置为true:

用 Virtual Studio 二〇〇八 生成网址时,web.config 文件中私下认可会有那般2个设置:

NT AUTHORITYIUSR

<identity impersonate="true" />
<identity impersonate="true" />

 

在那种状态下,用户地方的表达交给IIS来张开。当允许佚名登六时,IIS将三个无名登陆使用的标志(缺省情形下是IUSHummerH二_MACHINENAME)交给ASP.NET应用程序。当不允许无名氏登入时,IIS将注脚过的身份标记传递给ASP.NET应用程序。ASP.NET的有血有肉访问权限由该账号的权能决定。

以此装置是为 IIS 6做身份模拟而设置的。在那种状态下,用户身份的表达交给IIS来拓展。当允许无名氏登入时,IIS将3个无名登入使用的标志(缺省意况下是IUS凯雷德)交给ASP.NET应用程序。当不允许无名氏登六时,IIS将评释过的身份标志传递给ASP.NET应用程序。ASP.NET的切实可行访问权限由该账号的权能决定。

约等于说 Asp.net 没有用自家设置的这一个 MyAccount 帐号模拟运维,而是依旧用IUS福睿斯帐号模拟运转。查了绵绵,才意识是上面难题产生:


以此装置在 IIS 七 下一度不合时宜了,如若用古典方式,才必要如此设置。

用 Virtual Studio 2010 生成网址时,web.config 文件中暗许会有诸如此类一个安装:

仿照钦命的用户帐号

找到标题原因后,小编把 <identity impersonate="true" />  这么些布局项从 web.config 中去除了。删除后,就足以用到方今在分界面上配备的用户名来模拟帐号了。

<identity impersonate="true" />

当ASP.NET应用程序须要以有个别特定的用户帐号实施,能够在Web.config文件的<identity>标志中钦定具体的用户帐号:

唯独先不要开心的太早,紧接着就涌出了新的标题。 错误如下:

这些设置是为 IIS 陆做身份模拟而设置的。在这种境况下,用户地点的验证交给IIS来进展。当允许无名登入时,IIS将三个佚名登入使用的标志(缺省状态下是IUS锐界)交给ASP.NET应用程序。当分化意佚名登6时,IIS将表达过的地点标志传递给ASP.NET应用程序。ASP.NET的实际访问权限由该账号的权柄调整。

<identity impersonate="true" userName="accountname" password="password" />

Could not load file or assembly 'xxxx' or one of its dependencies. Access is denied.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.IO.FileLoadException: Could not load file or assembly 'GetPathFileLib' or one of its dependencies. Access is denied.
Source Error:

从错误提醒看,应该是方今以此宪章帐户未有足够的权柄去奉行 bin 目录下的 xxxx.dll ,于是自个儿把bin 目录赋予模拟帐户 MyAccount 完全调控的权位,结果只怕要命,笔者在网络搜了1晃,有人说需求将C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary 那个目录也设置为完全调整,于是照做了,依旧要命。无奈之下,小编把MyAccount 帐户参与了 IIS_IUS揽胜S那几个群组,难点究竟消除。

图片 8

至今大家再运营下边十三分显示当前用户的代码显示结果为

MachineNameMyAccout

只顾:大家亟供给把 <identity impersonate="true" /> 删除才行,假设唯有是安装为 <identity impersonate="false" />

模仿的帐户会形成  IIS 应用软件POOLDefaultAppPool,这些设置是不正确的。

到此地IIS七 下设献身份模拟就全部完毕了。

其壹设置在 IIS 七 下已经过时了,借使用古典形式,才供给如此设置。

那时候该ASP.NET应用程序的全数页面包车型大巴全体请求都将以钦定的用户帐号权限实行。

您可能感兴趣的小说:

  • Windows Server 二零一二 Iis8php情况安顿方式
  • win二〇〇八下安装SQL SESportageVE昂科雷 200伍出现IIS功用须求警告化解方案
  • windows server 二〇〇玖Qashqai2系统 IIS7.伍配置伪静态的方法(urlrewrite)
  • Windows server 二零零六iis7/iis七.5启用父路线的点子
  • win2003 iis6.0 NET2.0的Server Application Unavailable的问题!
  • 汤姆cat六.0与windows 200三 server 的IIS服务器集成
  • windows server 2009/二零一三安装php iis柒mysql境况搭建教程
  • Windws Server 二零零六 ENVISION2WEB遭遇安排之安装IIS方法
  • Microsoft Windows 200九 Server Highlander2iis七.伍上传文件限制200K改换
  • Win二〇〇八Server下IIS配置安装教程

找到难点由来后,小编把 <identity impersonate="true" />  这几个布局项从 web.config 中剔除了。删除后,就可以用到前方在界面上配备的用户名来模拟帐号了。


只是先不要春风得意的太早,紧接着就应时而生了新的难点。 错误如下:

在代码中效仿IIS认证帐号

Could not load file or assembly 'xxxx' or one of its dependencies. Access is denied.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.IO.FileLoadException: Could not load file or assembly 'GetPathFileLib' or one of its dependencies. Access is denied.
Source Error:

从错误提醒看,应该是当前这么些宪章帐户未有充裕的权柄去实行 bin 目录下的 xxxx.dll ,于是本人把bin 目录赋予模拟帐户 MyAccount 完全调控的权位,结果也许那几个,作者在互联网搜了1晃,有人说供给将C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary 那几个目录也设置为完全调整,于是照做了,依然要命。无奈之下,笔者把MyAccount 帐户参预了 IIS_IUS奔驰G级S这些群组,难题毕竟消除。

 

图片 9

 

 

后天我们再运转下边13分展现当前用户的代码呈现结果为

 

MachineNameMyAccout

小心:我们亟要求把 <identity impersonate="true" /> 删除才行,假如只有是安装为 <identity impersonate="false" />

 

模仿的帐户会形成  IIS 应用软件POOLDefaultAppPool,这些设置是不正确的。

 

 

到此地IIS柒 下设献身份模拟就满门成功了。

在代码中选拔地点模拟越来越灵敏,能够在钦赐的代码段中运用地点模拟,在该代码段之外复苏行使ASPNET本机帐号。该办法须要必须采取Windows的求证身份标志。下边包车型大巴例证在代码中模仿IIS认证帐号:

Visual Basic .NET

Dim impersonationContext As System.Security.Principal.WindowsImpersonationContext
Dim currentWindowsIdentity As System.Security.Principal.WindowsIdentity
currentWindowsIdentity = CType(User.Identity, System.Security.Principal.WindowsIdentity)
impersonationContext = currentWindowsIdentity.Impersonate()
'Insert your code that runs under the security context of the authenticating user here.
impersonationContext.Undo()

Visual C# .NET

System.Security.Principal.WindowsImpersonationContext impersonationContext;
impersonationContext = ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();
//Insert your code that runs under the security context of the authenticating user here.
impersonationContext.Undo();

在代码中模仿内定的用户帐号

上面包车型地铁例证在代码中模仿钦点的用户帐号:

Visual Basic .NET

<%@ Page Language="VB" %>
<%@ Import Namespace = "System.Web" %>
<%@ Import Namespace = "System.Web.Security" %>
<%@ Import Namespace = "System.Security.Principal" %>
<%@ Import Namespace = "System.Runtime.InteropServices" %>

<script runat=server>
Dim LOGON32_LOGON_INTERACTIVE As Integer  = 2
Dim LOGON32_PROVIDER_DEFAULT As Integer = 0

Dim impersonationContext As WindowsImpersonationContext

Declare Auto Function LogonUser Lib "advapi32.dll" (ByVal lpszUsername As String, _
                           ByVal lpszDomain As String, _
                           ByVal lpszPassword As String, _
                           ByVal dwLogonType As Integer, _
                           ByVal dwLogonProvider As Integer, _
                           ByRef phToken As IntPtr) As Integer
Declare Auto Function DuplicateToken Lib "advapi32.dll"(ByVal ExistingTokenHandle As IntPtr, _
                           ImpersonationLevel As Integer, _
                           ByRef DuplicateTokenHandle As IntPtr) As Integer

Public Sub Page_Load(s As Object, e As EventArgs)
   If impersonateValidUser("username", "domain", "password") Then
      'Insert your code that runs under the security context of a specific user here.
      undoImpersonation()
   Else
      'Your impersonation failed. Therefore, include a fail-safe mechanism here.
   End If
End Sub

Private Function impersonateValidUser(userName As String, _
domain As String, password As String) As Boolean 
   Dim tempWindowsIdentity As WindowsIdentity
   Dim token As IntPtr
   Dim tokenDuplicate As IntPtr

   If LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE, _
                LOGON32_PROVIDER_DEFAULT, token) <> 0 Then
      If DuplicateToken(token, 2, tokenDuplicate) <> 0 Then 
                tempWindowsIdentity = new WindowsIdentity(tokenDuplicate)
                impersonationContext = tempWindowsIdentity.Impersonate()

                If impersonationContext Is Nothing Then
                   impersonateValidUser = False
                Else
                   impersonateValidUser = True
                End If
      Else
            impersonateValidUser = False
      End If
   Else
      impersonateValidUser = False
   End If
End Function

Private Sub undoImpersonation()
   impersonationContext.Undo()
End Sub
</script>

Visual C# .NET

<%@ Page Language="C#"%>
<%@ Import Namespace = "System.Web" %>
<%@ Import Namespace = "System.Web.Security" %>
<%@ Import Namespace = "System.Security.Principal" %>
<%@ Import Namespace = "System.Runtime.InteropServices" %>

<script runat=server>
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;

WindowsImpersonationContext impersonationContext; 

[DllImport("advapi32.dll", CharSet=CharSet.Auto)]
public static extern int LogonUser(String lpszUserName, 
                                  String lpszDomain,
                                  String lpszPassword,
                                  int dwLogonType, 
                                  int dwLogonProvider,
                                  ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
public extern static int DuplicateToken(IntPtr hToken, 
                                  int impersonationLevel,  
                                  ref IntPtr hNewToken);

public void Page_Load(Object s, EventArgs e)
{
   if(impersonateValidUser("username", "domain", "password"))
   {
      //Insert your code that runs under the security context of a specific user here.
      undoImpersonation();
   }
   else
   {
      //Your impersonation failed. Therefore, include a fail-safe mechanism here.
   }
}

private bool impersonateValidUser(String userName, String domain, String password)
{
   WindowsIdentity tempWindowsIdentity;
   IntPtr token = IntPtr.Zero;
   IntPtr tokenDuplicate = IntPtr.Zero;

   if(LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE, 
   LOGON32_PROVIDER_DEFAULT, ref token) != 0)
   {
      if(DuplicateToken(token, 2, ref tokenDuplicate) != 0) 
      {
         tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
         impersonationContext = tempWindowsIdentity.Impersonate();
         if (impersonationContext != null)
            return true;
         else
            return false; 
      }
      else
         return false;
   } 
   else
      return false;
}
private void undoImpersonation()
{
     impersonationContext.Undo();
} 
</script>

上面介绍ASP.NET应用程序中应用地方模拟的一个简易利用。举个例子有2个ASP.NET应用程序要检查服务器端有个别文件是还是不是留存,相应的程序代码为:

bool a = File.Exists("D:\Share\test.txt");

缺省气象下该ASP.NET应用程序以ASPNET帐号运维。为了安全起见,ASPNET这几个帐号并从未服务器端D:Share这几个目录的走访权限。在不应用地方模拟的情状下,由于ASP.NET应用程序不有所访问该目录的权能,无杂谈件是或不是留存,File.Exists的重临值将永恒是false。为了消除那几个标题,可以另建3个用户帐号:FileExist,并授予该帐号D:Share目录的造访权限。然后在该应用程序的Web.config文件的<identity>标志中钦命具体的用户帐号:

<identity impersonate="true" userName="FileExist" password="password" />

来推行该程序。

本文由bifa688.com发布,转载请注明来源:设投身份模拟,用户不具备所需的权限