基於HttpModule的簡單.NET網站授權方案


摘要

    本文介紹一種入門級的網站授權(注:這里所指的授權指的是注冊碼效果,而不是網站登陸時的身份授權)方案,僅供學習交流及對付小白客戶使用。復雜的網站授權涉及網站加密等一系列復雜的技術,不做本文介紹內容。(如果有好的開源的項目,還請各位大大們不吝賜教)

功能說明

    網站發布時,做一個授權處理是非常有必要的。可以有效防止客戶直接把你發布的網站直接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框架時,該方法相對來說非常雞肋。有興趣的同學可以深入研究一下。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM