在 ASPNET 中实现不同角色的用户使用不同登录界面的方法.docx
- 文档编号:4465516
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:12
- 大小:17.70KB
在 ASPNET 中实现不同角色的用户使用不同登录界面的方法.docx
《在 ASPNET 中实现不同角色的用户使用不同登录界面的方法.docx》由会员分享,可在线阅读,更多相关《在 ASPNET 中实现不同角色的用户使用不同登录界面的方法.docx(12页珍藏版)》请在冰豆网上搜索。
在ASPNET中实现不同角色的用户使用不同登录界面的方法
在ASP.NET中实现不同角色的用户使用不同登录界面的方法
很多用户在开发ASP.NET应用程序时都有这样的需求:
管理员角色的账户使用管理员的登录界面进行登录,普通用户角色的账户使用普通用户的登录界面进行登录。
由于ASP.NET的web.config里只能使用一个authenticationmode="Forms"节点,所以,要实现不同用户采用不同的登录界面,一个办法就是创建一个管理员专用的虚拟目录,并设置为应用程序来实现。
下面介绍另外一种采用重定向的办法来解决这个问题。
本文介绍的方法原理是根据登录界面的返回地址进行判断,然后重定向到不同的页面。
下面就是实现的详细过程。
1,创建一个网站,在网站里创建Admin文件夹和User文件夹,分别存放admin和普通用户所使用的文件。
也可以只设置一个Admin文件夹。
由于本方法采用的判断返回路径的方法,所以,要能从路径中区分出哪些是admin用户使用的文件夹。
当然,采用其他的判断方法也是可以的。
2,在网站根目录下分别创建3个登录文件:
Login.aspx、UserLogin.aspx和AdminLogin.aspx。
其中Login.aspx文件起地址转换的作用,
Login.aspx文件的主要内容:
viewplaincopytoclipboardprint?
protectedvoidPage_Load(objectsender,EventArgse)
{
StringReturnUrl=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));
}
}
protectedvoidPage_Load(objectsender,EventArgse)
{
StringReturnUrl=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));
}
}
在这个文件的代码中,如果ReturnUrl中含有"/admin/",就重定向到AdminLogin.aspx登录界面;否则,就重定向到UserLogin.aspx登录界面。
UserLogin.aspx这个文件的内容如下:
viewplaincopytoclipboardprint?
<%@PageLanguage="C#"%>
<!
DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"http:
//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<mce:
scriptrunat="server"><!
--
protectedvoidButton1_Click(objectsender,EventArgse)
{
//密码验证过程在此省略,假如用户名是mxh,密码是mengxianhui
StringUserName="mxh";
FormsAuthenticationTicketticket=newFormsAuthenticationTicket(2,//票证的版本号
UserName,//与身分验证票关联的用户名
DateTime.Now,//票证发出时的本地日期和时间
DateTime.Now.AddHours
(1),//票证过期的本地日期和时间
true,//如果票证存储在持久性cookie中(跨浏览器会话保存)则为true否则为false如果票证储存在URL中,将忽略此值
"reader",//储存在票证中持定的用户信息,本页面供reader登录使用
FormsAuthentication.FormsCookiePath//票证储存在cookie中的路径
);
//如果forms元素的protection属性设置为All或Encryption,则窗体身份验证使用Encrypt方法对窗体身份验证票进行加密和签名。
stringencTicket=FormsAuthentication.Encrypt(ticket);
HttpCookiecookie=newHttpCookie(FormsAuthentication.FormsCookieName,encTicket);
Response.Cookies.Add(cookie);
Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName,true));
}
//--></mce:
script>
<htmlxmlns="http:
//www.w3.org/1999/xhtml">
<headrunat="server">
<title>孟宪会之多用户登录测试页面</title>
</head>
<body>
<formid="form1"runat="server">
普通用户登录界面省略<br/>
<asp:
ButtonID="Button1"runat="server"OnClick="Button1_Click"Text="普通用户登录"/>
</form>
</body>
</html>
<%@PageLanguage="C#"%>
<!
DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"http:
//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<mce:
scriptrunat="server"><!
--
protectedvoidButton1_Click(objectsender,EventArgse)
{
//密码验证过程在此省略,假如用户名是mxh,密码是mengxianhui
StringUserName="mxh";
FormsAuthenticationTicketticket=newFormsAuthenticationTicket(2,//票证的版本号
UserName,//与身分验证票关联的用户名
DateTime.Now,//票证发出时的本地日期和时间
DateTime.Now.AddHours
(1),//票证过期的本地日期和时间
true,//如果票证存储在持久性cookie中(跨浏览器会话保存)则为true否则为false如果票证储存在URL中,将忽略此值
"reader",//储存在票证中持定的用户信息,本页面供reader登录使用
FormsAuthentication.FormsCookiePath//票证储存在cookie中的路径
);
//如果forms元素的protection属性设置为All或Encryption,则窗体身份验证使用Encrypt方法对窗体身份验证票进行加密和签名。
stringencTicket=FormsAuthentication.Encrypt(ticket);
HttpCookiecookie=newHttpCookie(FormsAuthentication.FormsCookieName,encTicket);
Response.Cookies.Add(cookie);
Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName,true));
}
//--></mce:
script>
<htmlxmlns="http:
//www.w3.org/1999/xhtml">
<headrunat="server">
<title>孟宪会之多用户登录测试页面</title>
</head>
<body>
<formid="form1"runat="server">
普通用户登录界面省略<br/>
<asp:
ButtonID="Button1"runat="server"OnClick="Button1_Click"Text="普通用户登录"/>
</form>
</body>
</html>
这个文件将验证信息保存后,返回最初的请求页面。
注意:
这里连接数据库验证用户名和密码的过程省略过去了。
AdminLogin.aspx这个文件的全部内容如下:
viewplaincopytoclipboardprint?
<%@PageLanguage="C#"%>
<!
DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"http:
//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<mce:
scriptrunat="server"><!
--
protectedvoidButton1_Click(objectsender,EventArgse)
{
//密码验证过程在此省略,假如用户名是Admin,密码是mengxianhui
FormsAuthenticationTicketticket=newFormsAuthenticationTicket(2,//票证的版本号
"Admin",//与身分验证票关联的用户名
DateTime.Now,//票证发出时的本地日期和时间
DateTime.Now.AddHours
(1),//票证过期的本地日期和时间
true,//如果票证存储在持久性cookie中(跨浏览器会话保存)则为true否则为false如果票证储存在URL中,将忽略此值
"admin|manager|editor",//储存在票证中持定的用户信息,本页面供admin,manager,editor登录使用
FormsAuthentication.FormsCookiePath//票证储存在cookie中的路径
);
//如果forms元素的protection属性设置为All或Encryption,则窗体身份验证使用Encrypt方法对窗体身份验证票进行加密和签名。
stringencTicket=FormsAuthentication.Encrypt(ticket);
HttpCookiecookie=newHttpCookie(FormsAuthentication.FormsCookieName,encTicket);
Response.Cookies.Add(cookie);
Response.Redirect(FormsAuthentication.GetRedirectUrl("Admin",true));
}
//--></mce:
script>
<htmlxmlns="http:
//www.w3.org/1999/xhtml">
<headrunat="server">
<title>孟宪会之多用户登录测试页面</title>
</head>
<body>
<formid="form1"runat="server">
管理员登录界面,省略
<asp:
ButtonID="Button1"runat="server"Text="登录"OnClick="Button1_Click"/>
</form>
</body>
</html>
<%@PageLanguage="C#"%>
<!
DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"http:
//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<mce:
scriptrunat="server"><!
--
protectedvoidButton1_Click(objectsender,EventArgse)
{
//密码验证过程在此省略,假如用户名是Admin,密码是mengxianhui
FormsAuthenticationTicketticket=newFormsAuthenticationTicket(2,//票证的版本号
"Admin",//与身分验证票关联的用户名
DateTime.Now,//票证发出时的本地日期和时间
DateTime.Now.AddHours
(1),//票证过期的本地日期和时间
true,//如果票证存储在持久性cookie中(跨浏览器会话保存)则为true否则为false如果票证储存在URL中,将忽略此值
"admin|manager|editor",//储存在票证中持定的用户信息,本页面供admin,manager,editor登录使用
FormsAuthentication.FormsCookiePath//票证储存在cookie中的路径
);
//如果forms元素的protection属性设置为All或Encryption,则窗体身份验证使用Encrypt方法对窗体身份验证票进行加密和签名。
stringencTicket=FormsAuthentication.Encrypt(ticket);
HttpCookiecookie=newHttpCookie(FormsAuthentication.FormsCookieName,encTicket);
Response.Cookies.Add(cookie);
Response.Redirect(FormsAuthentication.GetRedirectUrl("Admin",true));
}
//--></mce:
script>
<htmlxmlns="http:
//www.w3.org/1999/xhtml">
<headrunat="server">
<title>孟宪会之多用户登录测试页面</title>
</head>
<body>
<formid="form1"runat="server">
管理员登录界面,省略
<asp:
ButtonID="Button1"runat="server"Text="登录"OnClick="Button1_Click"/>
</form>
</body>
</html>
注意:
这里连接数据库验证用户名和密码的过程省略过去了。
3,在Global的AuthenticateRequest事件(一定要注意:
不是AuthorizeRequest事件)里将角色信息附加到当前用户的上下文中。
viewplaincopytoclipboardprint?
protectedvoidApplication_AuthenticateRequest(objectsender,EventArgse)
{
stringcookieName=FormsAuthentication.FormsCookieName;
HttpCookieauthCookie=Context.Request.Cookies[cookieName];
if(null==authCookie)
{
return;
}
FormsAuthenticationTicketauthTicket=null;
try
{
authTicket=FormsAuthentication.Decrypt(authCookie.Value);
}
catch(Exceptionex)
{
return;
}
if(null==authTicket)
{
return;
}
FormsIdentityid=newFormsIdentity(authTicket);
String[]roles=id.Ticket.UserData.Split('|');//读出在登录时设置的角色列表。
System.Security.Principal.GenericPrincipalprincipal=newSystem.Security.Principal.GenericPrincipal(id,roles);
Context.User=principal;//将验证信息附加到当前用户上下文。
}
protectedvoidApplication_AuthenticateRequest(objectsender,EventArgse)
{
stringcookieName=FormsAuthentication.FormsCookieName;
HttpCookieauthCookie=Context.Request.Cookies[cookieName];
if(null==authCookie)
{
return;
}
FormsAuthenticationTicketauthTicket=null;
try
{
authTicket=FormsAuthentication.Decrypt(authCookie.Value);
}
catch(Exceptionex)
{
return;
}
if(null==authTicket)
{
return;
}
FormsIdentityid=newFormsIdentity(authTicket);
String[]roles=id.Ticket.UserData.Split('|');//读出在登录时设置的角色列表。
System.Security.Principal.GenericPrincipalprincipal=newSystem.Security.Principal.GenericPrincipal(id,roles);
Context.User=principal;//将验证信息附加到当前用户上下文。
}
4,在web.config文件中,允许登录文件的匿名访问,以便在未登录的情况下显示登录界面,注意:
如果包含图片、css等文件,也需要设置这些资源允许匿名访问。
viewplaincopytoclipboardprint?
<configuration>
<locationpath="AdminLogin.aspx">
<system.web>
<authorization>
<allowusers="?
"/>
</authorization>
</system.web>
</location>
<locationpath="UserLogin.aspx">
<system.web>
<authorization>
<allowusers="?
"/>
</authorization>
</system.web>
</location>
<system.web>
<authenticationmode="Forms">
<formsloginUrl="Login.aspx"path="/"protection="Encryption"></forms>
</authentication>
<authorization>
<denyusers="?
"/>
<allowusers="*"/>
&
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ASPNET 中实现不同角色的用户使用不同登录界面的方法 实现 不同 角色 用户 使用 登录 界面 方法
![提示](https://static.bdocx.com/images/bang_tan.gif)