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

來源:互聯網
上載者:User
摘要

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

功能說明

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.