zoukankan      html  css  js  c++  java
  • asp.net forms 表单验证 实现跨域共享cookie(即SSO,单点登录(在二级域名下))

    1.前提:

      需要做一个单点登录,使用asp.net自带的表单验证(FormsAuthentication)

      配置文件怎么写,如下(基本的):

    <authentication mode="Forms">  <forms loginUrl="~/user/login" enableCrossAppRedirects="true" timeout="3600" name="qz.bbs" cookieless="UseCookies" domain="qz.com" protection="All" requireSSL="false"></forms>

    </authentication>

        enableCrossAppRedirects:是否跨应用程序使用

        name:指定验证通过后写到浏览器的cookie名称,同时验证是否通过时,也是读取该cookie名,取得值,然后解密赋值给 User.Identity.Name

        domain:指定表单验证下发的cookie的作用域,一定要指定为一级域名(如果分站点为二级域名),这样才能共享cookie

      站点在同一一级域名下,①passport.qz.com --- 验证站点

                 ②site1.qz.com ---- 分站点一

                   ③site2.qz.com ---- 分站点二

    2.简介

      在表单验证中,验证通过时会写一个cookie到浏览器,但是这个cookie是经过加密了的,如果没有指定用什么加密算法会根据当前服务器的机器自动选择,所以我们需要为验证站点指定用什么算法,同时在分站中也需要指定,这样在分站获取到验证cookie的值后,才能正确的解密,还原为相同的值

    3.具体

      1.在验证站中和分站中都指定表单验证,指定验证后的cookie的名称和Domain(验证站点和分站的cookie名称必须一致,这样分站才能获取验证站的cookie值)

        

    1 <!--
    2             通过 <authentication> 节,可配置
    3             ASP.NET 用于识别进入用户的
    4             安全身份验证模式。
    5     -->
    6     <authentication mode="Forms">
    7       <forms loginUrl="~/user/login" enableCrossAppRedirects="true" timeout="3600" name="qz.bbs" cookieless="UseCookies" domain="qz.com" protection="All" requireSSL="false">
    8       </forms>
    9     </authentication>

      2.因为asp.net内部为了安全,所有的验证后写出的cookie值都是经过加密的,所有我们需要让验证站和分站的加密解密方式一样,可以通过配置文件指定,所以分别在验证站和分站的配置文件中的<system.web>节点中添加以下节点(此处的validationKey和decryptionKey是网上找的,可以根据服务器生成

      

    1 <machineKey
    2 validationKey="282487E295028E59B8F411ACB689CCD6F39DDD21E6055A3EE480424315994760ADF21B580D8587DB675FA02F79167413044E25309CCCDB647174D5B3D0DD9141"
    3 decryptionKey="8B6697227CBCA902B1A0925D40FAA00B353F2DF4359D2099"
    4 validation="SHA1"/>
    • decryption属性:用于指定Forms验证下cookie的加密算法,取值有Auto,AES或3DES,默认为Auto (ASP.NET会根据Web服务器的性能选择最佳加密算法)。
    • validation属性:用于指定对验证cookie进行Hash与加密的算法,可取值为AES,MD5,SHA1和3DES。
    • descryptionKey属性与validationKey属性:分别表示对验证cookie进行加密的密钥与Hash运算的验证码。

    另外,上述配置中:

    • AutoGenerate:表示ASP.NET将产生随机密钥,并将其存储在LSA(本地独立存储)
    • IsolateApps表示将为Web服务器每个应用程序创建唯一的密钥。

    4.算法生成

    AES算法需要一个64位的十六进制字符随机序列,SHA1算法使用一个128位的十六进制随机序列,我们可以通过这样的代码来生成所需的随机序列:

    static void Main(string[] args)
            {
                string decryptionKey = CreateKey(24);
                string validationKey = CreateKey(64);
     
                Console.WriteLine("<machineKey validationKey="{0}" decryptionKey="{1}" validation="SHA1"/>", validationKey, decryptionKey);
     
                Console.ReadKey();
            }
     
            static String CreateKey(int numBytes)
            {
                RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
                byte[] buff = new byte[numBytes];
     
                rng.GetBytes(buff);
                return BytesToHexString(buff);
            }
     
            static String BytesToHexString(byte[] bytes)
            {
                StringBuilder hexString = new StringBuilder(64);
     
                for (int counter = 0; counter < bytes.Length; counter++)
                {
                    hexString.Append(String.Format("{0:X2}", bytes[counter]));
                }
                return hexString.ToString();
            }

     

    微软官方解释地址

  • 相关阅读:
    重写与重载的区别
    UDP模式与TCP模式的区别
    什么是GC?为什么会有GC?
    centos 7-8 安装 ms sql server 2019
    Phaser3 游戏开发入门——自定义构建Phaser库
    Visual Studio 下C#编译器在解析属性名时如果增加一个get_[您的另一个已经包含在类中属性名]的属性会报错,微软大哥这是什么鬼?
    Visual Studio 2015 Update 3 ISO
    react项目中引用amap
    js 截取网址中的某一段字符串
    解决react下找不到原生高德地图AMap类的问题
  • 原文地址:https://www.cnblogs.com/JsonYang/p/3926895.html
Copyright © 2011-2022 走看看