zoukankan      html  css  js  c++  java
  • 让自定义登录程序像 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 的格式、约定就由您自己决定了。

  • 相关阅读:
    Java Set 常用集合 HashSet、LinkedHashSet、TreeSet
    旋转数组的最小数字
    Java List 常用集合 ArrayList、LinkedList、Vector
    RestfulApi 学习笔记——内容协商(三)
    RestfulApi 学习笔记——.net core入门操作(二)
    不一样的模板模式(设计模式十一)
    RestfulApi 学习笔记——简单介绍(一)
    oracle 数据库连接
    重学c#系列——索引器(九)
    重新整理计算机组成原理(一)
  • 原文地址:https://www.cnblogs.com/jordan2009/p/2728873.html
Copyright © 2011-2022 走看看