標籤:http ar io os 使用 sp for java on
用c#開發共用軟體,傳統的是採用註冊碼驗證方式,這種方式是大多數共用軟體採用的方式,另外還有一種常見的驗證方式,就是通過網路授權認證的方式,這種方式通過在程式中調用伺服器的服務進行。一般具有驗證使用者名稱可用、註冊新使用者、使用者登入認證、使用者修改密碼等操作,另外還需要配備一個網路授權入口給管理員對註冊的使用者進行授權控制。
這個是為了進行網路授權認證搭建的一個簡單的管理後台,使用者在共用軟體用戶端通過調用伺服器的服務串連,可以註冊一個新使用者,或者進行登入擷取身份資訊(試用、登入、已禁用等狀態),還可以通過服務介面來進行密碼修改,提高安全性及使用合理性。
網路認證有幾個好處,一是可以不受限於傳統的機器碼限制,可以在多個電腦中登入使用;二是方便軟體開發人員集中系統管理使用者資訊,動態授權或者取消授權使用者的身份資訊,還可以擷取更多使用者的資訊,以便進行推廣溝通。
開發網路授權業務背景時候,需要建立一個服務介面給軟體用戶端進行調用,這個服務介面可以通過建立ashx這樣的處理常式來進行處理,這種類和ASPX頁面處理有些少不同,這個提供更原始的輸出,需要什麼輸出什麼。
這個是為了進行網路授權認證搭建的一個簡單的管理後台,使用者在共用軟體用戶端通過調用伺服器的服務串連,可以註冊一個新使用者,或者進行登入擷取身份資訊(試用、登入、已禁用等狀態),還可以通過服務介面來進行密碼修改,提高安全性及使用合理性。
網路認證有幾個好處,一是可以不受限於傳統的機器碼限制,可以在多個電腦中登入使用;二是方便軟體開發人員集中系統管理使用者資訊,動態授權或者取消授權使用者的身份資訊,還可以擷取更多使用者的資訊,以便進行推廣溝通。
開發網路授權業務背景時候,需要建立一個服務介面給軟體用戶端進行調用,這個服務介面可以通過建立ashx這樣的處理常式來進行處理,這種類和ASPX頁面處理有些少不同,這個提供更原始的輸出,需要什麼輸出什麼。
這個處理頁面和傳統的aspx頁面一樣,都接受類似test.aspx?id=1&name=test 這樣的參數,它的處理代碼如下所示。
複製代碼
/// <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"];
複製代碼
通過擷取參數的內容,我們就可以進行不同的業務處理,這裡我使用了一個Action的標誌,用來區分是做什麼操作的。
複製代碼
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;
複製代碼
以上就是執行一個檢測使用者是否註冊的作業碼,如果授權註冊了,返回true,如果使用者登入成功但沒有授權,返回False,其他錯誤返回字串描述。具體的
BLLFactory .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; } }}
代碼編寫完畢
如果要考慮安全性,可能整體還需要進行一定的調整,不過具體操作,已經實現了我們所需要的功能了。但是共用軟體開發有待完善。
c#如何對共用軟體的登入,註冊使用者等進行網路授權認證