zoukankan      html  css  js  c++  java
  • .Net开发笔记(二十)创建一个需要授权的第三方组件

    在使用需要授权的软件时,注册付费的目标是软件的使用者,我们开发人员平时用到的一些第三方组件也是需要授权付费的,也就是说,付费者是开发人员,并不是系统(使用了该第三方组件)的最终使用者。

    以上两者的区别如下图:

    图1

    本篇文章介绍.net中怎样开发需要授权的第三方控件(组件),既然授权对象是开发者,不是最终用户,那么授权入口只能提供给开发人员,而不应该提供给最终用户。另外,一般情况下,组件的一次成功授权只能供一个开发人员使用,因此授权信息需要跟开发人员的电脑绑定,这个可以通过关联机器硬件编码来做到。软件开发完成发布后,第三方组件不应该影响用户的使用,也就是说,发布后的组件,不能再绑定到具体电脑。总结一下,大概包含以下几点:

    • 组件的授权收费是针对使用该组件开发软件的人;
    • 组件的授权跟机器绑定,一次成功的授权只能供一个开发人员使用;
    • 软件发布后,组件不能再影响最终用户,第三方组件的授权入口对最终用户透明。

    要解决以上三点,需要知道很重要的一个概念就是之前系列博客中介绍的“设计时(Design-Time)”和“运行时(Run-Time)”,以及明白它两的区别和联系。

    前面系列博客得知:

    任何一个组件有两种状态,即“设计时”和“运行时”,简单之,组件处在窗体设计器中时,它就处于“设计时”;反之,程序跑起来后,组件就处于“运行时”。同一个组件,处于设计时的行为和处于运行时的行为可能不一样,这就像同一个人,在他老爸面前和在他儿子面前的行为可能不一样。用一个简洁的代码展示如下:

     1 class 组件
     2 {
     3 public 组件()
     4 {
     5     if(设计时)
     6     {
     7          //do something while design-time
     8     }
     9     else
    10     {
    11          //do something while run-time
    12     }
    13 }
    14 public void DoSomething()
    15 {
    16    if(设计时)
    17 {
    18     //do something while design-time
    19 }
    20 else
    21 {
    22    //do something while run-time
    23 }
    24 }
    25 }
    View Code

    如上代码所示,软件开发阶段,开发人员使用第三方组件,需要在窗体设计器中实例化一个组件实例,那么这时候就可以检查组件在当前机器上的授权状态(已授权、试用期还是已过期),这时候检查授权状态需要和当前机器硬件信息关联。软件发布后,组件不再在窗体设计器中,同时组件面向的是最终用户,理论上不应该再检查组件的授权状态,但是为了防止开发人员使用试用期的组件发布了软件,因此在组件发布后,还是有必要检查一下组件的授权状态,这时候检查方式就不用与硬件信息关联了。

    本篇Demo中做了一个等待控件,我们在使用它进行开发的时候需要取得授权许可,授权时根据生成的申请码(跟本机硬盘编号关联),去匹配组件开发商提供的激活码,两者一致的话,授权成功,否则提供30天的试用期,在试用阶段,界面显示试用标志,30天试用结束后,组件不能再继续试用。如果需要发布,则需要调用组件对应的方法,给它提供一个申请码和一个激活码,授权成功,组件正常使用,授权不成功,组件显示未授权标志(但不要求最终用户获得授权)。

    判断组件当前状态方法:

     1  /// <summary>
     2         /// 检查组件状态
     3         /// </summary>
     4         void CheckStatus()
     5         {
     6             ISelectionService isp = GetService(typeof(ISelectionService)) as ISelectionService; //获取服务
     7 //同一个组件 处于不同状态下 有不同的行为
     8             if (isp == null) //组件处于发布时(或者运行时 run-time)
     9             {
    10 //什么都不干
    11             }
    12             else //组件处于开发时(或者设计时 design-time)
    13             {
    14                 if (AuthorizeHelper.CheckActivateCode(Properties.Settings.Default.ActivateCode, LocalMachine.GetAskCode())) //检查是否已授权
    15                 {
    16                     currentStatus = 1; //开发时已授权
    17                 }
    18                 else
    19                 {
    20                     using (frmAuthority frma = new frmAuthority()) //授权对话框
    21                     {
    22                         if (frma.ShowDialog() == DialogResult.OK) //授权成功
    23                         {
    24                             currentStatus = 1;
    25                         }
    26                         else
    27                         {
    28                             if ((DateTime.Now - Properties.Settings.Default.TrialStart).TotalDays >= 30) //判断试用是否到期
    29                             {
    30                                 //抛异常
    31                                 throw new Exception("ProgressBar组件未授权!");
    32                             }
    33                             else
    34                             {
    35                                 currentStatus = 0; //开发时试用
    36                             }
    37                         }
    38                     }
    39                 }
    40             }
    41         }
    View Code

    发布后,提供申请码和激活码激活组件:

     1 /// <summary>
     2         /// 发布时授权入口
     3         /// </summary>
     4         /// <param name="askCode"></param>
     5         /// <param name="activateCode"></param>
     6         public void UnLock(string askCode, string activateCode)
     7         {
     8             if (AuthorizeHelper.CheckActivateCode(activateCode, askCode)) //判断是否合法
     9             {
    10                 currentStatus = 3; //开发时(运行时)已授权
    11             }
    12             else
    13             {
    14                 currentStatus = 2; //开发时(运行时)试用
    15             }
    16         }
    View Code

    注:本文主要讲述第三方组件授权原理,其余有关授权方式是否安全等有待完善。

    Demo项目结构:

    图2

    效果图:

    1)开发阶段,组件授权界面

    图3

    2)开发阶段,ProgressBar试用期

    图4

    3)发布后,未授权的ProgressBar

    图5

    4)开发阶段,授权成功

    图6

    源码下载地址:http://files.cnblogs.com/xiaozhi_5638/ComponentCopyProtection.rar

    希望有帮助!

     

  • 相关阅读:
    从虚拟地址,到物理地址(开PAE)
    无LoadLibrary获取指定模块基址
    练习
    Centos安装Python3及设置对应版本pip
    Varnish安装使用(初学)
    luogu P2463 [SDOI2008]Sandy的卡片 |二分+hash
    luogu P2852 [USACO06DEC]牛奶模式Milk Patterns |二分+hash
    luogu P4051 [JSOI2007]字符加密 |后缀数组(SA)
    弦图 学习笔记&
    luogu P1600 天天爱跑步 |树上差分+LCA
  • 原文地址:https://www.cnblogs.com/xiaozhi_5638/p/3484299.html
Copyright © 2011-2022 走看看