none
高手进,一个数天都解决不了的问题!!有关角色授权 RRS feed

  • 问题

  • 问题:在测试中已经实现了cookie部分的存取,读取cookie里面的userdata并建了principal对象赋值给了Context.user。错误在用IsInRole方法的时候总是报错。

    网站总的confige文件的代码:(请问这里要打开<RoleManeger enable=true/>吗?)
    <authentication mode="Forms">
       <forms name=".ASPXAUTH" loginUrl="/login.aspx" timeout="30" path="/">
       </forms>
      </authentication>

    受角色限制的teacher文件的confige文件代码:
    <configuration>
        <appSettings/>
        <connectionStrings/>

      <location path ="teacher">
        <system.web >
          <authorization >
            <deny roles ="student"/>
            <allow roles ="teacher"/>
          </authorization>
        </system.web>
      </location>
    </configuration>

    登录页面的代码:(只贴出了提交按钮点击事件的代码)
     protected void Button1_Click(object sender, EventArgs e)
        {
            string User = UserID.Text;
            string PassWord = UserPWD.Text;
            if (comfirm(User, PassWord) == true)
            {
                string Roles = UserToRoles(User);
                FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1, User, DateTime.Now, DateTime.Now.AddMinutes(30), false, Roles, "/");
                //定义并加密cookie
                string HashTicket = FormsAuthentication.Encrypt(Ticket);
                HttpCookie Cookie = new HttpCookie(FormsAuthentication.FormsCookieName, HashTicket);
                Context.Response.Cookies.Add(Cookie);
                //Context.Response.Redirect(Context.Request["ReturnUrl"]);
                Label1.Text = "登录成功";
                Label1.Visible = true;
            }
            else
            {
                Label1.Visible = true;
            }
        }
        public bool comfirm(string userID, string password)//确定用户是否成功登陆
        {
            DBclass DBmanger = new DBclass();
            string QueryString="select userID from UserNow where PassWord='"+password+"' and UserName='"+userID+"'";
            bool Query=DBmanger.QueryStr(QueryString);
            return Query;
        }
        public string UserToRoles(string User) //提取用户的数据库中的角色
        {
            DBclass DBmanger = new DBclass();
            string GetDataStr = "select Role from UserToRole where UserName='" + User+"'";
            string Roles= DBmanger.GetData(GetDataStr);
            return Roles;

        }

      全局文件的代码:
     protected void Application_AuthorizeRequest(object sender, EventArgs e)
        {
            HttpApplication App = (HttpApplication)sender;
            HttpContext Ctx = App.Context;
          
            if (Ctx.Request.IsAuthenticated)
            {
                FormsIdentity ID = (FormsIdentity)Ctx.User.Identity;
                FormsAuthenticationTicket Ticket =ID.Ticket;
                //分拆角色段字符
                string[] Roles = Ticket.UserData.Split(',') ;
                System.Security.Principal.GenericPrincipal Principal=new System.Security.Principal.GenericPrincipal(ID,Roles);
                Ctx.User = Principal;         
            }
            string Name = this.Context.User.Identity.Name;      //读取用户名
            bool TestRole=this.Context.User.IsInRole("teacher");//测试用户是否具有角色!!!!--->>>>>在这里读不到角色,总是显示为false!!!!

        }

    受限制的文件里面的页面代码:(这个应该没什么错误,为了程序完整,也贴出来了)
     protected void Page_Load(object sender, EventArgs e)
        {
            string Name = this.User.Identity.Name;
            if (Page.User.IsInRole("teacher") == false)
            {
                Response.Write("你没有访问的权限");
                Response.End();
                return;
               
            }

        }

    这个程序是仿照网上的代码,大部分是一样。我不知道是不是我的机子问题。我是使用微软的VWD内置服务器功能,没有开启IIS。。。。
       

    2009年4月15日 7:55

答案

  • 照着这个例子做就可以了
    http://social.microsoft.com/forums/zh-CN/295/thread/a29dc30a-b142-4345-861f-0944955ad68e/


    孟宪会
    2009年4月15日 9:10
    版主
  • 我不是使用VWD默认的数据库,我自己定义的数据库。你说的是使用VWD配置工具实现的角色管理吧??
    看清楚,是Application_AuthenticateRequest事件,不是 Application_AuthorizeRequest,尽管看起来很像
    代码都是亲自调试过的,你完全拷贝,注意是完全,也得不到你想要的结果?

    孟宪会
    2009年4月15日 11:47
    版主

全部回复

  • User.isinrole 

    是必须打开并且正确配置RoleManeger 才可以用的

    看来你必须实现自己的 RoleManeger 了


    另外VWD中调试membership常年出错。 不开iis是不对滴

    工作突然有点忙 嘿嘿
    2009年4月15日 8:30
  • cnblogs.com/waynebaby/archive/2006/12.html


    这里是一个我两年前作的全配置无代码使用membership例子

    可能你看的例子太繁琐  把有点都掩盖了


    工作突然有点忙 嘿嘿
    2009年4月15日 8:36
  • 照着这个例子做就可以了
    http://social.microsoft.com/forums/zh-CN/295/thread/a29dc30a-b142-4345-861f-0944955ad68e/


    孟宪会
    2009年4月15日 9:10
    版主
  • 我已经按照你给的方法做了一次 结果Isinrole还是false。。。。。
    2009年4月15日 9:53
  • 我不是使用VWD默认的数据库,我自己定义的数据库。你说的是使用VWD配置工具实现的角色管理吧??
    2009年4月15日 9:55
  • 韦恩:
    你说的是使用默认的数据库。我这个例子是自己建的数据库。所以没使用到membership。。。。。
    2009年4月15日 10:03
  • 完全没有必要采用系统提供的方法,自己查询数据库很简单。
    孟宪会
    2009年4月15日 11:45
    版主
  • 我不是使用VWD默认的数据库,我自己定义的数据库。你说的是使用VWD配置工具实现的角色管理吧??
    看清楚,是Application_AuthenticateRequest事件,不是 Application_AuthorizeRequest,尽管看起来很像
    代码都是亲自调试过的,你完全拷贝,注意是完全,也得不到你想要的结果?

    孟宪会
    2009年4月15日 11:47
    版主
  • 孟宪会:
    我这次完全按照你的方法,确实成功了。谢谢。。。。
    关于那两个事件Application_AuthenticateRequest事件,不是 Application_AuthorizeRequest的错误,我在自己的程序改了,也还是等不到true。
    我的程序代码和你给的代码大体上是一样的。至于其中的差别和错处我会继续探究,希望找出原因。
    再次感谢孟兄。。。。。

    2009年4月15日 15:25
  • 需要注意的地方有:
    1
    <deny roles ="student"/>
    <allow roles ="teacher"/>
    是有顺序要求的,如果满足了deny的设置,则不会再检查allow,所以,最好将allow放前面

    2,与RoleManeger 没有关系,无需配置 RoleManeger 节点

    3,登录转向的时候,FormsAuthentication.GetRedirectUrl还是FormsAuthentication的另外一个方法(具体名字可以查)我记得以前说是有区别的,如果一个不成,可以换另外一个,或者其他方法,我测试 使用 FormsAuthentication.GetRedirectUrl是没有问题的。

    4,另外注意一下 FormsAuthentication.Encrypt(ticket); 和FormsAuthentication.Decrypt的添加和获取方法一致,

    5,如果你自己通过数据库操作,则确保数据库记录的值是正确的,比如空格等

    6,还有if条件,判断是否满足了,

    注意以上几点,我觉得就能解决了
    孟宪会
    2009年4月16日 0:56
    版主
  • 孟宪会:
       十分感谢孟兄提出的建议,我犯的错误正是你说的第五点。现在问题解决了 。。。谢!!

    2009年4月16日 3:24