本文转自:http://www.cnblogs.com/fishtreeyu/archive/2011/01/29/1947421.html

一般网站后台页面除了登录页面login.aspx未登录用户可访问外,其它页面必须登录用户才可访问,

当用户未登录时进入某个页面则自动判断并跳转到登录页面:

(如果login.aspx页面用到图片及Css、Js文件,那么也必须允许未登录用户可访问Images、Css、Js文件夹)

方法一:运用页面基类BasePage.cs

1、BasePage.cs代码:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/*
 * 创建人:余泳彬
 * 创建时间:2011-1-17 11:13:32
 * 说明:页面基类
 * 版权所有:余泳彬
 */
using System;
using System.Collections.Generic;
using System.Web;
 
namespace Common
{
    /// <summary>页面基类</summary>
    public class BasePage : System.Web.UI.Page
    {
 
        /// <summary>
        /// 应用程序路径 如:/YongbinWeb/ 或 /
        /// </summary>
        public string ApplicationPath
        {
            get
            {
                string path = HttpContext.Current.Request.ApplicationPath.ToString();
                if (path.Trim() != "/") // 判断路径是否为“/”
                {
                    path += "/";
                }
                return path;
            }
        }
 
 
        /// <summary>
        /// 重写页面预处理事件(在页面初始化开始时引发)
        /// 验证用户是否登录
        /// </summary>
        protected override void OnPreInit(EventArgs e)
        {
            //判断会员是否登录,若未登录则跳转到登陆页面
            if (Session["admin"] == null)
            {
                this.Response.Redirect(ApplicationPath + "/admin/login.aspx", true);
                return;
            }
            base.OnPreInit(e);
        }
 
    }
}

2、后台需设置权限的页面.aspx.cs代码(继承BasePage类即可):

1
2
3
4
5
6
7
public partial class admin_ad_edit : BasePage
{
    protected void Page_Load(object sender, EventArgs e)
    {
 
     }
}

 

  方法二:运用.Net内置票据认证

1、  在根目录建立一个全局应用程序类Global.asax文件,拷入一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {
            // .Net 内置票据认证代码
            if (HttpContext.Current.User != null)
            {
                if (HttpContext.Current.User.Identity.IsAuthenticated)  // 验证过的一般用户才能进行角色验证 
                {
                    if (HttpContext.Current.User.Identity is FormsIdentity)
                    {
                        FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
                        FormsAuthenticationTicket tiecket = id.Ticket;  // 取得身份验证票 
                        string userData = tiecket.UserData;    // 从UserData中恢复role信息
                        string[] roles = userData.Split(',');       // 将角色数据转成字符串数组,得到相关的角色信息
                        HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id, roles);  // 这样当前用户就拥有角色信息了
                    }
                }
            }
 
        }

2、  在web.config 文件中配置目录权限及登录页 

A、登录页,在system.web节点中

1
2
3
4
5
6
7
8
<!--
    票据认证配置:登陆页。
    通过 <authentication> 节可以配置 ASP.NET 用来
    识别进入用户的安全身份验证模式。
-->
<authentication mode="Forms">
    <forms name="mycook" loginUrl="Admin/login.aspx" protection="All" path="/"/>
</authentication>

注:其中 Admin/login.aspx为若未登录则跳转的目标页面,这里跳转到登陆页

B、配置目录权限,在system.web节点外面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!--票据认证配置:目录访问权限-->
<location path="Admin">
    <system.web>
        <authorization>
            <allow roles="admin"/>   <!--允许指定admin角色用户可访问-->
            <deny users="*"/>          <!-- 禁止所有非指定访问用户的访问-->
        </authorization>
    </system.web>
</location>
<!--所有用户均可访问登录页面-->
<location path="Admin/login.aspx">
    <system.web>
        <authorization>
            <allow users="*"/>
        </authorization>
    </system.web>
</location>
<!--所有用户均可访问skin文件夹(css,images文件)-->
<location path="Admin/skin">
    <system.web>
        <authorization>
            <allow users="*"/>
        </authorization>
    </system.web>
</location>

3、  在登录页的登录事件中的登录成功后拷入一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//  登陆事件
protected void btnLogin_Click(object sender, ImageClickEventArgs e)
{
    string name = txtName.Text.Trim();  // 用户名
    string pwd = txtPassWord.Text.Trim();  // 密码
    if (name == "yongbin" && pwd == "123456")
    {
        // 登录成功,内置票据认证拷入代码
        HttpCookie cook;
        string strReturnURL;  // 登录成功后返回的URL
        string roles = "admin"; // 用户角色
        // 建立身份验证票对象
        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
            1, name, DateTime.Now, DateTime.Now.AddMinutes(30), false, roles);
        cook = new HttpCookie("mycook");
        cook.Value = FormsAuthentication.Encrypt(ticket);
        Response.Cookies.Add(cook);
        strReturnURL = Request.Params["ReturnUrl"];
        if (strReturnURL != null)
        {
            Response.Redirect(strReturnURL);
        }
        else
        {
            Response.Redirect("Default.aspx");
        }
 
    }
}

注:其中的url参数ReturnUrl为未登录时浏览的页面,

比如,用户未登录便浏览Admin目录下的 link_list.aspx页面,那么就自动跳转到登陆页面login.aspx,

这时候地址栏显示的URL形式是:http://localhost:2017/Admin/login.aspx?ReturnUrl=%2fAdmin%2flink_list.aspx

如果登陆后,我们要取得登陆的用户名可以这样取得,如:litUserName.Text = User.Identity.Name;

到这里,.Net基本的票据验证就成功了! 

另外:如果我们的网站是有两个文件夹需要分别用到票据认证,那怎么办呢?

比如后台的页面Admin目录,以及前台的会员中心页面User目录,因为这两个目录所用的登录页面不一样,所以就不能用同一个票据认证了;

可修改如下:

1、修改web.config文件

A、修改<authentication>节点:

1
2
3
4
5
6
<authentication mode="Forms">
    <!--后台Admin目录权限-->
    <!--<forms name="mycook" loginUrl="Admin/login.aspx" protection="All" path="/"/>-->
    <!--跳转到login_direct.aspx,在login_direct.aspx页面判断是从Admin目录还是User目录中的页面点进来的-->
    <forms name="mycook" loginUrl="login_direct.aspx" protection="All" path="/"/>
</authentication>

B、增加User目录权限控制:

1
2
3
4
5
6
7
8
9
<!--票据认证配置:前台User目录访问权限-->
<location path="User">
    <system.web>
        <authorization>
            <allow roles="user"/>
            <deny users="*"/>
        </authorization>
    </system.web>
</location>

2、建立login_direct.aspx页面,用于判断用户是从Admin目录还是User目录中的页面点击进来的,并跳转到相应目录页面,

login_direct.aspx.cs代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
namespace Yongbin.Shop.Web
{
    public partial class login_direct : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                string strReturnURL = Request.Params["ReturnUrl"];
                if (strReturnURL != null && strReturnURL.Contains("Admin")) //Admin目录
                {
                    Response.Redirect("Admin/login.aspx?ReturnUrl="+strReturnURL);
                }
                else
                {
                    Response.Redirect("Index.aspx?ReturnUrl=" + strReturnURL);
                }
            }
        }
    }
}

注:如果URL中的ReturnUrl参数含有Admin说明是从后台的Admin目录中跳转过来的,否则是从前台的User目录跳转过来的,这里前台的登陆框放在首页,因此User目录页面自动跳转到首页

3、前台的登录功能代码和后台一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// 登陆
protected void lbtnLogin_Click(object sender, EventArgs e)
{
    string name = txtName.Text.Trim();
    string pwd = txtPwd.Text.Trim();
    if (name.Length == 0 || pwd.Length == 0)
    {
        Yongbin.Shop.Utility.WebHelper.Alert(this, "请填写用户名和密码");
        return;
    }
 
    bool b = new Yongbin.Shop.DAL.UserDAO().Login(name, pwd);
    if (b)
    {
        // 登录成功,内置票据认证拷入代码
        HttpCookie cook;
        string strReturnURL;  // 登录成功后返回的URL
        string roles = "user"; // 用户角色
        // 建立身份验证票对象
        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
            1, name, DateTime.Now, DateTime.Now.AddMinutes(30), false, roles);
        cook = new HttpCookie("mycook");
        cook.Value = FormsAuthentication.Encrypt(ticket);
        Response.Cookies.Add(cook);
        strReturnURL = Request.Params["ReturnUrl"];
        if (strReturnURL != null && strReturnURL.Contains(".aspx"))
        {
            Response.Redirect(strReturnURL);
        }
        else
        {
            Response.Redirect("Index.aspx");
        }
 
    }
    else
    {
        Yongbin.Shop.Utility.WebHelper.Alert(this, "用户名或密码错误");
        return
    }
}

[转]后台页面访问权限:页面基类&内置票据认证 使用方法的更多相关文章

  1. 《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)

    1.简介 上一篇宏哥介绍了如何设计支持不同浏览器测试,宏哥的方法就是通过来切换配置文件设置的浏览器名称的值,来确定启动什么浏览器进行脚本测试.宏哥将这个叫做浏览器引擎类.这个类负责获取浏览器类型和启动 ...

  2. 多态,封装,反射,类内置attr属性,os操作复习

    1.多态 #多态 多态是指对象如何通过他们共同的属性和动作来操作及访问,而不需要考虑他们具体的类 运行时候,多种实现 反应运行时候状态 class H2O: def __init__(self,nam ...

  3. angularjs中的页面访问权限设置

    11月在赶一个项目,这阵子比较忙,挤挤时间更一篇博客吧,如标题所述说说在ng中页面访问权限控制的问题,水平有限各位看官见谅: 在以往的项目中,前后端常见的配合方式是前端提供页面和ui加一点DuangD ...

  4. Asp.net 页面访问模板页的属性

    首先 页面需要添加下面一段代码 <%@ MasterType VirtualPath="~/User/User.Master" %> 添加的位置如图 这样就可以在这个页 ...

  5. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  6. System.Web.UI.Page的页面基类

    服务器端的page类 所有我们编写的页面都继承自page类,可见page类是非常重要的,page类提供了哪些功能,直接决定了我们的页面类可以继承什么功能,或者说,直接决定了我们的页面类功能的强大与否! ...

  7. 继承System.Web.UI.Page的页面基类

    服务器端的page类      所有我们编写的页面都继承自page类,可见page类是非常重要的,page类提供了哪些功能,直接决定了我们的页面类可以继承什么功能,或者说,直接决定了我们的页面类功能的 ...

  8. Chapter6_访问权限控制_类的访问权限

    在Java中,访问权限修饰词也可以用于确定库中的哪些类对于该库的使用者是可用的,类既不可以是private也不可以是protected的,对于类的访问权限,只有两种选择:包访问权限或者public.下 ...

  9. vue-router导航守卫,限制页面访问权限

    在项目开发过程中,经常会需要登录.注册.忘记密码等,也有很多页面是需要登录后才能访问,有些页面是无需登录就可以访问的,那么vue是怎么来限制这些访问权限问题的呢? vue-router导航守卫的bef ...

随机推荐

  1. SqlServer定时备份数据库和定时杀死数据库死锁解决

    上周五组长对我说了一句要杀死数据库的死锁进程,有时候同一时刻不停写入数据库会造成这种情况的发生,因为自己对数据库不是很熟悉,突然组长说了我也就决定一定要倒腾一下,不然自己怎么提高呢?现在不研究,说不定 ...

  2. Python on VS Code

    install python extension Press F1, and input "ext install python". Then the icon at the le ...

  3. Javascript定时跳转

    因为做项目,用到跳转回上级页面,这里设置定时3秒跳转到目标页面 <script> setInterval("myInterval()",3000);//1000为1秒钟 ...

  4. 初识HTTP协议

    本篇文章从概念上初识HTTP协议,参考链接:http://www.runoob.com/http/http-tutorial.html 目录: 一.HTTP协议    HTTP 工作原理    HTT ...

  5. How to upgrade workflow assembly in MOSS 2007

    This problem generally start when you are having an existing custom workflow and there are instances ...

  6. android 学习运用海马模拟器教程与android环境的搭建

    第三方海马玩模拟器 第一天的学习android采用的模拟器是海马,因此就分享给大家海马模拟器的相关步骤: 海马玩模拟器官网: http://droid4x.haimawan.com 下载相关平台的模拟 ...

  7. 【原】iOSCoreAnimation动画系列教程(一):CABasicAnimation【包会】

    本文的最新版本已经发布在简书[编程小翁]上,强烈建议到上查看简书,[点击这里跳转]. 在iOS中,图形可分为以下几个层次: 越上层,封装程度越高,动画实现越简洁越简单,但是自由度越低:反之亦然.本文着 ...

  8. Pinyin Comparison 拼音辨别 V1.1.2

    App Store: Pinyin Comparison 拼音辨别 做了一新个图标,至少比上一个好多了.拼音应用的图标大多千篇一律,这回尝试做个不一样的. 简化了首页颜色,首页的黑色换成了金色,看着更 ...

  9. Android开发笔记——常见BUG类型之内存泄露与线程安全

    本文内容来源于最近一次内部分享的总结,没来得及详细整理,见谅. 本次分享主要对内存泄露和线程安全这两个问题进行一些说明,内部代码扫描发现的BUG大致分为四类:1)空指针:2)除0:3)内存.资源泄露: ...

  10. MAC OS Finder 中快速定位指定路径

    在看一些 tip 文章的时候,时不时会有需要进到某某目录替换文件之类的步骤.如果碰上这个目录层次够多,一层一层的点击既麻烦又容易出错,有什么快捷的办法呢? 快捷键:Shift + Command + ...