先说说Form身份验证思路:
假设用户要浏览需要权限的页面,此时,安全机制先启动,检查当前用户请求是否持有用户票据的Cookie
如此Cookie存在:解析Cookie中的票据信息,获得用户角色,创建用户标识
否则:认为用户无权浏览该页面,跳转至登入页面,登入成功后重定向到所请求页面^-^
解释下我的文件目录:
-> Admin文件(该文件目录下内容用户必登入且角色为"Admin"才可浏览)
-> Admin.aspx
-> User.aspx(该文件只要登入可浏览)
-> Login.aspx(用户登入页面,未登入可浏览)
-> Global.asax
-> web.config
1.web.config文件
view plaincopy to clipboardprint?<configuration> <!-- 配置目录"Admin"下的页面浏览权限 --> <location path="Admin"> <system.web> <authorization> <!-- 拒绝匿名用户访问 --> <deny users="?" roles="User"/> <!-- <allow roles="Admin"/> <deny users="?"/> 原先这样配置但导致角色"User"也可以访问,不知为何? --> </authorization> </system.web> </location> <system.web> <!-- 通过 <authentication> 节可以配置 ASP.NET 用来 识别进入用户的 安全身份验证模式。 --> <authentication mode="Forms"> <forms loginUrl="Login.aspx" defaultUrl="User.aspx" name=".LoginFormsTicket" path="/" timeout="40" protection="All"> <credentials passwordFormat="Clear"> <user name="lulu" password="66"/> </credentials> </forms> </authentication> <!-- 配置网站页面浏览权限 --> <authorization> <!-- 拒绝:?(匿名用户) *(所有用户) --> <deny users="?"/> </authorization> </system.web> </configuration> <configuration>
<!-- 配置目录"Admin"下的页面浏览权限 --> <location path="Admin"> <system.web> <authorization> <!-- 拒绝匿名用户访问 --> <deny users="?" roles="User"/> <!-- <allow roles="Admin"/> <deny users="?"/> 原先这样配置但导致角色"User"也可以访问,不知为何? --> </authorization> </system.web> </location>
<system.web> <!-- 通过 <authentication> 节可以配置 ASP.NET 用来 识别进入用户的 安全身份验证模式。 --> <authentication mode="Forms"> <forms loginUrl="Login.aspx" defaultUrl="User.aspx" name=".LoginFormsTicket" path="/" timeout="40" protection="All"> <credentials passwordFormat="Clear"> <user name="lulu" password="66"/> </credentials> </forms> </authentication> <!-- 配置网站页面浏览权限 --> <authorization> <!-- 拒绝:?(匿名用户) *(所有用户) --> <deny users="?"/> </authorization>
</system.web></configuration>
再补充下对Forms身份验证配置文件各项的说明^^:
view plaincopy to clipboardprint?/* <forms>节点中的属性含义: name:定义用于存储用户票据的唯一Cookie名 loginUrl:将用户从定位到哪个页面登入 defaultUrl:当用户登入成功后默认跳转页面 timeout:设置用于存储用户票据的唯一Cookie的持续时间(分钟),此时间相对,每次用户进行验证,该Cookie期限被重新设置 path:设置Cookie的保存路径 protection有四个值: Encryption:对Cookie内容加密 Validation:向Cookie内容添加MAC(消息验证代码),以便服务器判断Cookie是否被篡改 None:禁用加密和篡改检查 All:同时启用加密和篡改检查 */ /*<forms>节点中的属性含义:name:定义用于存储用户票据的唯一Cookie名loginUrl:将用户从定位到哪个页面登入defaultUrl:当用户登入成功后默认跳转页面timeout:设置用于存储用户票据的唯一Cookie的持续时间(分钟),此时间相对,每次用户进行验证,该Cookie期限被重新设置path:设置Cookie的保存路径protection有四个值: Encryption:对Cookie内容加密 Validation:向Cookie内容添加MAC(消息验证代码),以便服务器判断Cookie是否被篡改 None:禁用加密和篡改检查 All:同时启用加密和篡改检查*/
2.Login.aspx页面
view plaincopy to clipboardprint?//单击登入按钮事件处理 protected void login_Click(object sender, EventArgs e) { //通过和配置文件<credentials>节点中定义的用户信息比对,验证用户名密码是否合格 //合格 if (FormsAuthentication.Authenticate("lulu", "66")) { //创建用户身份验证票据 FormsAuthenticationTicket ticket = new FormsAuthenticationTicket( 1, //版本信息 "lulu", //票据中保存的用户标示 DateTime.Now, //保存票据的Cookie创建时间 DateTime.Now.AddMinutes(40), //保存票据的Cookie过期时间 false, //保存票据的Cookie不永久保存 "Admin", //票据中的用户自定义字段,此处用于存放当前用户的角色信息 FormsAuthentication.FormsCookiePath //保存票据的Cookie的保存路径(在Web.config文件中配置) ); //创建一用于保存用户身份验证票据的Cookie //该Cookie的名在配置文件中定义 //该Cookie的值为加密(必须加密!)的数据票据 HttpCookie ticketCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket)); //将保存有用户身份验证的票据Cookie加入响应流 Response.Cookies.Add(ticketCookie); //返回导致重定向的原始页面请求页面 Response.Redirect(FormsAuthentication.GetRedirectUrl("lulu",false), true); } else { Response.Write("用户名密码验证失败!"); } } //单击登入按钮事件处理 protected void login_Click(object sender, EventArgs e) { //通过和配置文件<credentials>节点中定义的用户信息比对,验证用户名密码是否合格 //合格 if (FormsAuthentication.Authenticate("lulu", "66")) { //创建用户身份验证票据 FormsAuthenticationTicket ticket = new FormsAuthenticationTicket( 1, //版本信息 "lulu", //票据中保存的用户标示 DateTime.Now, //保存票据的Cookie创建时间 DateTime.Now.AddMinutes(40), //保存票据的Cookie过期时间 false, //保存票据的Cookie不永久保存 "Admin", //票据中的用户自定义字段,此处用于存放当前用户的角色信息 FormsAuthentication.FormsCookiePath //保存票据的Cookie的保存路径(在Web.config文件中配置) );
//创建一用于保存用户身份验证票据的Cookie //该Cookie的名在配置文件中定义 //该Cookie的值为加密(必须加密!)的数据票据 HttpCookie ticketCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));
//将保存有用户身份验证的票据Cookie加入响应流 Response.Cookies.Add(ticketCookie); //返回导致重定向的原始页面请求页面 Response.Redirect(FormsAuthentication.GetRedirectUrl("lulu",false), true); } else { Response.Write("用户名密码验证失败!"); } }
3.Global.asax文件
view plaincopy to clipboardprint?//在安全模块建立起当前用户的有效的身份时,该事件被触发。在这个时候,用户的凭据将会被验证 void Application_AuthenticateRequest(object sender, EventArgs e) { //获取当前请求中保存有用户身份票据的Cookie HttpCookie ticketCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; //如该Cookie不为空,如存在身份票据,解析票据信息,创建用户标识,获取用户角色 if (ticketCookie != null) { //获取用户票据 FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(ticketCookie.Value); string[] roles = ticket.UserData.Split(','); //创建用户标识 FormsIdentity identity = new FormsIdentity(ticket); //创建用户身份主体信息 System.Security.Principal.GenericPrincipal user = new System.Security.Principal.GenericPrincipal(identity, roles); //把由用户标识,角色信息组成的户身份主体信息保存在User属性中 HttpContext.Current.User = user; } } //在安全模块建立起当前用户的有效的身份时,该事件被触发。在这个时候,用户的凭据将会被验证 void Application_AuthenticateRequest(object sender, EventArgs e) { //获取当前请求中保存有用户身份票据的Cookie HttpCookie ticketCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
//如该Cookie不为空,如存在身份票据,解析票据信息,创建用户标识,获取用户角色 if (ticketCookie != null) { //获取用户票据 FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(ticketCookie.Value);
string[] roles = ticket.UserData.Split(','); //创建用户标识 FormsIdentity identity = new FormsIdentity(ticket); //创建用户身份主体信息 System.Security.Principal.GenericPrincipal user = new System.Security.Principal.GenericPrincipal(identity, roles);
//把由用户标识,角色信息组成的户身份主体信息保存在User属性中 HttpContext.Current.User = user; } }
4.在User.aspx等页面中判断
view plaincopy to clipboardprint?//判断用户是否验证 if (Page.User.Identity.IsAuthenticated) { } //确定当前用户是否属于自定角色 if (Page.User.IsInRole("Admin")) { } //判断用户是否验证 if (Page.User.Identity.IsAuthenticated) { }
//确定当前用户是否属于自定角色 if (Page.User.IsInRole("Admin")) { }
原创地址:http://blog.csdn.net/lulu_jiang/archive/2010/06/10/5661857.aspx
