【CAS单点登录视频教程】 第06集【完】 -- Cas认证 学习 票据认证FormsAuthentication

目录

-----------------------------------------

-----------------------------------------

首先 我们来了解 一下 微软提供的 票据认证

首先 我们创建 一个 webform项目

然后 创建 一个admin的目录 里面有一个 admin.aspx的页面 这个页面 必须登录了 才能访问

那么 我们首先 要配置 Form票据

配置 web.config



在 system.web 里面 添加

  
<system.web>

    <authentication mode="Forms">

      <!--默认状态下位Windows-->

      <forms loginUrl="CasEnter.aspx" name=".ASPXFORMSAUTH"></forms>

    </authentication>

    <authorization>

      <allow users="*"/>

      <!--允许任何访问者访问-->

    </authorization>

  </system.web>

  

  <location path="Admin">

    <!--注意:该节点最好跟在</system.web>之后,尽管这两个节点可能在web.config文件中相隔比较远,不要觉得有什么疑惑。下面是对Admin文件夹的访问权限的配置。-->

    <system.web>

      <authorization>

        <deny users="?"/>

        <!--阻止匿名用户访问-->

      </authorization>

    </system.web>

  </location> 


上面代码的意思是 只要访问 admin下面 任何页面 如果 没有认证 没有u写票据的话 就要跳转

在casenter.aspx.cs 页面里面 我们 要对cas 两次握手
 protected void Page_Load(object sender, EventArgs e)
        {
            //到配置文件中 获取cas的地址
            string casHost = ConfigurationManager.AppSettings["casUrl"].ToString();

            // 获取url是否有ticket
            string ticket = Request.QueryString["ticket"];

            // 获取客户端url 
            string service = Request.Url.GetLeftPart(UriPartial.Path);

            // 第一次登录 ticket 为空 跳到cas服务器登录
            string redir = string.Empty;
            if (ticket == null || ticket.Length == 0)
            {
                redir = casHost + "login?" + "service=" + service;
                Response.Redirect(redir); return;
            }

            // 第二次 验证ticket
            string netid = ValidateTicket(casHost, ticket, service);

             //判断 netid
            if (netid == null)
            {
                Label1.Text = "抱歉!CAS认证失败,请重试!";
            }
            else
            {

            }
        }

        /// <summary>
        /// 验证 并翻来 登录用户名 userid
        /// </summary>
        /// <param name="casHost"></param>
        /// <param name="ticket"></param>
        /// <param name="service"></param>
        /// <returns></returns>
        private string ValidateTicket(string casHost, string ticket, string service)
        {
            string validateurl = casHost + "serviceValidate?" + "ticket=" + ticket + "&" + "service=" + service;
            ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate;
            StreamReader Reader = new StreamReader(new WebClient().OpenRead(validateurl));
            string resp = Reader.ReadToEnd();
            NameTable nt = new NameTable();
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
            XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None);
            XmlTextReader reader = new XmlTextReader(resp, XmlNodeType.Element, context);
            string netid = null;
            while (reader.Read())
            {
                if (reader.IsStartElement())
                {
                    string tag = reader.LocalName;
                    if (tag == "user")
                        netid = reader.ReadString();
                }
            }
            return netid;
        }

        /// <summary>
        /// 默认 ssl 为true 因为有写浏览器 或者服务器 ssl通不过
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="certificate"></param>
        /// <param name="chain"></param>
        /// <param name="sslPolicyErrors"></param>
        /// <returns></returns>
        private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            return true;
        }

如果 认证 失败 在asp 页面里面

 <form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br />
        <asp:HyperLink ID="HyperLink1" NavigateUrl="~/CasEnter.aspx" runat="server">重新认证</asp:HyperLink>
    </div>
    </form>

写票据

   //判断 netid
            if (netid == null)
            {
                Label1.Text = "抱歉!CAS认证失败,请重试!";
            }
            else
            {
                //创建用户身份验证票据  
                FormsAuthenticationTicket ticketForm = new FormsAuthenticationTicket(
                    1,                                        //版本信息  
                    netid,                                   //票据中保存的用户标示  
                    DateTime.Now,                             //保存票据的Cookie创建时间  
                    DateTime.Now.AddMinutes(40),              //保存票据的Cookie过期时间  
                    false,                                    //保存票据的Cookie不永久保存  
                    "Admin",                                   //票据中的用户自定义字段,此处用于存放当前用户的角色信息  
                    FormsAuthentication.FormsCookiePath       //保存票据的Cookie的保存路径(在Web.config文件中配置)  
                );

                //创建一用于保存用户身份验证票据的Cookie  
                //该Cookie的名在配置文件中定义  
                //该Cookie的值为加密(必须加密!)的数据票据  
                HttpCookie ticketCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticketForm));

                //将保存有用户身份验证的票据Cookie加入响应流  
                Response.Cookies.Add(ticketCookie);
                //返回导致重定向的原始页面请求页面  
                Response.Redirect(FormsAuthentication.GetRedirectUrl("bamn", false), true);
            }

 

需要视频的

http://pan.baidu.com/s/1jG2ZjHO

需要源码

原文地址:https://www.cnblogs.com/maijin/p/3498766.html