本次開(kāi)發(fā)是將三層架構(gòu)與MVC結(jié)合一起來(lái),我們看下面一個(gè)系統(tǒng)結(jié)構(gòu):
創(chuàng)新互聯(lián)是一家專(zhuān)注于成都網(wǎng)站制作、成都網(wǎng)站建設(shè)與策劃設(shè)計(jì),慶元網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:慶元等地區(qū)。慶元做網(wǎng)站價(jià)格咨詢(xún):18980820575View ->Contraller->Model->BLL->DAL->SQLSERVER
| | |
----------->Extensions----->FrameWork
|
__>Common
Extensions包括擴(kuò)展類(lèi)功能,例如控件的再重新,權(quán)限的重新驗(yàn)證等。Common是一些公共×××。
第一步:創(chuàng)建用戶(hù)登錄模型,可以與注冊(cè)模型類(lèi)(SysComUerRegister),用戶(hù)模型(SysComUser)寫(xiě)入同一個(gè)文件中。
////// 用戶(hù)登錄 /// ///子類(lèi)并不映射到任何數(shù)據(jù)庫(kù),加上一個(gè)不映射的屬性[NotMapped] [NotMapped] public class SysComUserLogin { [Display(Name = "登錄名", Description = "4-20個(gè)字符")] [Required(ErrorMessage = "×")] [StringLength(20, MinimumLength = 4, ErrorMessage = "×")] public string LoginName { get; set; } [Display(Name = "登錄密碼", Description = "6-20個(gè)字符")] [Required(ErrorMessage = "×")] [StringLength(20, MinimumLength = 6, ErrorMessage = "×")] [DataType(DataType.Password)] public new string Password { get; set; } [Display(Name = "驗(yàn)證碼", Description = "請(qǐng)輸入驗(yàn)證碼!")] [Required(ErrorMessage = "×")] [StringLength(4, MinimumLength = 4, ErrorMessage = "×")] public string VerificationCode { get; set; } }
第二步:控制器Conrallers方法的實(shí)現(xiàn)。這里我們考慮有三個(gè):一個(gè)是默認(rèn)的登錄頁(yè)面方法,一個(gè)是HTTPPOST提交登錄數(shù)據(jù)的方法,還有一個(gè)注銷(xiāo)的方法。如下:
////// 用戶(hù)登錄頁(yè)面 /// ///public ActionResult UserLogin() { return View(); } /// /// 用戶(hù)提交登錄 /// /// ///[HttpPost] public ActionResult UserLogin(SysComUserLogin userLogin) { //說(shuō)明:因?yàn)樵贛odels中,已經(jīng)實(shí)現(xiàn)用戶(hù)名和密碼驗(yàn)證規(guī)則,因?yàn)檫@里不需要重復(fù)判斷了,但驗(yàn)證碼除外,因?yàn)樗潜4鍿ession緩存中. if (String.IsNullOrEmpty(Session["VerificationCode"].ToString())) { ModelState.AddModelError("VerificationCode", "×"); return View(); } else if (Session["VerificationCode"].ToString() != userLogin.VerificationCode) { ModelState.AddModelError("VerificationCode", "×"); return View(); } else { if (userRpy.Authentication(userLogin.LoginName,userLogin.Password) == 0) { HttpCookie _cookie = new HttpCookie("user"); _cookie.Values.Add("loginname", userLogin.LoginName); _cookie.Values.Add("password", userLogin.Password); Response.Cookies.Add(_cookie); ModelState.AddModelError("Message", "登陸成功!!"); return View(); } else { ModelState.AddModelError("Message", "登陸失?。?); return View(); } } } /// /// 注銷(xiāo)登錄信息 /// ///URL public ActionResult UserLoginOut() { HttpCookie _cookie = HttpContext.Request.Cookies["user"]; if (_cookie != null) { //失效時(shí)間 _cookie.Expires = DateTime.Now.AddHours(-1); Response.Cookies.Add(_cookie); } return View(); }
這里面用到一個(gè)Authentiction()用戶(hù)身份驗(yàn)證方法,所以需要在BLL業(yè)務(wù)層實(shí)現(xiàn)。
第三步:BLL業(yè)務(wù)邏輯層方法實(shí)現(xiàn)
////// 用戶(hù)登錄身份驗(yàn)證 /// /// 登錄名 /// 密碼 ///0:登錄成功;1:登錄名不存在;2:密碼錯(cuò)誤 public int Authentication(string loginName, string password) { var _user = HillstoneContext.SysComUser.SingleOrDefault(u=>u.LoginName==loginName); if (_user == null) { return 1; } if (_user.Password != password) { return 2; } return 0; }
第四步:所有涉及的東西都寫(xiě)完了,下面就是實(shí)現(xiàn)VIEW了。如下:
@model Hillstone.Models.SysComUserLogin @{ ViewBag.Title = "用戶(hù)登錄"; Layout = "~/Views/Shared/_Layout.cshtml"; }}UserLogin
@using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.ValidationSummary(true)
第五部:其他考慮,我們登錄后,每次頁(yè)面跳轉(zhuǎn)或者刷新,需要確認(rèn)身份是否失效或者有效,那么問(wèn)題就來(lái)了,是不是在所有的頁(yè)面請(qǐng)求Contraller時(shí)候都要調(diào)用BLL中的Authencation()方法來(lái)驗(yàn)證呢?其實(shí)系統(tǒng)默認(rèn)有驗(yàn)證機(jī)制類(lèi)庫(kù),我們可以重新寫(xiě)這個(gè)接口,使用起來(lái)更加簡(jiǎn)潔方面,提交我們的開(kāi)發(fā)效率。所以我做個(gè)擴(kuò)展,在Extensions文件夾中新建UserAuthorizeAttribute.cs類(lèi)。如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Hillstone.BLL; namespace System.Web.Mvc { ////// 用戶(hù)權(quán)限驗(yàn)證 /// public class UserAuthorizeAttribute:AuthorizeAttribute { ////// 核心【驗(yàn)證用戶(hù)是否登錄】以后只要在需要登錄后才能操作的Action或Controller上加[UserAuthorize]就可實(shí)現(xiàn)驗(yàn)證是否已經(jīng)登錄了。 /// /// HTTP請(qǐng)求 ///布爾值:True or False protected override bool AuthorizeCore(HttpContextBase httpContext) { if (httpContext.Request.Cookies["user"] == null) return false; HttpCookie _cookie = httpContext.Request.Cookies["user"]; string _loginName = _cookie["loginname"]; string _password = _cookie["password"]; httpContext.Response.Write("登錄名:" + _loginName); if (string.IsNullOrEmpty(_loginName) || string.IsNullOrEmpty(_password)) return false; SysComUserRepository userRsy = new SysComUserRepository(); if (userRsy.Authentication(_loginName, _password) == 0) return true; else return false; } } }
繼承AuthorizeAttribute類(lèi)庫(kù),這里做AuthorizeCore方法重寫(xiě),里面調(diào)用BLL中的Authencation()登錄驗(yàn)證方法。 以后所有需要登錄之后才能操作的Contraller中,在Action之前加上[UserAuthorize]即可。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專(zhuān)業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買(mǎi)多久送多久。