当用户未登录时进入某个页面则自动判断并跳转到登录页面:
(如果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
;
}
}
|