Forms身份验证
在进行Forms身份验证时,如果采用如下的方法配置web.config的话,则会出现所有的页面都要进行验证,这是用户所不能容忍的,具体代码如下:
<authentication mode="Forms">
<forms name=".LoginUser" loginUrl="admin/admin_login.aspx" protection="All" timeout="30" />
</authentication>
<authorization>
<allow users="*" />
</authorization>
这里我还要说明一点,很多初学者都会把上面的代码写为
<authentication mode="Forms" />
<forms name=".LoginUser" loginUrl="admin/admin_login.aspx" protection="All" timeout="30" />
</authentication>
<authorization>
<allow users="*" />
结果会出现不能识别forms节点。
如果要实现某个目录下的Forms验证哪个怎么办呢?
其实代码很简单,在添加完上面的代码之后再在</system.web>后要加入:
<location path="admin">
<system.web>
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
</system.web>
</location>
便可以实现对admin这个目录进行验证,而其它的则不需要进行验证就可以直接访问。
--------=======================---------------------------
<authentication mode="Forms">
<forms name=".LoginUser" loginUrl="admin/admin_login.aspx" protection="All" timeout="30" />
</authentication>
<authorization>
<allow users="*" />
</authorization>
这里我还要说明一点,很多初学者都会把上面的代码写为
<authentication mode="Forms" />
<forms name=".LoginUser" loginUrl="admin/admin_login.aspx" protection="All" timeout="30" />
</authentication>
<authorization>
<allow users="*" />
结果会出现不能识别forms节点。
如果要实现某个目录下的Forms验证哪个怎么办呢?
其实代码很简单,在添加完上面的代码之后再在</system.web>后要加入:
<location path="admin">
<system.web>
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
</system.web>
</location>
便可以实现对admin这个目录进行验证,而其它的则不需要进行验证就可以直接访问。
--------=======================---------------------------
using System.Web.Security;
if((TextBox1.Text.Trim()=="a") && (TextBox2.Text.Trim()=="b"))
{
FormsAuthentication.SetAuthCookie(TextBox1.Text, false);
}
else
{
HttpContext.Current.Response.Redirect(FormsAuthentication.GetRedirectUrl(TextBox1.Text, false), true);
自动跳到Default.aspx
}
身份验证票
构建基于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);
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中
具体实现
Web.config文件
加入节点,name为COOKIE名称,loginUrl为没有通过验证跳转的地址
<system.web>
loginUrl="login.aspx" protection="All" path="/" timeout="40"/>
设置目录访问 path为目录名,roles为票据中的角色名
发现网上的都说要单独一个WEB.CONFIG文件放在目录中,但实际在根目录中设置即可,单个文件也一样
<system.web>
Global.asax文件
Application_AuthenticateRequest事件中加入
原理,将用户角色信息保存在票据中,通过Global.asax,WEB.CONFIG中的设置,判断角色的权限
if((TextBox1.Text.Trim()=="a") && (TextBox2.Text.Trim()=="b"))
{
FormsAuthentication.SetAuthCookie(TextBox1.Text, false);
}
else
{
HttpContext.Current.Response.Redirect(FormsAuthentication.GetRedirectUrl(TextBox1.Text, false), true);
自动跳到Default.aspx
}
身份验证票
构建基于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);
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中
具体实现
Web.config文件
加入节点,name为COOKIE名称,loginUrl为没有通过验证跳转的地址
<system.web>
loginUrl="login.aspx" protection="All" path="/" timeout="40"/>
设置目录访问 path为目录名,roles为票据中的角色名
发现网上的都说要单独一个WEB.CONFIG文件放在目录中,但实际在根目录中设置即可,单个文件也一样
<system.web>
Global.asax文件
Application_AuthenticateRequest事件中加入
protected void Application_AuthenticateRequest(Object sender, EventArgs e) { string cookieName = FormsAuthentication.FormsCookieName; HttpCookie authCookie = Context.Request.Cookies[cookieName]; FormsAuthenticationTicket authTicket = null; try { authTicket = FormsAuthentication.Decrypt(authCookie.Value); } catch(Exception ex) { return; } string[] roles = authTicket.UserData.Split(new char[]{','});//如果存取多个角色,我们把它分解 FormsIdentity id = new FormsIdentity( authTicket ); GenericPrincipal principal = new GenericPrincipal(id, roles); Context.User =principal;//存到HttpContext.User中 } |
原理,将用户角色信息保存在票据中,通过Global.asax,WEB.CONFIG中的设置,判断角色的权限
- 登陆
1)自定义身份验证票据
//使用 cookie 名、版本、目录路径、发布日期、过期日期、持久性以及用户定义的数据初始化 FormsAuthenticationTicket 类的新实例。
FormsAuthenticationTicket ticket= new FormsAuthenticationTicket(version,name,System.DateTime.Now,System.DateTime.Now.AddMinutes(20),isPersistent,"userData string ",cookiePath);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName,FormsAuthentication.Encrypt(ticket));
cookie.Path = FormsAuthentication.FormsCookiePath;
if(isPersistent)
{
cookie.Expires = ticket.Expiration;
}
Response.Cookies.Add(cookie);
2)使用系统的验证票据
//为给定的 userName、createPersistentCookie 和 strCookiePath 创建身份验证票,并将其附加到 Cookie 的传出响应集合。它不执行重定向。
FormsAuthentication.SetAuthCookies(userName,isPersistent,cookiePath);
2. 验证
try
{
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value);
//已验证用户
}
catch(Exception e)
{
//未验证用户;
}
{
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value);
//已验证用户
}
catch(Exception e)
{
//未验证用户;
}
3. 退出
FormsAuthentication.SignOut();
Session.Abandon();
Session.Abandon();
作者:拒绝潜水的鱼
出处:http://slave2.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://slave2.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。