FormsAuthenticationTicket用法
转载自:FormsAuthenticationTicket用法 - 寂寞的蚂蚁 - 博客园 (cnblogs.com)
FormsAuthenticationTicket :提供对使用 forms 身份验证用于确定用户身份的票证的属性和值的访问。 此类不能被继承。
其构造函数有三个:
FormsAuthenticationTicket(string name, bool isPersistent, int timeout);
name:与票证关联的用户名。
isPersistent: true 如果该票证将存储在持久性 cookie (保存在浏览器会话);,否则为 false。 如果该票证存储在 URL 中,则忽略此值。
timeout: 以分钟为单位,身份验证票证的有效时间。
FormsAuthenticationTicket(int version, string name, DateTime issueDate, DateTime expiration, bool isPersistent, string userData)
expiration:本地日期和票证的到期的时间。
issueDate: 本地日期和时间所颁发票证。
userData: 要存储在票证的特定于用户的数据。
FormsAuthenticationTicket(int version, string name, DateTime issueDate, DateTime expiration, bool isPersistent, string userData, string cookiePath);
cookiePath:票证存储在 cookie 中时的路径。
使用:
eg:
生成ticket
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public ActionResult Index() { FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, "hello" , DateTime.Now, DateTime.Now.AddMinutes(30), true , "chen" ); string authTicket = FormsAuthentication.Encrypt(ticket); //将加密后的票据保存为cookie HttpCookie coo = new HttpCookie(FormsAuthentication.FormsCookieName, authTicket); HttpContext.Response.Cookies.Add(coo); return View(); } |
配置authentication web.config下system.web节点内添加
1
2
3
4
|
<authentication mode= "Forms" > <forms loginUrl= "~/Home/Index" defaultUrl= "Admin.aspx" name= ".ASPXFORMSAUTH" > </forms> </authentication> |
验证是否拥有ticket
this.Request.IsAuthenticated
注消ticket
FormsAuthentication.SignOut();
获取ticket中的UserData:
如图:
适合用做登录模块, 写一个属性拦截器
1
2
3
4
5
6
7
8
9
10
11
|
public class myAttribute : AuthorizeAttribute { protected override bool AuthorizeCore(HttpContextBase httpContext) { if (httpContext == null ) { throw new ArgumentNullException( "HttpContext" ); } return (httpContext.Request.IsAuthenticated); } } |
如下三个页面:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
public ActionResult Index() { FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, "hello" , DateTime.Now, DateTime.Now.AddMinutes(30), true , "chen" ); string authTicket = FormsAuthentication.Encrypt(ticket); //将加密后的票据保存为cookie HttpCookie coo = new HttpCookie(FormsAuthentication.FormsCookieName, authTicket); HttpContext.Response.Cookies.Add(coo); return View(); } [my] public ActionResult About() { ViewBag.Message = "Your application IsAuthenticated page." ; return View(); } public ActionResult logout() { string strUserData = ((FormsIdentity)(HttpContext.User.Identity)).Ticket.UserData; FormsAuthentication.SignOut(); ViewBag.Message = "Your contact page." ; return View(); } |
其中,如果先访问Index,获取ticket 是可以访问About和logout,
然后访问logout,将ticket注销,再访问About时,会被拦截器阻止,跳转到web.config中配置的loginUrl,即index。
加一些属性。
//加密数据放入Cookie中 FormsAuthenticationTicket ticket = new FormsAuthenticationTicket( version: 1, name: userId, issueDate: DateTime.Now, expiration: DateTime.Now.Add(FormsAuthentication.Timeout), isPersistent: true, userData: userId ); string encryptedTicket = FormsAuthentication.Encrypt(ticket); var formsCookie = new HttpCookie("auth", encryptedTicket); context.Response.Cookies.Add(formsCookie); //解密获取数据 HttpCookie authCookie = HttpContext.Current.Request.Cookies["auth"]; if (authCookie != null) { FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); name = authTicket.Name; }