本文转自: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. 在IIS7中使用ARR(Application Request Routing)反向代理虚拟目录到Nodejs站点

    目标: 1.访问www.arrdemo.com/proxy 跳转到 localhost:8898的Nodejs站点 2.Nodejs站点的页面可以返回到浏览器,包括js,css,图片 3.Nodejs ...

  2. sql跨数据库转移

    结构一样的话insert into 数据库A.dbo.TableAselect * from 数据库B.dbo.TableA 另外:nsert into DDD(字段1,字段2,字段3 .....)( ...

  3. 合并多个dll为一个dll

    有时候自己写个小工具或者其它啥的物件,引用了好多第三方控件,如log4net,aspnetpager啥的,发布出去让别人看到自己竟然用了这么多的第三方DLL, 会对自己的能力产生怀疑,那有什么办法可以 ...

  4. solr 学习片段

    全文检索技术——Solr 1 主要内容 1.站内搜索技术选型 2.什么是solr Solr和lucene的区别 3.solr服务器的安装及配置 Solr整合tomcat Solr的演示 4.维护索引 ...

  5. Spring管理 hibernate 事务配置的五种方式

    Spring配置文件中关于事务配置总是由三个组成部分,DataSource.TransactionManager和代理机制这三部分,无论是那种配置方法,一般变化的只是代理机制这块! 首先我创建了两个类 ...

  6. 批处理清除VisualStudio解决方案文件夹

         有很多次我们需要手工来删除bin, obj这样的文件夹.这些文件夹是由Visual Studio编译项目时生成的,其中包括了当前项目的程序集.一个解决方案会包含好多个项目了,那么就有很多这样 ...

  7. jdk1.8 ThreadPoolExecutor实现机制分析

    ThreadPoolExecutor几个重要的状态码字段 private static final int COUNT_BITS = Integer.SIZE - 3; private static ...

  8. [Tool] 使用Sublime Text开发Objective-C

    [Tool] 使用Sublime Text开发Objective-C 前言 随着iPhone的热卖,开发iPhone APP所使用的Objective-C,也慢慢成为了热门的程序语言之一.本篇文章介绍 ...

  9. ASP.NET控件绑定数据源

    DataList/GridView/Repeater DataSet表示数据集,其中包含表,约束和表之间的关系.与现有数据源的交互通过DataAdapter来控制. 源代码示例: SqlDataAda ...

  10. Backbone学习笔记一Backbone中的MVC

    原文章地址http://bigdots.github.io/2015/12/01/Backbone学习笔记(一)/#more Backbone.js为复杂WEB应用程序提供模型(models).集合( ...