协策网络,专业做网站,优秀上海网站制作公司,提供企业建站、网站设计、网页制作,专业网页设计师和网站制作技术工程师为您量身打造个性企业电子商务网站。

此页面上的内容需要较新版本的 Adobe Flash Player。

获取 Adobe Flash Player

  文章汇总 Article Summary
当前位置:协策网络 >> 文章中心 >> 基础教程 >> 浏览文章
 

手把手教会你如何用 ASP 和 IIS 设置目录安全的七个方法

作者:协策网络-客服部    标签:做网站 网站建设,网站设计     日期:2011年11月29日    类别:基础教程

 

        前言  

 

         首先,协策本文的编码已经经过测试并取得成功,可以在 Windows 2000 Server 的 Internet Information Services (IIS)5.0 中运行。

 

         该 Web 站点在装有 Windows 2000 的机器上。由于在这样的环境下, IIS 与 Windows 完全结合在一起,因此,我决定好好利用这种鉴别机制。当用户进入最开始的页面时, LOGON_USER 环境变量通常会得到该用户的详细信息。由于 Windows 对鉴别用户和向用户授权都格外谨慎,我们唯一需要费神的是决定当前登录的用户该从哪里获取文件信息。由于这个方案中不存在数据库的交互作用,因此我的这个程序采用的是 XML 文件,这些文件可以长久保持用户信息。 XML 数据会被长久保持在应用程序变量中,如果这个应用程序 XML 数据发生了任何改变,也都会被长久地保持在该 XML 文件中。当然,这个例子中,唯一长久保持的是当前登录的用户的鉴定信息。这也就是当前用户的 SessionID 。

 

为了让这些文件夹更灵活,我想允许用户以个人用户或群体用户的身份都可以访问它。这就要求这些文件夹向个人用户和群体用户提供访问路径,而且这些信息要储存在 XML 文件中。这样一来,我们需要三个 XML 文件:一个为个人用户准备的,一个为群体用户,另一个为文件夹准备。

 

用户的 XML 文件包含用户的一些信息。例如,每个登录的用户都有一个用户名。当某个用户访问该 Web 站点时,就创建了一个会话,会话标志符可以识别这个会话。由于每一个会话对应一个用户,那么鉴别用户的用户节点就包括一个 sessionId 属性,用来保存当前的会话标志符。 SessionId 属性可以用来在访问信息中查找用户的 ID 。这时,你同样需要为用户准备一个默认的文件夹。图表 A 中包含了一个用户 XML 文件的例子。

 

 

图表 一

 

<?xml version='1.0'?>

 


群体用户的 XML 文件包含集体信息及各个群体中的用户的信息。 每一个群体的节点都包括一组用户,这些用户都通过它们的 ID 来鉴别。图表 二 中包含了一个群体 XML 文件的例子。

 

图表 二

 

<?xml version='1.0'?>


<groups>
  <group id="1" username="administrators">
    <users>
      <user id="1"/>
    </users>
  </group>
</groups>

文件夹的 XML 文件包含了准许个人用户访问的所有必要信息。每一个文件夹节点包括一个清单,列出准许浏览该文件夹内容的用户。文件夹节点还为该文件夹指定了一个昵称 - -为了保护该文件夹的真实身份 - 还有一个到达服务器上的物理文件夹的完全路径。图表 三 包含了该文件夹的 XML 文件的例子。

 

图表 三

<?xml version='1.0'?>
<folders>
  <folder friendlyName="My Folder" absolutePath="C:\test_user">
    <users>
      <user type="user" id="1"/>
      <user type="group" id="1"/>
    </users>
  </folder>
</folders>

当用户登录到 Web 站点时,他被“指定”到他的默认文件夹。这个文件夹会显示所有可利用的文件和可访问的文件夹,

将所有的碎片连缀起来

首先,用户必须登录到系统。一个普通的登录页面会提供一些方法,提示用户的标志符。由于我不希望 Windows NT 鉴定变得混乱,所以我会要求用户通过基本的鉴定来提供他们的标志符。你可以通过将 Response status 设置成“ 401 未授权”并加上标题:“ WWW-Authenticate: Basic ”来完成这一步。浏览器接受到这个信息后,会自动提供一个登录窗口,让用户输入他的用户名和密码。当用户输入这些并提交这些信息后, IIS 会通过用户所提供的标志符自动鉴别用户。

 

基本的鉴定会将识别信息以纯文本的格式发送给服务器,了解这一点对我们很重要。有人建议任何实行这种鉴定机制的方法都通过 SSL 来执行,这样有助于避免出现安全问题。同样,管理员要让基本的鉴定在登录页面中能得以完成 ( 通常都是通过 Internet Services Manager) 。 ( 访问 微软的网页 可以看到更多关于使用 Windows 2000 进行鉴定的信息。 ) 当 ( 或者说如果 ) 用户鉴定完成了, LOGON_USER 环境变量也就设置成功了。在登录过程中,这些资料可以被特定的用户节点用来查询用户的 XML 。

 

如果用户已经登录成功了,这时就要设置 sessionId 属性了。如果当前的 SessionID 也就是 sessinID 属性值的话,你可以通过查找用户的节点来校验它。如果找不到这个节点,你可以设置 sessionID 属性,保持 XML 数据,将用户导入到它们的默认文件夹,这样用户也可以成功登录了。图表 四 包含了完成这一步的编码。

 

图表 四

<%

 

Option Explicit

 

 

Dim xmlUsers

 

Set xmlUsers = Server.CreateObject("MSXML2.DOMDocument.4.0")
 

xmlUsers.async = False

 

If VarType(Application("users")) = 0 Then


  xmlUsers.loadServer.MapPath("users.xml")


  Application.Lock


  Application("users") = xmlUsers.xml


  Application.UnLock

 

Else


  xmlUsers.loadXML Application("users")

 

End If

 

 

Dim oUser

 

Set oUser = xmlUsers.selectSingleNode("users/user[@sessionId='" &


Session.SessionID & "']")

 

If oUser Is Nothing And Request.ServerVariables("LOGON_USER") = "" Then


  RequestAuthenticate

Else
 

  If Request.ServerVariables("LOGON_USER") <> "" Then


    Login Request.ServerVariables("LOGON_USER")


  End If

 

End If

 

 

Private Sub Login(strUserName)


  Dim oUserNode


  Set oUserNode = xmlUsers.selectSingleNode("users/user[@username='" &


LCase(strUserName) & "']")


  If oUserNode Is Nothing Then


    Session.Abandon


    RequestAuthenticate


  Else
 

    Application.Lock


    oUserNode.setAttribute "sessionId", Session.SessionID


    xmlUsers.save(Server.MapPath("users.xml"))


    Application("users") = xmlUsers.xml


    Application.Unlock


    Response.Redirect "GetFiles.asp"


  End If

 

End Sub

 

Private Sub RequestAuthenticate()


  Response.Status = "401 Unauthorized"


  Response.AddHeader "WWW-Authenticate", "Basic"

 

%>

 

<html>

 

<body>

 

<h1>You are not authorised to view this page.</h1>

 

</body>

 

</html>

 

<%


  Response.End

 

End Sub

 

%>

 

以上编码假设以下情况: users.xml 文件位于该站点的根目录下,这样,这个编码才能运行;而且当前登录的用户必须看过这个文件的用户须知。由于该文件是在该站点的根目录下,这就存在着一些安全隐患。如果你将这个文件移到另一个地方,例如根目录的上级目录,用户就不能通过一个普通的 URL 查看这个文件。同样在,只要这个站点不在一个 Web farm 上,这个编码就可以运行。要处理这种情况,必须确保 users.xml 文件存在于一个共享目录中,这个目录在任何一台服务器之间共享,而且你必须选择使用除 SessionID 以外的安全机制,诸如保存在 cookie 中的 generated GUID 。尽管如此,这一方法被认为是一种简单的单服务器方案。这个编码被保存在一个名为 Security.asp 的文件中。

 

用户登录成功以后,他会被导入到 GetFiles.asp 下面。这个页面会显示该用户可以访问的所有文件和文件夹的链接。 Getfiles.asp 会进行检查,以确定是否有当前登录的用户。如果没有的话,浏览器会返回到 Security.asp 页面。如果有的话,这个页面会检查用户注册时所填写的文件夹规范和昵称是不是有效。如果无效,系统会给该用户提供他们的默认文件夹里的文件夹和文件。如果有效的话,该用户有权访问的当前文件夹里的文件和文件夹都会丢失。该用户可以点击任何文件来重新找回这个文件,或者点击文件夹来浏览里面的内容。图表 五 包含了完成这一步的编码。

图表 五

 

<%

 

Option Explicit

 

Dim xmlFolders, xmlGroups, xmlUsers

 

Set xmlFolders = Server.CreateObject("MSXML2.DOMDocument.4.0")

 

Set xmlGroups = Server.CreateObject("MSXML2.DOMDocument.4.0")

 

Set xmlUsers = Server.CreateObject("MSXML2.DOMDocument.4.0")
xmlFolders.async = False

 


xmlGroups.async = False


xmlUsers.async = False

 

If VarType(Application("folders")) = 0 Then


  xmlFolders.loadServer.MapPath("folders.xml")


  Application.Lock


  Application("folders") = xmlFolders.xml


  Application.UnLock

 

Else


  xmlFolders.loadXML Application("folders")

 

End If

 

If VarType(Application("groups")) = 0 Then


  xmlGroups.loadServer.MapPath("groups.xml")


  Application.Lock


  Application("groups") = xmlGroups.xml
 

  Application.UnLock

 

Else


  xmlGroups.loadXML Application("groups")

 

End If

 

If VarType(Application("users")) = 0 Then


  xmlUsers.loadServer.MapPath("users.xml")


  Application.Lock


  Application("users") = xmlUsers.xml


  Application.UnLock

 

Else


  xmlUsers.loadXML Application("users")

 

End If

 

Dim oUser

Set oUser = xmlUsers.selectSingleNode("users/user[@sessionId='" &


Session.SessionID & "']")

 

If oUser Is Nothing Then _


  Response.Redirect "/DocWF/Security.asp"


  

Dim sFolder

 

If VarType(Request("friendlyName")) = 0 Then


  'Get default folder for user


  sFolder = oUser.getAttribute("defaultFolder")


  ShowFilesAndFolderssFolder

 

Else


  sFolder = Request("friendlyName")


  'Check if user has access to the folder


  If IsUserOkay(sFolder) Then


    ShowFilesAndFolderssFolder


  Else


    Response.Redirect "/Security.asp"


  End If

 

End If

 

Private Sub ShowFilesAndFolders(sFolderSpec)


  Dim sAbsPath


 

  Dim fso, root, file, folder


  sAbsPath = xmlFolders.selectSingleNode("folders/folder[@friendlyName='" &


sFolderSpec &


"']").getAttribute("absolutePath")


  Set fso = Server.CreateObject("Scripting.FileSystemObject")
  Set root = fso.GetFolder(sAbsPath)

 

%>

 

<html>

 

<head>

 

<script language="JavaScript" src="/_ScriptLibrary/getfiles.js"></script>

 

</head>

 

<body>

 

 

<%


  Response.Write "<h3>" & root.Name & "</h3>"


  For Each folder In root.SubFolders


    Dim oFolder


    Set oFolder = xmlFolders.selectSingleNode("folders/folder[@absolutePath='" & folder.Path


& "']")


    If Not oFolder Is Nothing Then


      If IsUserOkay(oFolder.getAttribute("friendlyName")) Then _


        Response.Write "<imgsrc=""/DocWF/images/FolderClosed.gif""> <a href=""#""


onclick=""openFolder(this)"">" & oFolder.getAttribute("friendlyName") &

 

"</a><br>"


    End If
 

  Next


  For Each file In root.Files


    Response.Write "<imgsrc=""/images/File.gif""> <a href=""#""


onclick=""openFile(this)"">" & file.Name & "</a><br>"


  Next

 

%>

 

<form method="post" name="thisForm"><input type="hidden"

 

name="friendlyName"></form>

 

<form method="post" name="thatForm" action="GetSecureFile.asp"><input


type="hidden" name="friendlyName" value="<%=sFolderSpec%>"><input
type="hidden" name="fileName"></form>

 

 

</body>

 

</html>

<%


  Set file = Nothing


  Set folder = Nothing
  Set root = Nothing


 

  Set fso = Nothing  

 

End Sub

 

Private Function IsUserOkay(sFolderSpec)


  Dim bIsUserOkay


  bIsUserOkay = False


  If oUser Is Nothing Then


    bIsUserOkay = False


  Else


    'Get current folder


    Dim oFolder


    Set oFolder =
 

xmlFolders.selectSingleNode("folders/folder[@friendlyName='" & sFolderSpec &


"']")


    If oFolder Is Nothing Then
 

      'This folder doesn't even exist in XML


      bIsUserOkay = False


    Else
 

      'Check user's permissions by user id and group id


      Dim userId, oSecUser
      groupId = 0

 


      userId = oUser.getAttribute("id")


      Set oSecUser =
 

oFolder.selectSingleNode("users/user[@type='user'][@id='" & userId & "']")


      If oSecUser Is Nothing Then


        Dim oUserGroups, oUserGroup, groupId


        Set oUserGroups =


xmlGroups.selectNodes("groups/group[users/user/@id='" & userId & "']")


        For Each oUserGroup In oUserGroups


          groupId = oUserGroup.getAttribute("id")


          Dim oSecGroup


          Set oSecGroup =


oFolder.selectSingleNode("users/user[@type='group'][@id='" & groupId & "']")


          If Not oSecGroup Is Nothing Then


            bIsUserOkay = True


            Exit For


          End If


        Next
 

      Else


        bIsUserOkay = True


      End If


    End If


  End If


  IsUserOkay = bIsUserOkay

 

End Function

 

%>


IsUserOKay 功能会检验用户或用户群所输入的昵称是否有权限使用该功能。最后,所有的文件和文件夹的链接都会以 HTML 的格式提供给用户。除非用户有使用某个文件夹的权限,否则这个文件夹的下级目录不会显示。这些也是由 folders.xml 文件控制着。

 

当用户看到这个页面时,他们通常会点击某个文件或文件夹。该链接的 Onclick 事件管理者会将必要的资料传送给服务器。这个事件管理者在 getfiles.js 文件中,在图表 六 中你可以看到。

 

图表  六

 

functionopenFolder(obj) {


  document.thisForm.action = "";


  document.thisForm.friendlyName.value = obj.innerText;


  document.thisForm.submit();


}

 

function openFile(obj) {


  document.thatForm.fileName.value = obj.innerText;


  document.thatForm.submit(); 
}

 

当用户点击一个文件夹,该页面会将昵称设置为隐藏,并提交该窗体。这些信息会被提交到 GetFiles.asp 页面。为了确保一切顺利,当用户点击某个文件时,另一个名为 GetSecureFile.asp 的文件会负责传送这个文件。 GetSecureFile.asp 会再次检查用户的安全信息,如果安全的话,然后会以八个字节为单位将这些字节串传送这些文件。在图表 七 中你可以看到这一步的一些编码。

 


图表 七

 

<%

 

Option Explicit

 

Dim xmlUsers

 

Set xmlUsers = Server.CreateObject("MSXML2.DOMDocument.4.0")


xmlUsers.async = False

 

If VarType(Application("users")) = 0 Then


  xmlUsers.loadServer.MapPath("users.xml")


  Application.Lock


  Application("users") = xmlUsers.xml


  Application.UnLock

 

Else


  xmlUsers.loadXML Application("users")

End If

 

Dim oUser

 

Set oUser = xmlUsers.selectSingleNode("users/user[@sessionId='" &


Session.SessionID & "']")

 

 

If oUser Is Nothing And Request.ServerVariables("LOGON_USER") = "" Then


  RequestAuthenticate

 

Else


  If Request.ServerVariables("LOGON_USER") <> "" Then


    Login Request.ServerVariables("LOGON_USER")
  End If

 

 

End If

 

Private Sub Login(strUserName)


  Dim oUserNode


  Set oUserNode = xmlUsers.selectSingleNode("users/user[@username='" &


LCase(strUserName) & "']")


  If oUserNode Is Nothing Then


    Session.Abandon


    RequestAuthenticate


  Else


 

    Application.Lock


    oUserNode.setAttribute "sessionId", Session.SessionID


    xmlUsers.save(Server.MapPath("users.xml"))


    Application("users") = xmlUsers.xml


    Application.Unlock


    Response.Redirect "GetFiles.asp"
  End If

 

 

End Sub

 

Private Sub RequestAuthenticate()


  Response.Status = "401 Unauthorized"


  Response.AddHeader "WWW-Authenticate", "Basic"

 

%>

 

<html>

 

<body>

 

<h1>You are not authorised to view this page.</h1>

 

</body>

 

</html>

 

<%


  Response.End

 

End Sub

 

%>

 
 



更多
  您可能感兴趣的文章推荐  
 
上一篇:实力验证JSP运行环境的三种方案 下一篇:具体介绍Asp中优化分页的基本方法
协策网络公司拥有专业的网站建设开发团队,超过四年以上的网站建设、网页制作经验,我们可承接企业电子商务网站建设、企业展示型网页设计和功能型网站制作等各类型网站设计制作。
     
首 页  |  基础服务  |  网站建设  |  网站优化  |  成功案例  |  协策博客  |  关于我们  |  联系我们
COPYRIGHT © 上海协策网络科技有限公司 2008-2014 网站地图 SITEMAP 上海做网站公司 沪ICP备08009778号

地址:上海市共和新路425号凯鹏国际大厦13楼G座(近3、4、8号线)

电话:021-51085186 传真:021-56555059 咨询:+(86)18018609689
上海做网站建设网页设计制作公司