用c#開發共享軟件,傳統的是採用註冊碼驗證方式,這種方式是大多數共享軟件採用的方式,另外還有一種常見的驗證方式,就是經過網絡受權認證的方式,這種方式經過在程序中調用服務器的服務進行。通常具備驗證用戶名可用、註冊新用戶、用戶登陸認證、用戶修改密碼等操做,另外還須要配備一個網絡受權入口給管理員對註冊的用戶進行受權控制。 c#
這個是爲了進行網絡受權認證搭建的一個簡單的管理後臺,用戶在共享軟件客戶端經過調用服務器的服務鏈接,能夠註冊一個新用戶,或者進行登陸獲取身份信息(試用、已註冊、已禁用等狀態),還能夠經過服務接口來進行密碼修改,提升安全性及使用合理性。安全
網絡認證有幾個好處,一是能夠不受限於傳統的機器碼限制,能夠在多個計算機中登陸使用;二是方便軟件開發者集中管理用戶信息,動態受權或者取消受權用戶的身份信息,還能夠獲取更多用戶的信息,以便進行推廣溝通。服務器
開發網絡受權業務後臺的時候,須要建立一個服務接口給軟件客戶端進行調用,這個服務接口能夠經過建立ashx這樣的處理程序來進行處理,這種類和ASPX頁面處理有些少不一樣,這個提供更原始的輸出,須要什麼輸出什麼。 ![在此輸入圖片描述][3]網絡
這個是爲了進行網絡受權認證搭建的一個簡單的管理後臺,用戶在共享軟件客戶端經過調用服務器的服務鏈接,能夠註冊一個新用戶,或者進行登陸獲取身份信息(試用、已註冊、已禁用等狀態),還能夠經過服務接口來進行密碼修改,提升安全性及使用合理性。測試
網絡認證有幾個好處,一是能夠不受限於傳統的機器碼限制,能夠在多個計算機中登陸使用;二是方便軟件開發者集中管理用戶信息,動態受權或者取消受權用戶的身份信息,還能夠獲取更多用戶的信息,以便進行推廣溝通。this
開發網絡受權業務後臺的時候,須要建立一個服務接口給軟件客戶端進行調用,這個服務接口能夠經過建立ashx這樣的處理程序來進行處理,這種類和ASPX頁面處理有些少不一樣,這個提供更原始的輸出,須要什麼輸出什麼。 [3]: http://static.oschina.net/uploads/space/2014/1218/092839_jSxs_183102.jpg 這個處理頁面和傳統的aspx頁面同樣,都接受相似test.aspx?id=1&name=test 這樣的參數,它的處理代碼以下所示。 複製代碼spa
/// <summary> /// 用戶測試帳號可用性、註冊新用戶、登陸驗證、修改密碼等操做業務處理類 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class UserAction : IHttpHandler { public void ProcessRequest(HttpContext context) { //context.Response.ContentType = "text/plain"; //context.Response.Write("Hello World"); context.Request.ContentEncoding = Encoding.Default ; string action = context.Request["action"]; string usr = context.Request["usr"]; string password = context.Request["pass"]; string machineCode = context.Request["code"];
複製代碼.net
經過獲取參數的內容,咱們就能夠進行不一樣的業務處理,這裏我使用了一個Action的標誌,用來區分是作什麼操做的。 複製代碼code
string action = context.Request["action"]; string usr = context.Request["usr"]; string password = context.Request["pass"]; string machineCode = context.Request["code"]; bool result = false; switch (action) { case "r"://檢測註冊 UserAction.ashx?action=r&usr=&pass=&code= string reg = BLLFactory<SoftwareRegister>.Instance.CheckRegisterd(usr, password, machineCode); context.Response.ContentType = "text/plain"; context.Response.Write(reg); break;
複製代碼orm
以上就是執行一個檢測用戶是否註冊的操做代碼,若是受權註冊了,返回true,若是用戶登陸成功但沒有受權,返回False,其餘錯誤返回字符串描述。具體的 BLLFactory<SoftwareRegister>.Instance.CheckRegisterd邏輯處理代碼以下所示。 複製代碼
public string CheckRegisterd(string username, string passwod, string code) { bool result = VerifyUser(username, passwod, code); if (result) { string condition = string.Format(" Username='{0}' and IsForbid <> true", username); SoftwareRegisterInfo info = base.FindSingle(condition); if (info != null) { if (info.IsRegister) { if (info.MachineCode != code && info.LastAccessed.AddMinutes(10) >= DateTime.Now) { return "一個帳號多處登陸!"; } else { info.MachineCode = code; info.LastAccessed = DateTime.Now; base.Update(info, info.ID.ToString()); return "true"; } } else { return "false"; } } else { return "帳號被鎖定"; } } else { return "帳號密碼不正確"; } }
複製代碼
那咱們在共享軟件的地方如何驗證用戶身份呢,就是經過傳遞頁面參數並調用ashx接口處理,判斷返回值便可。具體操做代碼以下所示。爲了簡化操做,裏面使用了一個個人公用類庫來提交數據(輔助類HttpHelper)。 複製代碼
private void btnOK_Click(object sender, EventArgs e) { if (this.txtUserName.Text.Length == 0) { MessageExUtil.ShowTips("請輸入帳號密碼登陸"); return; } string data = string.Format("action=r&usr={0}&pass={1}&code={2}", this.txtUserName.Text, this.txtPassword.Text, WHC.OrderWater.Commons.HardwareInfoHelper.GetMacAddress()); HttpHelper helper = new HttpHelper(); string result = helper.GetHtml(Portal.gc.UserActionUrl, data, true); if (!string.IsNullOrEmpty(result)) { if (result.ToLower() == "true") { Portal.gc.UserName = this.txtUserName.Text; Portal.gc.Registered = true; MessageExUtil.ShowTips("登陸成功"); this.DialogResult = DialogResult.OK; } else if (result.ToLower() == "false") { MessageExUtil.ShowTips("未受權用戶,但可繼續使用"); Portal.gc.UserName = this.txtUserName.Text; Portal.gc.Registered = false; this.DialogResult = DialogResult.OK; } else { MessageExUtil.ShowTips("操做失敗:" + result); } } else { MessageExUtil.ShowTips("操做失敗"); } }
複製代碼
以上就是一個功能的完整實現流程,其餘的功能也是相似操做,下面給出ashx的完整代碼實現,供你們參考,並指正。 複製代碼
/// <summary> /// 用戶測試帳號可用性、註冊新用戶、登陸驗證、修改密碼等操做業務處理類 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class UserAction : IHttpHandler { public void ProcessRequest(HttpContext context) { //context.Response.ContentType = "text/plain"; //context.Response.Write("Hello World"); context.Request.ContentEncoding = Encoding.Default ; string action = context.Request["action"]; string usr = context.Request["usr"]; string password = context.Request["pass"]; string machineCode = context.Request["code"]; string conditon = ""; bool result = false; switch (action) { case "r"://檢測註冊 UserAction.ashx?action=r&usr=&pass=&code= string reg = BLLFactory<SoftwareRegister>.Instance.CheckRegisterd(usr, password, machineCode); context.Response.ContentType = "text/plain"; context.Response.Write(reg); break; case "g"://測試登陸UserAction.ashx?action=g&usr=&pass=&code= result = BLLFactory<SoftwareRegister>.Instance.VerifyUser(usr, password, machineCode); context.Response.ContentType = "text/plain"; context.Response.Write(result); break; case "t"://測試用戶名UserAction.ashx?action=t&usr= result = BLLFactory<SoftwareRegister>.Instance.IsExistKey("Username", usr); context.Response.ContentType = "text/plain"; context.Response.Write(!result);//若是存在則返回False,不然True break; case "a"://添加用戶UserAction.ashx?action=a&usr=&pass=&sex=&code=&qq=&email= bool exist = BLLFactory<SoftwareRegister>.Instance.IsExistKey("Username", usr); if (!exist) { password = context.Request["pass"]; machineCode = context.Request["code"]; string sex = context.Request["sex"]; string qq = context.Request["qq"]; string email = context.Request["email"];
SoftwareRegisterInfo newInfo = new SoftwareRegisterInfo(); newInfo.Username = usr; newInfo.Password = MD5Util.GetMD5_16(password); newInfo.Sex = sex; newInfo.MachineCode = machineCode; newInfo.QQ = qq; newInfo.Email = email;
result = BLLFactory<SoftwareRegister>.Instance.Insert(newInfo); } context.Response.ContentType = "text/plain"; context.Response.Write(result); break; case "ep"://修改用戶密碼UserAction.ashx?action=ep&usr=&pass=&newp= conditon = string.Format("Username='{0}'", usr); password = context.Request["pass"]; string newpass = context.Request["newp"]; SoftwareRegisterInfo info = BLLFactory<SoftwareRegister>.Instance.FindSingle(conditon); if (info != null) { if (MD5Util.GetMD5_16(password) == info.Password) { info.Password = MD5Util.GetMD5_16(newpass); result = BLLFactory<SoftwareRegister>.Instance.Update(info, info.ID.ToString()); } } context.Response.ContentType = "text/plain"; context.Response.Write(result); break; } } public bool IsReusable { get { return false; } } }
代碼編寫完畢
若是要考慮安全性,可能總體還須要進行必定的調整,不過具體操做,已經實現了咱們所須要的功能了。可是共享軟件開發有待完善。