控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

Silverlight4控件纯客户端注册验证

作者:葡萄城 出处:葡萄城 2010年08月31日 阅读:

本文实现了一个实验性的Silverlight控件纯客户端注册验证机制。希望做过这方面的朋友多给些指导性意见。
   

先给大家介绍一下Silverlight客户端控件的使用情景。一般来说,Silverlight客户端控件会销售给开发Silverlight程序的公司,他们是控件的购买者。他们开发的程序中会用到Silverlight客户端控件。但是Silverlight控件最终是在浏览Silverlight程序的网站用户机器上执行的。说的有点绕,请参照下图。

这个纯客户端注册验证机制主要流程如下:
1, 控件购买者下载使用Silverlight控件(Silverlight控件中包含PublicKey及验证License的逻辑)。
2, 控件购买者通过控件生成商提供的网站输入一些注册信息(如输入程序部署路径等唯一标示),付费,完成注册。控件生成商会记录这些信息,并使用PrivateKey生成一个RSA签名过的License文件。
3, 控件生产商会将这个RSA签名过的License文件返回给控件购买者。
4, 控件购买者会将License文件绑定到他开发部署的程序中。
5, 网站用户浏览控件购买者开发部署的网站,下载Silverlight控件在网站用户机器上执行,并验证License文件的签名及程序部署路径等唯一标识。

License格式如下:

1 <License>
2   <Id>31f81fef-a036-4f6f-b47b-d0c8da1674ea</Id>
3   <AssemblyName>Vendor.TestControl, Version=1.0.0.0, Culture=neutral, PublicKeyToken=696fd0988622108f</AssemblyName>
4   <AuthorisedApp>http://localhost:8888/ClientBin/Customer.TestApp.xap</AuthorisedApp>
5   <Signature>MVALuQLzIK8SWfZ5q25/PD3P6ZV0FLqIhCt5YcZ7yNkBTuLABg/TGggC4imU2S6QyZBOLsXyEOSFfXXxBn7Spwhkr6P+CbQb0MvotPgr5nenLdccm7UwABkn7+PgtEchObGba5KUhHCAkvvSFfwi/e480AYI2YXznVpCsP8RA8o=</Signature>
6 </License>

 

License中记录了控件生成商数据库中License信息记录Id,强名称签名的目标控件程序集全名,程序部署路径等一些唯一性标示及防止篡改这些信息的RSA数字签名。

 

当用户浏览网站时,Silverlight控件会下载到在用户机器上执行,从而进行注册码验证工作。它会首先验证License的合法性(即使用RSA签名验证算法检验License文件是否被篡改),然后会判断程序集及唯一性标示是否正确。从而判断控件是否成功注册

   

验证License合法性代码如下:

01 public class License
02 {
03     private static readonly string PublicKeyXmlString = "<RSAKeyValue><Modulus>wG5DRppiesQegis92ZyJOO3ADC6ANV470SPyOhuYBpDpwA/UX4gO3XQhEr2jx09ZLQWYvwVJdSg4JhoO46fw11nsQObzwd+wz/jEcjSF9MCfK+CVb3qMHH9TBgHh5dy7zbB+hUkuacm/nKY9bPfaoNj4sA2YnbiPl3+v80qy/gE=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
04     private static readonly RSAManaged.RSAPublicKey PublicKey = null;
05     static License()
06     {
07         PublicKey = RSAManaged.RSAPublicKey.FromXmlString(PublicKeyXmlString);
08     }
09  
10     internal License()
11     {
12     }
13  
14     internal string Id { get; set; }
15     public string AssemblyName { get; internal set; }
16     public string AuthorisedApp { get; internal set; }
17     internal byte[] Signature { get; set; }
18  
19     public bool IsValid()
20     {
21         //在这里验证License是否合法
22         byte[] signData = Encoding.UTF8.GetBytes(this.Id + this.AssemblyName + this.AuthorisedApp);
23         SHA1Managed sha1 = new SHA1Managed();
24         bool verifyResult = RSAManaged.RSAManaged.Verify(signData, PublicKey, sha1, this.Signature);
25         sha1.Clear();
26         return verifyResult;
27     }

 

验证程序集全名及程序部署路径等唯一性标示代码如下:

01 private static bool ValidateLicenseFile()
02 {
03     AssemblyName assemblyName = new AssemblyName(Application.Current.GetType().Assembly.FullName);
04     Uri uri = new Uri("/" + assemblyName.Name + ";component/license.lic", UriKind.Relative);
05     StreamResourceInfo sri = Application.GetResourceStream(uri);
06     if (sri == null)
07     {
08         return false;
09     }
10  
11     string licenseXmlString = new StreamReader(sri.Stream).ReadToEnd();
12     License license = License.FromXmlString(licenseXmlString);
13     if (license == null || !license.IsValid())
14     {
15         return false;
16     }
17  
18     //在这里验证程序集全名是否合法
19     if (Assembly.GetExecutingAssembly().FullName != license.AssemblyName)
20     {
21         return false;
22     }
23  
24     //在这里验证程序部署路径等唯一性标示
25     if (Application.Current.Host.Source.AbsoluteUri != license.AuthorisedApp)
26     {
27         return false;
28     }
29  
30     return true;
31 }

 

优点:
    +使用私钥签名,公钥验证,能有效防止伪造License文件及分析代码写出注册机(不考虑篡改程序逻辑的爆破方式)。
    +纯客户端验证不需要跨域访问,也不需要控件购买者在程序发布服务器端部署其他东西。

缺点:
    -比直接输入注册码麻烦
    -在现在的Silverlight版本中,只找到部署地址这个特征标示,因此只能做部署License授权。不能做成像WinForm控件那样为每个开发人员机器授权的方式。

 

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统