系统采用表单验证,在Secret目录中有Protected.aspx页面,允许角色为Admin的用户访问。现在用户A的Role是Mana,访问Protected.aspx权限不够,但是成功登录后还是停留在Login.aspx上。我想让他在登录后权限不够的情况下重定向到我指定的一页,或者给出个“权限不够”的提示。哪位大侠知道怎么处理吗?谢谢。

解决方案 »

  1.   

    try
    {
    if(Session["Role"].ToString()!="Admin")
    {
     Response.Redirect("我指定的页");
    }
    }
    catch
    {
    Response.Redirect("我指定的页");
    }
      

  2.   

    但是这样写比较不灵活,这个Admin是在Web.Config里定义的。我是想根据Web.Config里的
    <allow roles="Admin" />来判断的.难道要解析Web.config吗?有没有更好的办法呢?
      

  3.   

    <location path="Validate/ValidationCodeImg.aspx">
    <system.web>
    <authorization>
    <allow users="?" />
    </authorization>
    </system.web>
    </location>
      

  4.   

    bitsbird(一瓢 单身走我路) ,老大,能稍微解释一下吗?你这段配置文件是不是控制"Validate/ValidationCodeImg.aspx"允许匿名用户访问,能把权限不够的用户重定向到"Validate/ValidationCodeImg.aspx"这页吗?
      

  5.   

    呵呵,并不是文不对题啦,他是教你用FORMS认证,算了,杂们先不看“一漂”的方法(别骂偶,呵喝)
    我给你个SESSION的判断的登陆的离子看看哦看清楚哦,我是用VB。NET,你适当可以转换成你的C#,如果你是VB。NET的正好。。这是我的代码,你适当参考,修改修改就可以了!这样你应该就能看懂啦!login.aspx页面代码Public Class login
        Inherits System.Web.UI.Page#Region " Web 窗体设计器生成的代码 "    '该调用是 Web 窗体设计器所必需的。
        <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()    End Sub
        Protected WithEvents admin_user As System.Web.UI.WebControls.TextBox
        Protected WithEvents RequiredFieldValidator1 As System.Web.UI.WebControls.RequiredFieldValidator
        Protected WithEvents admin_pass As System.Web.UI.WebControls.TextBox
        Protected WithEvents RequiredFieldValidator2 As System.Web.UI.WebControls.RequiredFieldValidator
        Protected WithEvents button1 As System.Web.UI.WebControls.Button
        Protected WithEvents button2 As System.Web.UI.WebControls.Button    '注意: 以下占位符声明是 Web 窗体设计器所必需的。
        '不要删除或移动它。
        Private designerPlaceholderDeclaration As System.Object    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
            'CODEGEN: 此方法调用是 Web 窗体设计器所必需的
            '不要使用代码编辑器修改它。
            InitializeComponent()
        End Sub#End Region    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            '在此处放置初始化页的用户代码
        End Sub    Private Sub button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button2.Click
            admin_user.Text = ""
            admin_pass.Text = ""
        End Sub    Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click        If admin_user.Text.Trim <> "" Or admin_pass.Text.Trim <> "" Then
                Dim conn As SqlClient.SqlConnection
                Dim cmd As SqlClient.SqlCommand
                Dim rs As SqlClient.SqlDataReader
                'Dim count As Integer            conn = New SqlClient.SqlConnection(ConfigurationSettings.AppSettings("shujuku"))
                cmd = New SqlClient.SqlCommand("select top 1 * from mn_admin where admin_name='" & admin_user.Text.Trim & "' and admin_pass='" & admin_pass.Text.Trim & "'", conn)
                conn.Open()
                rs = cmd.ExecuteReader            If rs.Read Then
                    Session("admin") = admin_user.Text.Trim
                    Session("fage") = rs("fage")        '权限字段
                    If Session("fage")="admin" Then
                       Response.Write("<script>alert('恭喜您登陆成功!');location.href='admin_index.aspx';</script>")
                    Else
                       Response.Write("<script>alert('普通管理员不能进入超级管理页面');location.href='user_index.aspx';</script>")
                    End If
                Else
                    Response.Write("<script>alert('对不起登陆失败!');</script>")
                End If
                rs.Close()
                cmd.Dispose()
                conn.Close()
                conn.Dispose()
            Else
                Response.Write("<script>alert('请把信息填写完整!');</script>")
            End If
        End Sub
    End Class这样很清楚啦,呵呵,你看看,给分哦,西西!。-_-!
      

  6.   

    首先非常感谢bitsbird、hackate。
    TO:hackate 这里Session("fage")="admin",这个admin的角色就定得比较死了。
    我的情况是这样:
       有个sysMana(系统管理)文件夹,这里放的是系统管理的一些页面。在这个页面里允许角色为Admin、和DeptMana(超级管理员和部门经理)访问。在web.config里可以进行相应的设置,并且在Application_AuthenticateRequest事件中映射数据库中用户的角色和web.config里可以达到相应的效果(具体如何达到,我想各位大侠应该都了解,我就不赘叙了)。现在的情况是:如果登录的用户的角色不是Admin、DeptMana的话,他不是授权用户,那么她就会跳转到登录页。我是想达到如果是权限不够的用户,能让她重定向到指定页面,但权限的判断不要写死在代码中。
    比如按hackate、seaonce(一块烂菜)的写法,如果权限比较多的话,那么我的if判断就很频繁了。
    但bitsbird(一瓢 单身走我路)大侠的写法,我没看出来对这个问题有什么效果,可能是跟我刚接触asp.net有关,如果大侠能现身说法,感激之至。
    TO ALL:
       期盼大家能继续帮我找找解决方案。
      

  7.   

    比如按hackate、seaonce(一块烂菜)的写法,如果权限比较多的话,那么我的if判断就很频繁了。其实我个人觉得真的没什么啊!也最多也写不到多少,FORMS验证我也还不是很懂,,不过效果跟SESSION我觉得也差不到那里去,如果你讨厌代码很多的呢,那么你可以把判断写到类里面吧!
      

  8.   

    要是偶就这么办
    首先把Protected.aspx整到一个另一个文件夹,以便与其它需要窗体验证的文件分开.
    在Protected.aspx中编写代码进行数据库验证方式,在数据库开辟一个关于权限的字段,这样可以根据提交的表单数据和数据库进行验证,跟据反回的结果你就可以用IF随心所欲了.
      

  9.   

    TO: kencock(寂寞农民) ,“在Protected.aspx中编写代码进行数据库验证方式”,这个验证已经由.net Framework通过web.config帮你做了。现在我的情况是验证没有问题,而是权限不够的用户我不好找地方控制。如果在每个页面的load事件中写代码控制的话,还是比较罗嗦的。
      

  10.   

    有这么麻烦吗?这种情况就别用web.config的访问授权了,设成允许
    <system.web>
    <authorization>
    <allow users="*" />
    </authorization>
    </system.web>然后,在后台,来判断用户身份:if (User.Identity.IsAuthenticated)  //判断用户是否已经通过form认证
    {
       if (Session["quanxian"].ToString=="admin")  //判断用户是否有管理员权限
         {
             合法用户....开始执行....
         }
       else
         {
              跳转权限不够页面
         }
    }
    else
    {
       Response.Redirect("login.aspx?from="+Request.Url);  //没有通过验证,跳转登录页面
    }
    在login.aspx里,用户登录成功后,向Session["quanxian"]中写入用户的权限,这样,无论哪个用户访问该页,都会先判断是否已登录,未登录则跳转登录,已登录则判断权限.
      

  11.   

    罗嗦吗?就那么两行...if (User.Identity.IsAuthenticated)
                        if (Session["quanxian"].ToString=="admin")
      

  12.   

    还有个好方法,就是在login.aspx里面,判断,只要是从你那个有限制的目录返回来的,并且是已登录的(User.Identity.IsAuthenticated),就跳权限不够页面,因为,只有当登录的用户,不是admin才会从那个页面跳回login.aspx.这次不罗嗦了吧?就在login那里加2句就好了.
      

  13.   

    请问coldpanth(云之崖) ,我如何能得知“是从那个有限制的目录返回来的”呢?
    另,有没有哪位大侠知道怎么获得web.config中的    
    <authorization>
        <allow roles="Admin, DeptMana" />roles的值呢?分不够可以再加。
      

  14.   

    感觉还是用forms论证和数据库权限相结合比较好!
      

  15.   

    我正是采用Forms验证,现在的问题就是权限不够的用户怎么能让他跳转到指定页面?