[转]后台页面访问权限:页面基类&内置票据认证 使用方法

本文转自: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

    }

}

时间: 2024-12-09 22:28:18

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

angularjs中的页面访问权限设置

11月在赶一个项目,这阵子比较忙,挤挤时间更一篇博客吧,如标题所述说说在ng中页面访问权限控制的问题,水平有限各位看官见谅: 在以往的项目中,前后端常见的配合方式是前端提供页面和ui加一点DuangDuangDuang的效果,后端搭建框架数据结构和数据交互(数据交互前后端有交集),不管是.net.java or php都能一对多的提供前端服务,然而在新形式下项目中运用了前端框架,开发情况就不一样了,比如我要说的这是在angular框架下完成的开发,模式是后端提供服务和api文档,页面和数据交互及

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

首先 页面需要添加下面一段代码 <%@ MasterType VirtualPath="~/User/User.Master" %> 添加的位置如图 这样就可以在这个页面访问模板页的属性了 protected void Page_Load(object sender, EventArgs e) { Master.ComeHere();//ComeHere是在模板页定义的方法 }

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

服务器端的page类      所有我们编写的页面都继承自page类,可见page类是非常重要的,page类提供了哪些功能,直接决定了我们的页面类可以继承什么功能,或者说,直接决定了我们的页面类功能的强大与否!那么,page类实现了什么功能呢?如前所述的三个客户端的事实,页面类要管理ViewState,还要管理事件.page类起码要提供这些功能以供我们的页面类重载或者调用. page类提供了四个顺序执行的事件Init,Load,PreRender和Unload,这四个事件是一条主线,依次标明了p

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

在Java中,访问权限修饰词也可以用于确定库中的哪些类对于该库的使用者是可用的,类既不可以是private也不可以是protected的,对于类的访问权限,只有两种选择:包访问权限或者public.下面是一个例子: 1 class soup1{ 2 private soup1(){} 3 public static soup1 makesoup(){ 4 return new soup1(); 5 } 6 } 7 8 class soup2{ 9 private soup2(){} 10 pri

C#中当程序的访问权限不足时,Directory.Exists和File.Exists方法不会抛出异常报错

有些时候,我们开发的C#应用程序的执行账号,可能没有对一些文件夹和文件的访问权限,当我们使用Directory.Exists和File.Exists方法去判断这些文件夹和文件是否存在的时候,Directory.Exists和File.Exists方法并不会抛出异常报错,这两个方法会返回false,表示查找的文件夹和文件不存在.尽管文件夹和文件实际上是存在的,只是C#程序的执行账号没有权限访问而已,但是Directory.Exists和File.Exists方法还是会返回false,并不会抛出异常

[JSP][JSTL]页面调用函数--它${fn:}内置函数、是推断字符串是空的、更换车厢

页面中调用函数--之${fn:}内置函数 函数描写叙述 fn:contains(string, substring) 假设參数string中包括參数substring,返回true fn:containsIgnoreCase(string, substring) 假设參数string中包括參数substring(忽略大写和小写),返回true fn:endsWith(string, suffix) 假设參数 string 以參数suffix结尾,返回true fn:escapeXml(strin

01类内置方法

# 写一个单例类# __名子__ # 类中的特殊方法.内置方法 # 双下方法 # 魔法方法 # __call__ flask# __new__ 特别重要 写一个单例类# __len__# __str__ /__repr__ __call__ # __call__ flask class A: def __call__(self, *args, **kwargs): print("执行__call__方法") # # a = A() # a() # 对象加()执行call方法 # A()

类内置的attr属性

python类的内置attr属性 class Foo: x=1 def __init__(self,y): self.y=y def __getattr__(self, item): print('----> from getattr:你找的属性不存在') def __setattr__(self, key, value): print('----> from setattr') # self.key=value #这就无限递归了,你好好想想 # self.__dict__[key]=valu

父页面访问iframe页面的js

父页面:parent.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equi