一个大站点,有不同的访问目录。归结下有三大类型访问目录:
前台未登录会员用户目录;前台登录会员操作目录;系统管理员后台操作目录
文件夹假设如下:站点文件夹(website)
下面:UserFolder(前台登录会员才可访问)、ManageFolder(系统管理员后台操作目录)
其他非在上面提到的两个文件夹内,在整个站点(WebSite文件夹根目录下的全部页面)----可被任意匿名用户访问(前台未登录会员用户目录)
注:前台登录会员的登录路径和系统管理员的后台登录路径是不一样的。============================
SQL表形式:前台会员用户表UserTable   、系统后台用户表ManageTable
=============================
WebConfig: 配置
  <authentication mode="Forms"/ >
底下限制目录访问不知道怎么配置====================================================
.cs代码:
可以理解基于该原理验证机制。但FormsAuthenticationTicket()类中roles这个用户数据,跟WebConfig的Role节有关。我不知道要填写什么,另外我想可由系统后台来配置哪些目录可被不同类型的用户来访问,哪些是不允许访问。我要怎么来设立roles这个具体值。

解决方案 »

  1.   

    可能我刚看到svn的一篇文章,刚看,整个思维还没很好链接。懂的人能指点下吗?
      

  2.   

    在每个目录下面建立web.config文件
    以下是一个例子
        <system.web>
            <authorization>
                <deny users="?" />
            </authorization>
        </system.web>
    表示禁止匿名用户访问如果你用Visual Studio2005的话 选网站菜单 点下面的asp.net配置 可以自动打开一个页面 进行相应内容的配置 不必写xml文件那么麻烦
      

  3.   

    在每个目录下面建立web.config文件 ==================??
    大哥,你的方法太原始了吧
    要是文件夹非常多,不是要写Web.config那么多个。另外以后要维护不是要疯掉
    我倒发现个web.config统一管理的
    <location path ="">......
    分享下。不过也谢谢楼上那位意见。呵呵,期待更好的
      

  4.   

    web.config中配置<location>节
    http://msdn2.microsoft.com/zh-cn/library/b6x6shw7(VS.80).aspx
    另,使用角色认证,SQL中无需自己手动建表,推荐一个网页:
    http://aspnet.4guysfromrolla.com/articles/040506-1.aspx使用工具完成数据库的设置之后,你就可以定义任意多的角色,什么样的角色可以干什么,你自己在web.config中定义就行了。.net的membership不能满足需要,你可以在其基础上进行修改。还有基于角色的访问控制中角色代表的是权限的集合,当然用户组也是基于角色的访问控制模型的一种简化实现方式。但.net的membership却是地道的基于角色的访问控制哦。
      

  5.   

    文件非常多的情况下 我们一般是把权限信息存储在数据库里面
    然后通过Users Membership Roles这三个类来取登录者的用户信息 所属的权限组等信息
      

  6.   

    asp.net中使用窗体身份验证
      

  7.   

    嗯,SWind谢谢你多次解释。你说的很对。基于Forms角色验证。我也仅仅不过是针对三类型的情况对三种“目录”的访问限制而已。
    其实上面你提到说每个目录下建立web.config也是没什么错的。不过我是觉得统一放置在一个配置文件下,相对比较好统一管理,呵呵,可能各有各不同的观点吧。不过无论怎么样都谢谢你关注我的问题。
      

  8.   

    对上面已经没什么问题了。但现在新问题是:
    ==================================
     public static void  UserLogin(string strUserName, string strRoles, bool isPersistent)
       {
           DateTime objTime = isPersistent ? DateTime.Now.AddMinutes(99999) : DateTime.Now.AddMinutes(60);  //永久过期和60分钟过期形式
           FormsAuthenticationTicket objticket = new FormsAuthenticationTicket(
                1, // 票据版本号
                strUserName, // 票据持有者
                DateTime.Now, //分配票据的时间
                objTime, // 失效时间
                isPersistent, // 需要用户的 cookie 
                strRoles, // 用户数据,这里其实就是用户的角色
                FormsAuthentication.FormsCookiePath);//cookie有效路径            //使用机器码machine key加密cookie,为了安全传送
                string strHash = FormsAuthentication.Encrypt(objticket);
                HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, strHash); //加密之后的cookie            //将cookie的失效时间设置为和票据tikets的失效时间一致 
                if (objticket.IsPersistent)
                {
                    cookie.Expires = objticket.Expiration;
                }            //添加cookie到页面请求响应中
                HttpContext.Current.Response.Cookies.Add(cookie);                  
            }我传递进来的参数分别是  tiancaolin,cnsawAdmin,false
    =====================
    <authentication mode="Forms"  >
          <forms loginUrl="aspblog/index.aspx" name=".ASPXAUTH " timeout="30" path= "/" ></forms>
        </authentication>
        
    ........................ <location path="aspblog">
        <system.web>
          <authorization>
            <allow roles="cnsawAdmin"/>
            <deny roles="cnsawUser,cnsawUnUser"/>
            <deny users="*"/>
          </authorization>      
        </system.web>      
      </location>  ==========================================
    Global.asax文件代码
     protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
        {
           HttpApplication App = (HttpApplication)sender;
            HttpContext Ctx = App.Context; //获取本次Http请求相关的HttpContext对象
            if (Ctx.Request.IsAuthenticated) //验证过的用户才进行role的处理
            {
                FormsIdentity Id = Ctx.User.Identity as FormsIdentity;
                FormsAuthenticationTicket Ticket = Id.Ticket; //取得身份验证票
                string[] Roles = Ticket.UserData.Split(','); //将身份验证票中的role数据转成字符串数组
                Ctx.User = new System.Security.Principal.GenericPrincipal(Id, Roles);        }
        }
    ====================================症状是还是无法通过角色cnsawAdmin来访问aspblog 文件夹。不知道哪错了。超级郁闷
      

  9.   

    aspblog 文件夹更改此文件夹的访问权限!
      

  10.   

    protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
        {
           HttpApplication App = (HttpApplication)sender;
            HttpContext Ctx = App.Context; //获取本次Http请求相关的HttpContext对象
            if (Ctx.Request.IsAuthenticated) //验证过的用户才进行role的处理
            {
                FormsIdentity Id = Ctx.User.Identity as FormsIdentity;
                FormsAuthenticationTicket Ticket = Id.Ticket; //取得身份验证票
                string[] Roles = Ticket.UserData.Split(','); //将身份验证票中的role数据转成字符串数组
                Ctx.User = new System.Security.Principal.GenericPrincipal(Id, Roles);        }
        } 
    ======>
    FormsAuthenticationTicket票据信息要自己写代码从回传的Cookie中解密出来的(FormsAuthentication.Decrypt)
      

  11.   

    虽然没能根据上面的各位提出见解真正解决问题。不过还是要感谢JGood提出了一个我确实忘记解密的错误。
    我的错误根源在于配置文件中那个NAME属性含有空格。结果验证不过去。谢谢各位。
      

  12.   

    JGood我曾承诺说解决了这个问题---谁要是帮我解决了我就送100分。但后面还是很多天后自己解决的。
    不过确实很感谢你那个要解密的说法帮了我很大忙。
    前一个帖子我弄了20分,为了不大想浪费分数。如果你有看到的化。请到
    http://topic.csdn.net/u/20080425/15/71baf0fe-0d3b-42d2-89ee-5592749fa13c.html
    任意留言。在帖子到期前,如果你有回的化。20分都给你,分不多。特别对星用户来说更是不怎么现眼。
    不过还是算表示我的一点感觉心意吧。