积极答复者
关于网站后台登录的问题?

问题
-
网站要求实现前台普通用户和后台管理员登录分离,就是会员用根目录的login.aspx登录,管理员用admin文件夹下的Login.aspx登录,我admin文件夹下的web.config(内容如下)应该如何配置?
我现在这样配置会自动跳转到更目录下的login.aspx(汗)。<?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings/> <connectionStrings/> <system.web> <authorization> <deny users="?" /> <allow roles="管理员"/> <allow roles="超级管理员"/> <deny users="*"/> </authorization> </system.web> </configuration>
- 已移动 孟宪会Moderator 2011年2月22日 0:48 (发件人:.NET Framework 一般性问题讨论区)
答案
-
首先,不建议使用中文作为roles的名称
再次,需要在 Global里
Application_AuthorizeRequest事件里面
进行处理,然后页面Page.User.IsInRole()里进行判断
HttpApplicationApp=(HttpApplication)sender;
HttpContextCtx=App.Context;//获取本次Http请求相关的HttpContext对象
if(Ctx.Request.IsAuthenticated==true)//验证过的用户才进行role的处理
{
FormsIdentityId=(FormsIdentity)Ctx.User.Identity;
FormsAuthenticationTicketTicket=Id.Ticket;//取得身份验证票
string[]Roles=Ticket.UserData.Split(',');//将身份验证票中的role数据转成字符串数组
Ctx.User=newGenericPrincipal(Id,Roles);//将原有的Identity加上角色信息新建一个GenericPrincipal表示当前用户,这样当前用户就拥有了role信息
}如果进行加密了,这里还得先解密
【孟子E章】- 已标记为答案 Song TianModerator 2011年3月3日 3:33
全部回复
-
晕菜,不知道为什么我上面贴的链接对应的内容和我昨天看的不一样。好在我copy了一下。我又看了一下老孟提供的,楼主请参考老孟的。这个是完整的。
我贴出昨天那个链接中关键的内容,大致和老孟的一样。
“ASP.NET实现不同角色的用户使用不同登录界面的方法,很多用户在开发 ASP.NET 应用程序时都有这样的需求:管理员角色的账户使用管理员的登录界面进行登录,普通用户角色的账户使用普通用户的登录界面进行登录。由于ASP.NET的web.config里只能使用一个 authentication mode="Forms" 节点,所以,要实现不同用户采用不同的登录界面,一个办法就是创建一个管理员专用的虚拟目录,并设置为应用程序来实现。下面介绍另外一种采用重定向的办法来解决这个问题。
本文介绍的方法原理是根据登录界面的返回地址进行判断,然后重定向到不同的页面。下面就是实现的详细过程。
1,创建一个网站,在网站里创建Admin文件夹和User文件夹,分别存放admin和普通用户所使用的文件。也可以只设置一个 Admin 文件夹。由于本方法采用的判断返回路径的方法,所以,要能从路径中区分出哪些是admin用户使用的文件夹。当然,采用其他的判断方法也是可以的。
2,在网站根目录下分别创建3个登录文件:Login.aspx、UserLogin.aspx和AdminLogin.aspx。其中Login.aspx文件起地址转换的作用,
Login.aspx文件的主要内容:
protected void Page_Load(object sender, EventArgs e)
{
String ReturnUrl = Request.QueryString["ReturnUrl"];
if (ReturnUrl == null || ReturnUrl.Equals(String.Empty))
{
//默认情况下,按普通用户进行登录
Response.Redirect("~/UserLogin.aspx");
}
else
{
if (ReturnUrl.ToLower().Contains("/admin/"))
{
Response.Redirect("~/AdminLogin.aspx?ReturnUrl=" + Server.UrlEncode(ReturnUrl));
}
else
{
Response.Redirect("~/UserLogin.aspx?ReturnUrl=" + Server.UrlEncode(ReturnUrl));
}
}” -
谢谢版主!我用你的方法实现了管理员和用户登录分离,但我管理员通过验证后,后台进不去了,是不是我admin文件夹下的web.config写的不正确?
public static bool AdminLogin(string LoginID,string PWD) { string strpwd = BitConverter.ToString((new MD5CryptoServiceProvider()).ComputeHash(Encoding.Default.GetBytes(PWD))).Replace("-", ""); bool result = dal.AdminVerify(LoginID, strpwd, out info); if (result) { FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, LoginID, DateTime.Now, DateTime.Now.AddMinutes(60), true, "管理员"); if (info.intStatus==1) { ticket = new FormsAuthenticationTicket(1, LoginID, DateTime.Now, DateTime.Now.AddMinutes(60), true, "超级管理员"); } HttpCookie hc = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket)); HttpContext.Current.Response.Cookies.Add(hc); } return result; }
这是我验证管理员的代码!
- 已编辑 雪之翼 2011年2月25日 5:15 添加代码
-
首先,不建议使用中文作为roles的名称
再次,需要在 Global里
Application_AuthorizeRequest事件里面
进行处理,然后页面Page.User.IsInRole()里进行判断
HttpApplicationApp=(HttpApplication)sender;
HttpContextCtx=App.Context;//获取本次Http请求相关的HttpContext对象
if(Ctx.Request.IsAuthenticated==true)//验证过的用户才进行role的处理
{
FormsIdentityId=(FormsIdentity)Ctx.User.Identity;
FormsAuthenticationTicketTicket=Id.Ticket;//取得身份验证票
string[]Roles=Ticket.UserData.Split(',');//将身份验证票中的role数据转成字符串数组
Ctx.User=newGenericPrincipal(Id,Roles);//将原有的Identity加上角色信息新建一个GenericPrincipal表示当前用户,这样当前用户就拥有了role信息
}如果进行加密了,这里还得先解密
【孟子E章】- 已标记为答案 Song TianModerator 2011年3月3日 3:33