摘要
本文介紹一種入門級的網站授權(注:這里所指的授權指的是注冊碼效果,而不是網站登陸時的身份授權)方案,僅供學習交流及對付小白客戶使用。復雜的網站授權涉及網站加密等一系列復雜的技術,不做本文介紹內容。(如果有好的開源的項目,還請各位大大們不吝賜教)
功能說明
網站發布時,做一個授權處理是非常有必要的。可以有效防止客戶直接把你發布的網站直接COPY到別的電腦上,經過簡單的配置就直接可以運行。記得在學校做網站時,當時對HTTP請求沒研究過,直接在任何一個頁面加載時強制驗證。這樣做出來的功能可移植性很差。於是,寫下此文給新手一個指引。本方案可以靈活添加到你自己的ASP.NET站點中,只需要修改兩個配置,不須要添加一句C#代碼即可實現功能。
方案原理
授權的核心原理其實很簡單:
- 1、讀取服務器機器的一個唯一編號(CPU、硬盤序列號、網卡MAC等);
- 2、實現一個算法處理這個機器唯一編號,把處理的結果與序列號對比,如果相同則網站正常運行,如果不正常則強制跳轉到授權頁面;
- 3、直接攔截HttpRequest,即添加一層自定義的HttpModule。這樣無論客戶打開的是哪個URL,都會被攔截從而進行強制驗證;
- 4、最后當然還要做一個注冊機,不然要自己算注冊碼嗎?當然,你可以把做成WEB版,WINFORM版,哪怕DOS版都無所謂;
具體實現
1、新建類庫項目,名稱LYB.NET.Authorize;添加以下兩個引用
項目屬性中的目標框架改為:.Net Framework 4.0 而不是默認的.Net Framework 4.0 client profile。也就是用的.NET的完整版,而不是精簡版。
2、添加接口IAuthorize,該接口提供一個只讀的UniqueID及驗證注冊碼的方法。如下:
public interface IAuthorize { /// <summary> /// 服務器機器的唯一標識 /// </summary> string UniqueID { get; } /// <summary> /// 判斷所給注冊碼是否正確 /// </summary> /// <param name="strKey">注冊碼</param> bool VerifyKey(string strKey); }
3、添加一個MACAuthorize類,用MAC地址實現上面的接口(當然,你也可以自定義其它的類,用硬盤序列號等實現):
public class MACAuthorize : IAuthorize { private string _strId; public MACAuthorize() { ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject mo in moc) { if ((bool)mo["IPEnabled"] == true) { _strId = mo["MacAddress"].ToString(); break; } } } public string UniqueID { get { return _strId; } } public bool VerifyKey(string strKey) { Algorithm alg = new Algorithm(); return (alg.GetKey(_strId) == strKey); } }
4、在上面的MACAuthorize驗證中,用於一個Algorithm類,這是一個生成注冊碼的算法類,這個類不但驗證要用到,在我們制作注冊機的時候,也要用到這個類。我們添加並實現它:
public class Algorithm { /// <summary> /// 這里的算法,我只是做了一下簡單處理,你可以把整的很復雜,最好復雜到自己都看不懂 /// </summary> public string GetKey(string strUniqueId) { string strResult = strUniqueId.Replace(':', 'X'); byte[] resources = ASCIIEncoding.ASCII.GetBytes(strResult); for (int i = 0; i < resources.Length; i++ ) { if (resources[i] <= '9' && resources[i] >= '0') { resources[i] += 17; } } return ASCIIEncoding.ASCII.GetString(resources); } }
5、最后,我們要自定義一個HttpModule來攔截http請求,並強制驗證:
public class AuthorizeModule : IHttpModule { public void Dispose() { } public void Init(HttpApplication context) { context.BeginRequest += new EventHandler(context_BeginRequest); } void context_BeginRequest(object sender, EventArgs e) { IAuthorize auth = new MACAuthorize(); HttpApplication application = (HttpApplication)sender; string strKey = ConfigurationManager.AppSettings["LYB.NET.AUTHORIZE"]; //好吧,我只是把注冊碼放在web.config中 if (auth.VerifyKey(strKey)) { return; } application.CompleteRequest(); application.Context.Response.Write("你使用的站點未經授權,請復制下面機器碼以獲取注冊信息:<br> " + auth.UniqueID); } }
6、做完上面這些,你就可以打包生成一個DLL了。把它添加到你的WEB站點引用中。修改兩處WEB.CONFIG:
A、appSettings節點添加:(這是用來存儲注冊碼的地方)
<add key="LYB.NET.AUTHORIZE" value=""/>
B、System.Web節點下面添加:(這是為了添加自定義的httpmodule)
<httpModules> <add name="AuthorizeModule" type="LYB.NET.Authorize.AuthorizeModule,LYB.NET.Authorize"/> </httpModules>
7、這時運行你的網站,就可以出現類似下面的效果:
8、最后就是注冊機的制作了,新建一個WINFORM工程(當然根據你的愛好,你可以建任何工程),界面如下(上面為form1,下面為form2):
添加對LYB.NET.Authorize.DLL的引用,然后在BUTTON中添加以下代碼:
private void button1_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(textBox1.Text)) { MessageBox.Show("請輸入要授權的機器碼"); return; } Algorithm alg = new Algorithm(); this.textBox2.Text = alg.GetKey(textBox1.Text); }
運行一下,把剛剛你的站點上的機器碼COPY過來,生成一個注冊碼吧!
最后,把你生成的注冊碼復制到web.config <add key="LYB.NET.AUTHORIZE" value=""/>這個value中,即授權成功。你的網站即可正常運行。
總結
其實本方案主要是討論了HttpModule的一種用法,在制作大型商用WEB框架時,該方法相對來說非常雞肋。有興趣的同學可以深入研究一下。