关于Form验证角色问题:
一、问题描述:有两种用户,买方,卖方;在数据库中分别有两个用户表。要求:网站根目录下有两个目录假设为DW目录、GR目录。目录下都 有一个login.aspx文件,分别是dwlogin.aspx,grlogin.aspx,登录时分别用自己的login.aspx文件,登录后不能访问对方的目录。
二、总体思路:创建自定义的身份验证票据,将roles信息放在票据的userData中.
三、设置Web.config
<configuration>
<system.web>
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="login.aspx"//根目录中的,就是下面的第六条 protection="All" path="/"/>
</authentication>
</system.web>
<location path="DW">
<system.web>
<authorization>
<allow roles="DW"/>
<deny users="*" />//这里必须用*,用?达不到要求
</authorization>
</system.web>
</location>
<location path="GR">
<system.web>
<authorization>
<allow roles="GR"/>
<deny users="*" />
</authorization>
</system.web>
</location>
<location path="/DW/DWLogin.aspx">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
<location path="GR/GRLogin.aspx">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
四、DWLogin.aspx中
private void Button1_Click(object sender, System.EventArgs e)
{ HttpCookie objCookie; string strReturnURL;
if (IsValid)
{ switch (GetUser( Username.Text,Password.Text))// GetUser函数得到用户名和密码,正确返回0,密码错返回2 ,用户名错返回1
{ case 0: FormsAuthenticationTicket ticket = new FormsAuthenticationTicket( 1, Username.Text, DateTime.Now, DateTime.Now.AddMinutes(30), false, "DW");//我是直接写进去的,可能还有更好的方法
objCookie = new HttpCookie( =(".ASPXAUTH" );
objCookie.Value = FormsAuthentication.Encrypt( ticket );
Response.Cookies.Add( objCookie );
strReturnURL = Request.Params[ "ReturnURL" ];
if ( strReturnURL != null )
{ Response.Redirect( strReturnURL );//返回到原来访问的页面 }
else
{ Response.Redirect( "Default.aspx" );//这里也可以设置你想设置的页面 }
break; case 1: this.Page.RegisterStartupScript("Info","<script>alert('该用户不存在!!');</script>"); break; case 2: this.Page.RegisterStartupScript("Info","<script>alert('密码错误!!');</script>");
break;
} } }
个人的登录页面GRLogin.aspx中写法同上面
五、Global.asax中添加如下代码:
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
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 ticket = id.Ticket; string userData = ticket.UserData;
string[] roles = userData.Split(',');
HttpContext.Current.User = new GenericPrincipal(id, roles);
} } } }
六、根目录下建login.aspx,其中添加如下代码:(这个login.aspx没有用户名和密码输入框,主要是用来重定位各自的登录页面)
private void Page_Load(object sender, System.EventArgs e)
{
string ParamName = "ReturnUrl";
string ReturnUrl = Request.QueryString[ParamName];
if (ReturnUrl.ToLower().IndexOf("DW") >=0)
{
Response.Redirect("DW/DWLogin.aspx?" + ParamName + "=" + ReturnUrl);
}
else if (ReturnUrl.ToLower().IndexOf("GR") >=0 )
{
Response.Redirect("GR/GRLogin.aspx?" + ParamName + "=" + ReturnUrl); } else { //这里添加一些你的提示,指定页面也可以
}
}
以下为引用:
构建基于forms的验证机制过程如下: 1,设置IIS为可匿名访问和asp.net web.config中设置为form验证 2,检索数据存储验证用户,并检索角色(如果不是基于角色可不用) 3,使用FormsAuthenticationTicket创建一个Cookie并回发到客户端,并存储 角色到票中,如:
FormsAuthentication.SetAuthCookie(Username,true | false)
cookies保存时间:
HttpContext.Current.Response.Cookies[FormsAuthentication.FormsCookieName].Expires=DateTime.Now.AddDays(1)
如果需要存储角色,采用:
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, // version txtUserName.Text, // user name
DateTime.Now, // creation
DateTime.Now.AddMinutes(20),// Expiration
false, // Persistent
roles ); // User data
roles是一个角色字符串数组
string encryptedTicket = FormsAuthentication.Encrypt(authTicket); //加密
存入Cookie
HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
Response.Cookies.Add(authCookie);
4,在Application_AuthenticateRequest事件中处理程序中(Global.asax)中,使用票创建IPrincipal对象并存在HttpContext.User中
代码:
HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);//解密
string[] roles = authTicket.UserData.Split(new char[]{';'});//根据存入时的格式分解,;或|....
Context.User = new GenericPrincipal(Context.User.Identity, Roles);//存在HttpContext.User中
5,需要对某些页面进行角色控制,有两种方法:
5.1,web.config中加
<location path="EditPost.aspx">
<system.web>
<authorization>
<allow roles="RoleName" />
<deny users="?" />
</authorization>
</system.web>
</location>
5.2,把只能是某种角色访问的文件放在同一目录下,在此目录下添加一个web.config
<configuration>
<system.web>
<authorization>
<allow roles="RoleName" />
<deny users="*" />
</authorization>
</system.web>
</configuration>
说明:子目录的web.config设置优先于父目录的web.config设置
Trackback: http://tb.donews.net/TrackBack.aspx?PostId=338236