• 【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

    需要源码

  • 相关阅读:
    插件之基类窗体
    插件之类注册
    主控程序之主窗体
    主控程序、插件之间的接口声明
    XE2 LSUPER LITE安装提示item not found
    远程方法的定义和调用
    主控程序之插件装载器二
    插件之接口实现
    主控程序之插件装载器一
    sql工厂类
  • 原文地址:https://www.cnblogs.com/maijin/p/3498766.html
Copyright © 2020-2023  润新知