• C# Attribute应用:类签名


    在应用别人接口的时候,总是要用签名,很是不理解签名这是怎么知道做的。通过对Attribute的学习了解。大体可以用Attribute来做签名应用。

    具体过程如下:

    首先我们要先定义一个类,该类继承Attribute。该类主要最用是,签名需要用到的方法、参数和获取加密文件

     1  public class CashiSongAttribute : Attribute
     2     {
     3         /// <summary>
     4         /// 签名参数
     5         /// </summary>
     6         public string[] Param { get; set; }
     7         /// <summary>
     8         /// 是否签名
     9         /// </summary>
    10         public bool IsSign { get; set; }
    11         /// <summary>
    12         /// 加密文件
    13         /// </summary>
    14         /// <param name="bp"></param>
    15         /// <param name="mi"></param>
    16         /// <returns></returns>
    17         public string ParamEncryption(BasePage bp,System.Reflection.MethodInfo mi)
    18         {
    19             if (Param != null && Param.Length > 0)
    20             {
    21                 string md5 = "op" + mi.Name.ToLower();
    22                 foreach (string item in Param)
    23                 {
    24                     if (item.ToLower() == "op" || item.ToLower() == "sign")
    25                         continue;
    26                     md5 += item + bp.GetRequest(item);
    27                 }
    28                 byte[] bytestr = Encoding.Default.GetBytes(md5);
    29                 MD5 _md5 = new MD5CryptoServiceProvider();
    30                 byte[] bytesend = _md5.ComputeHash(bytestr);
    31                 return BitConverter.ToString(bytesend).Replace("-", "");
    32             }
    33             return "";
    34         }
    35     }
    View Code

    新建一个页面,在该页面创建一个方法,并加入该特性

    1         [CashiSong(IsSign = true, Param = new string[] { "op", "name" })]
    2         public string getceshicon()
    3         {
    4             return "签名成功!";
    5         }

    下面关键就再也通过调用方式的时候,验证参数是否都符合,加密文件是否正确。

    创建一个基类BasePage,该基类主要负责,接受参数,并指定参数指定的方法,并判断签名信息是否正确。

    这里会用到:System.Reflection.MethodInfo的应用、获取特性Attribute参数内容。

      public class BasePage : Page
        {
            public BasePage()
            {
                this.Load += new EventHandler(BasePage_Load);
            }
    
            void BasePage_Load(object sender, EventArgs e)
            {
                Response.AddHeader("Accept-Charset","UTF-8");
                string op = GetRequest("op");
                if (!string.IsNullOrEmpty(op))
                {
                    System.Reflection.MethodInfo mi = this.GetType().GetMethod(op);
                    Attribute_Jude(mi);
                }
                this.Response.End();
            }
            /// <summary>
            /// 签名判断
            /// </summary>
            /// <param name="mi"></param>
            public void Attribute_Jude(MethodInfo mi)
            {
                MsgModel Msg = new MsgModel();
                if (mi.IsDefined(typeof(CashiSongAttribute), false))
                {
                    object[] attrs = mi.GetCustomAttributes(typeof(CashiSongAttribute), false);
                    CashiSongAttribute iplimit = (CashiSongAttribute)attrs[0];
                    object responsestr=null;
                    if (iplimit != null && iplimit.Param.Length > 0)
                    {
                        string server_sign = GetRequest("sign");
                        string client_sign = iplimit.ParamEncryption(this, mi);
                        if (!server_sign.Equals(client_sign, StringComparison.OrdinalIgnoreCase)&&iplimit.IsSign)
                        {
                            Msg.msg = "Sing Error";
                            Msg.toile = 0;
                            Send(Msg);
                            return;
                        }
                        responsestr = mi.Invoke(this, null);
                    }
                    Msg.toile = 1;
                    Msg.msg = responsestr.ToString();
                    Send(Msg);
                }
            }
            public void Send(MsgModel Msg)
            {
                Response.AddHeader("Content-type","applictaion/json");
                JavaScriptSerializer javaScript = new JavaScriptSerializer();
                string Con = javaScript.Serialize(Msg);
                Response.Write(Con);
            }
            public string GetRequest(string key)
            {
                if (Request.QueryString[key] == null)
                    return "";
                else
                    return Request.QueryString[key];
            }
        }
    
        public class MsgModel
        {
            public string msg { get; set; }
            public int toile { get; set; }
        }

    获取特性参数内容的方法(CashiSongAttribute 为自定义特性类)

     if (mi.IsDefined(typeof(CashiSongAttribute), false))
                {
                    object[] attrs = mi.GetCustomAttributes(typeof(CashiSongAttribute), false);
                    CashiSongAttribute iplimit = (CashiSongAttribute)attrs[0];
                }
  • 相关阅读:
    Perl 正则匹配经验记录
    Linux——高效玩转命令行
    推荐一个SAM文件或者bam文件中flag含义解释工具
    单端测序(Single- ead)和双端测序(Pai ed-end和Mate-pai )的关系
    区别samtools faid产生的.fai文件功能和bwa index 产生的四个文件的功能
    Perl新接触的小命令
    Perl调用外部命令(其他脚本、系统命令)的方法和区别
    Linux——命令
    学习《Python金融实战》中文版PDF+英文版PDF+源代码
    学习《深度学习与计算机视觉算法原理框架应用》《大数据架构详解从数据获取到深度学习》PDF代码
  • 原文地址:https://www.cnblogs.com/xiao-bei/p/4673790.html
Copyright © 2020-2023  润新知