先说说Form身份验证思路:
假设用户要浏览需要权限的页面,此时,安全机制先启动,检查当前用户请求是否持有用户票据的Cookie
如此Cookie存在:解析Cookie中的票据信息,获得用户角色,创建用户标识
否则:认为用户无权浏览该页面,跳转至登入页面,登入成功后重定向到所请求页面^-^
解释下我的文件目录:
-> Admin文件(该文件目录下内容用户必登入且角色为"Admin"才可浏览)
-> Admin.aspx
-> User.aspx(该文件只要登入可浏览)
-> Login.aspx(用户登入页面,未登入可浏览)
-> Global.asax
-> web.config
1.web.config文件
- <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身份验证配置文件各项的说明^^:
- /*
- <forms>节点中的属性含义:
- name:定义用于存储用户票据的唯一Cookie名
- loginUrl:将用户从定位到哪个页面登入
- defaultUrl:当用户登入成功后默认跳转页面
- timeout:设置用于存储用户票据的唯一Cookie的持续时间(分钟),此时间相对,每次用户进行验证,该Cookie期限被重新设置
- path:设置Cookie的保存路径
- protection有四个值:
- Encryption:对Cookie内容加密
- Validation:向Cookie内容添加MAC(消息验证代码),以便服务器判断Cookie是否被篡改
- None:禁用加密和篡改检查
- All:同时启用加密和篡改检查
- */
2.Login.aspx页面
- //单击登入按钮事件处理
- 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文件
- //在安全模块建立起当前用户的有效的身份时,该事件被触发。在这个时候,用户的凭据将会被验证
- 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等页面中判断
- //判断用户是否验证
- if (Page.User.Identity.IsAuthenticated)
- { }
- //确定当前用户是否属于自定角色
- if (Page.User.IsInRole("Admin"))
- { }
<authentication mode="Forms"/>
1 指示是否发生身份验证的方法
System.Web.HttpContext.Current.User.Identity.IsAuthenticated;
或者Request.IsAuthenticated;
2 获取用户名的方法
FormsIdentity Id = (FormsIdentity)HttpContext.Current.User.Identity;
FormsAuthenticationTicket Ticket = Id.Ticket ; //取得身份验证票
string userName=Ticket.Name;
或者string userName=User.Identity.Name;
3 登录的部分代码
if (FormsAuthentication.GetRedirectUrl(userName, false).EndsWith("default.aspx"))
{
//FormsAuthentication.SetAuthCookie(userName, persist.Checked);
FormsAuthenticationTicket authTicket = new
FormsAuthenticationTicket(1,userName,DateTime.Now,
DateTime.Now.AddMinutes(20),persist.Checked, role);
string encryptedTicket = FormsAuthentication.Encrypt(authTicket); //加密
HttpCookie authCookie =
new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
Response.Cookies.Add(authCookie);
HttpContext.Current.Response.Redirect("default.aspx", true);
}
else
{
//FormsAuthentication.SetAuthCookie(userName, persist.Checked);
FormsAuthenticationTicket authTicket = new
FormsAuthenticationTicket(1,userName,
DateTime.Now,DateTime.Now.AddMinutes(20),persist.Checked, role);
string encryptedTicket = FormsAuthentication.Encrypt(authTicket); //加密
HttpCookie authCookie =
new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
Response.Cookies.Add(authCookie);
HttpContext.Current.Response.Redirect(
FormsAuthentication.GetRedirectUrl(userName, false), true);
}
================================================
构建基于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, // 版本号。
txtUserName.Text, // 与身份验证票关联的用户名。
DateTime.Now, // Cookie 的发出时间。
DateTime.Now.AddMinutes(20),// Cookie 的到期日期。
false, // 如果 Cookie 是持久的,为 true;否则为 false。
roles ); // 将存储在 Cookie 中的用户定义数据。
roles是一个角色字符串数组
string encryptedTicket = FormsAuthentication.Encrypt(authTicket); //加密
存入Cookie
HttpCookie authCookie =
new HttpCookie(FormsAuthentication.FormsCookieName,
encryptedTicket);
Response.Cookies.Add(authCookie);
FormsAuthentication.SignOut() 登出
======================
string userName = User.Identity.Name; //获取与身份验证票关联的用户名
Response.Write(userName);
FormsIdentity Id = (FormsIdentity)HttpContext.Current.User.Identity;
FormsAuthenticationTicket Ticket = Id.Ticket; //取得身份验证票
string userName1 = Ticket.Name;
Response.Write("<br>" + userName1);//获取与身份验证票关联的用户名
string fd = Ticket.UserData.ToString();
Response.Write("<br>"+fd);//获取用户自定义数据
===============================================
<authentication mode="Forms">
<forms name="formvalidata" loginUrl="admin/login.aspx" timeout="30" path= "/">
</forms>
</authentication>
<globalization
requestEncoding="GB2312"
responseEncoding="GB2312"
/>
</system.web>
<location path="admin">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
</configuration>