zoukankan      html  css  js  c++  java
  • WebDAV介绍

     

    一.问题描述

    学生在学校实验室使用带电脑的仪器做实验一般会产生工作文档,学校为了仪器电脑安全着想,规定学生只能刻盘带走这些文档。这样做很明显会浪费,也不方便。于是是乎学校想架设这样一个网络硬盘服务器,学生做实验产生的文档上传给它,然后学生回到住处后下载这些文档,每个学生在服务器上都有一个私人存储空间,此空间用于存储他个人文档,只有他自己及其导师可以访问。服务器已存在一个用户模块,维护导师学生的关系,以及每个人的登录用户名和密码。

     

    二.开发环境:Win2003+IIS 6+WebDAV+.Net 4

     

    三.关于WebDAV

     

    1.什么是WebDAV?

    简而言之,WebDAV是一种HTTP1.1的扩展协议,可以在像操作本地文件夹一样操作服务器上的文件夹。

    2.WebDAV的优势:

    • 一套自己定义的安全完善的身份验证机制。
    • 穿墙
    • HTTPS传送数据
    • 使用一个TCP连接传送所有文件
    • 方便的客户端工具:和局域网中的文件共享一样简单使用。

    3.在IIS6上搭建WebDAV

    搭建WebDAV简单得很,只要如下步骤:

    a.添加WebDAV:进入“添加/删除Windows组件”页面,依次选择“Windows组件向导→应用程序服务器→详细信息→Internet信息服务(IIS)→详细信息→万维网服务→WebDAV发布”,按提示完成该组件的安装。

    b.启用WebDAV服务:依次点击“开始→程序→管理工具→Internet信息服务(IIS)管理器”,弹出IIS管理控制台窗口。在左侧栏中选中“Web服务扩展”,在右侧栏中选中“WebDAV”选项后点击“允许”按钮就可启用“WebDAV服务扩展”。

         c.发布共享资源:在Internet信息服务(IIS)管理器窗口中,展开“网站”选项,右键点击“默认网站”,在弹出的菜单中选择“新建→虚拟目录”,在弹出“虚拟目录创建向导”对话框,按步骤完成。

        d.测试访问:默认情况下发布的共享资源是匿名访问的,所以直接浏览器输入http://服务器IP/共享资源名称,则显示共享的目录和文件。

    4.IIS6上的WebDAV验证客户端

    从上面的搭建我们知道默认情况下发布的资源是匿名访问的,这情况比较符合公共文件夹,不能满足我这个需求:“每个学生在服务器上都有一个私人存储空间,此空间用于存储他个人文档,只有他自己及其导师可以访问。”,所以考虑其它身份验证方法。

    WebDAV有以下身份验证方法:

    • 匿名身份验证:允许任何人访问该目录。
    • 基本身份验证:以明文形式通过连接发送密码。可以截取和解读明文密码。只有在通过安全套接字层加密密码时,才能打开基本身份验证。
    • 摘要式身份验证:是将信息发布到通过 Internet 和防火墙访问的服务器上的极佳选择,因为密码在网络上是以 MD5 哈希值的形式来发送的。然而,密码以明文形式保存在 Active Directory 中。
    • 高级摘要式身份验证:是摘要式身份验证的改进形式,因为除了以 MD5 哈希值形式通过网络发送密码外,密码还以 MD5 哈希值的形式(而不是明文形式)保存在 Active Directory 中。这使得高级摘要式身份验证成为将信息发布到通过 Internet 和防火墙访问的服务器的最佳选择。
    • 集成 Windows 身份验证:是一种安全的验证形式,因为在通过网络发送用户名和密码之前,先将它们进行哈希计算。用户的浏览器通过与 Web 服务器进行密码交换(包括散列)来证明其知晓密码。
    • .NET Passport身份验证:使用 cookies 来验证用户凭据。

    比较选择:

    • 匿名身份验证:没什么可说的了。
    • 集成 Windows 身份验证:必须创建 Windows 用户帐户,并设置相应的 NTFS 权限。可行,为每个人创建Windows用户帐户,并且对每个人的目录设置对应学生及其导师的权限。
    • 摘要式身份验证:针对 Windows 域服务器创建的,用户必须拥有存储在域控制器上的 Active Directory 中的有效 Windows 用户帐户。
    • 高级摘要式身份验证:同上。
    • .NET Passport身份验证:没搞懂。

    四.实现思路

        本来我是打算不想用“集成 Windows 身份验证”实现,而是连接数据库验证。但我找遍资料,发现IIS6本身已实现WebDAV协议,也就是说实现WebDAV协议的身份验证机制,也没提供通过连接数据库验证机制,除非自己写代码实现WebDAV协议。事实上Apache服务器的mod_dav模块支持数据库验证。

    无办法,现在的实现思路是:WebDAV使用集成 Windows 身份验证;为当添加用户时,为该用户创建一个Windows用户帐户和私人目录,并把用户添加到私人目录,如果用户是学生还要把其导师添加到其私人目录,分配权限。

    这里涉及的技术问题有:1.创建目录,添加目录用户权限;2.创建Windows用户。

    五.实现

    我创建了一个测试项目,写下的代码是实现的核心代码。

    首先,创建以下窗体,目录位置就是WebDAV发布资源的位置:

    image

        以下是实现代码:

    001using System;
    002using System.Collections.Generic;
    003using System.ComponentModel;
    004using System.Data;
    005using System.Drawing;
    006using System.Linq;
    007using System.Text;
    008using System.Windows.Forms;
    009using System.IO;
    010using System.Diagnostics;
    011using System.Security.AccessControl;
    012using System.DirectoryServices;
    013 
    014namespace WebDisk
    015{
    016    public partial class Form1 : Form
    017    {
    018        public Form1()
    019        {
    020            InitializeComponent();
    021        }
    022 
    023        private void button2_Click(object sender, EventArgs e)
    024        {
    025            if (folderBrowserDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    026            {
    027                textBox3.Text = folderBrowserDialog1.SelectedPath;
    028            }
    029        }
    030 
    031        private void button1_Click(object sender, EventArgs e)
    032        {
    033            var user = textBox1.Text;
    034            var passwd = textBox2.Text;
    035            var userpath = textBox3.Text + "\\" + user;
    036 
    037            try
    038            {
    039                mddir(userpath);
    040                CreateLocalUser(user, passwd, userpath);
    041                addpathqx(userpath, user, "完全控制");
    042            }
    043            catch (Exception ex)
    044            {
    045                MessageBox.Show(ex.Message, ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error);
    046                return;
    047            }
    048            MessageBox.Show("OK");
    049        }
    050 
    051        //创建目录
    052        public bool mddir(string pathname)
    053        {
    054            if (!Directory.Exists(pathname))
    055            {
    056                Directory.CreateDirectory(pathname);
    057                return true;
    058            }
    059            else
    060            return false; }
    061        }
    062 
    063        //创建Windows帐户
    064        public static void CreateLocalUser(string username, string password, string description)
    065        {
    066            DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer");
    067            DirectoryEntry NewUser = AD.Children.Add(username, "user");
    068            NewUser.Invoke("SetPassword"new object[] { password });
    069            NewUser.Invoke("Put"new object[] { "Description", description });
    070            NewUser.CommitChanges();
    071        }
    072 
    073        //给目录添加用户
    074        public void addpathqx(string pathname, string username, string qx)
    075        {
    076            DirectoryInfo dirinfo = new DirectoryInfo(pathname);
    077            if ((dirinfo.Attributes & FileAttributes.ReadOnly) != 0)
    078            {
    079                dirinfo.Attributes = FileAttributes.Normal;
    080            }
    081            //取得访问控制列表
    082            DirectorySecurity dirsecurity = dirinfo.GetAccessControl();
    083            // string strDomain = Dns.GetHostName();
    084            switch (qx)
    085            {
    086                case "完全控制":
    087                    dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.FullControl, AccessControlType.Allow));
    088                    break;
    089                case "只读":
    090                    dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.Read, AccessControlType.Allow));
    091                    break;
    092                case "写入":
    093                    dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.Write, AccessControlType.Allow));
    094                    break;
    095                default:
    096                    dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.FullControl, AccessControlType.Deny));
    097                    break;
    098            }
    099 
    100            dirinfo.SetAccessControl(dirsecurity);
    101 
    102            //取消目录从父继承
    103            DirectorySecurity fs1 = System.IO.Directory.GetAccessControl(pathname);
    104            fs1.SetAccessRuleProtection(truefalse);
    105            System.IO.Directory.SetAccessControl(pathname, fs1);
    106 
    107            //AccessControlType.Allow允许访问受保护对象//Deny拒绝访问受保护对象
    108            //FullControl、Read 和 Write 完全控制,读,写
    109            //FileSystemRights.Write写入//Delete删除 //DeleteSubdirectoriesAndFiles删除文件夹和文件//ListDirectory读取
    110            //Modify读写删除-修改//只读打开文件和复制//
    111        }
    112 
    113    }
    114 
    115}

     

    这里要注意的是addpathqx方法里“取消目录从父继承”这段代码很重要,他保存只有设定用户才能访问该目录。没有这段代码创建的目录安全如下图所示:image

    目录继承了其父目录的权限,结果是除了d用户以外的其它用户也可以读写该目录。加入这段代码创建的目录安全后如下图:

     image

        只有c用户才可以访问。

     

    六.像操作本地文件夹一样操作WebDAV发布的资源

        前提是Windows操作系统。

        1.点击开始->运行->输入services.msc->弹出服务管理窗口->找到并启动名称为WebClient服务:

    image

    2.打开资源管理器->点击菜单工具->点击映射网络驱动器->输出用户名和密码->OK!

     image

     

    完。

     

     

    参考资料:

    1.百度百科:WebDAV http://baike.baidu.com/view/974023.htm

    2.利用Webdav实现文件共享和传输http://www.cnblogs.com/njnudt/archive/2009/01/14/1375524.html

    3.WebDAV搭建廉价跨网方案http://www.pcdog.com/a/19/10/j212719.html

    4.管理 WebDAV 安全性 http://technet.microsoft.com/zh-cn/library/cc779784(WS.10).aspx

    5.c# 目录添加用户权限 在线解压RAR好用了 http://blog.sina.com.cn/s/blog_4c6e822d0100ibm7.html?retcode=0

    6.C#添加或取消文件(夹)从上级继承权限 http://blog.csdn.net/XiaNao16888/archive/2010/01/15/5195516.aspx

    7.Creating a windows user account http://www.eggheadcafe.com/community/aspnet/2/10012376/creating-a-windows-user-account.aspx

  • 相关阅读:
    可以自己设计和定的报表工具!
    金山词霸取词冲突
    SSRS 2008 Domain User Issue
    第一次用AX2009正式版!
    顶级会议及期刊
    Python基础常识
    Ubuntu系统下查看安装的CUDA和CUDNN的版本
    js内字符串转数组的基本方法
    JavaScript之逻辑分支
    JS入门
  • 原文地址:https://www.cnblogs.com/lexus/p/2210805.html
Copyright © 2011-2022 走看看