让自定义登录程序像 Membership 一样
ASP.NET 自带的用户登录程序很方便,但我们有时希望用自己的登录程序更灵活,或者我们要做单点登录,兼容 ASP.NET 自带的登录程序。
写在之前
约定一下,名称空间是 System.Web.Security。
首先,我们要启用 Forms 验证
<system.web>
<authentication mode="Forms"></authentication>
</configuration>
记录登录信息
当我们的登录程序判断用户登录成功后,就要把这个会话记录下来,在 ASP 中一般用 Session,在 ASP.NET 中默认用 Cookie。
DateTime.Now, DateTime.Now.AddDays(7), false, "自定义数据");
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));
HttpContext.Current.Response.Cookies.Add(cookie);
Response.Write(User.Identity.IsAuthenticated); // 本页中仍为 false,下页中才会为 true。
如上代码记录了当前登录的用户为 Admin,如果用户没关闭浏览器,那么这个会话会一直保持七天。
判断是否登录和登录名
User.Identity.IsAuthenticated、User.Identity.Name
不要在记录登录信息的页面判断,因为页面一开始从客户端获取 Cookie 信息,由于那时还没有执行到记录登录信息的程序,所以没有关于登录成功的 Cookie 信息。后面执行到了记录登录信息的程序,也将 Cookie 写入了客户端,但 ASP.NET 此时已经不会去取这个 Cookie 了,只有在下一个页面,或刷新本页面后,才会获取到登录信息的 Cookie。
注销
// Response.Cookies.Clear(); // 后面不能再有涉及 Cookie 的操作,否则退出不了。
要注意的是,后面就不要去画蛇添足地去清除什么 Cookie 了,那样返回导致退出不了。
获取自定义数据
前面谈到可以用 User.Identity.IsAuthenticated、User.Identity.Name 判断用户是否登录、获取用户名。但是我还想要用户的更多信息,比如角色,怎么办呢?一种方法是根据用户名到数据库中去找。还有一种方法是将这些信息在登录成功后直接记录到 FormsAuthenticationTicket 的最后一个参数中。
记录简单,关键是如何取。
{
return result;
}
FormsIdentity fi = (FormsIdentity)HttpContext.Current.User.Identity; // 须是 Forms 验证,需要已经 IsAuthenticated 才能转换为 FormsIdentity
FormsAuthenticationTicket ticket = fi.Ticket;
string userData = ticket.UserData;
这样就把 userData 取出来了,userData 的格式、约定就由您自己决定了。