让自定义登录程序像 Membership 一样

ASP.NET 自带的用户登录程序很方便,但我们有时希望用自己的登录程序更灵活,或者我们要做单点登录,兼容 ASP.NET 自带的登录程序。

写在之前

约定一下,名称空间是 System.Web.Security。

首先,我们要启用 Forms 验证

<configuration>
    <system.web>
      <authentication mode="Forms"></authentication>
</configuration>

记录登录信息

当我们的登录程序判断用户登录成功后,就要把这个会话记录下来,在 ASP 中一般用 Session,在 ASP.NET 中默认用 Cookie。

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, "Admin",
                    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。

注销

FormsAuthentication.SignOut();
// Response.Cookies.Clear(); // 后面不能再有涉及 Cookie 的操作,否则退出不了。

要注意的是,后面就不要去画蛇添足地去清除什么 Cookie 了,那样返回导致退出不了。

获取自定义数据

前面谈到可以用 User.Identity.IsAuthenticated、User.Identity.Name 判断用户是否登录、获取用户名。但是我还想要用户的更多信息,比如角色,怎么办呢?一种方法是根据用户名到数据库中去找。还有一种方法是将这些信息在登录成功后直接记录到 FormsAuthenticationTicket 的最后一个参数中。

记录简单,关键是如何取。

if (!HttpContext.Current.User.Identity.IsAuthenticated)
{
    return result;
}

FormsIdentity fi = (FormsIdentity)HttpContext.Current.User.Identity; // 须是 Forms 验证,需要已经 IsAuthenticated 才能转换为 FormsIdentity
FormsAuthenticationTicket ticket = fi.Ticket;
string userData = ticket.UserData;

这样就把 userData 取出来了,userData 的格式、约定就由您自己决定了。

posted on 2012-10-18 09:15  米高佐敦  阅读(237)  评论(0编辑  收藏  举报