用戶登錄與許可權驗證是網站不可缺少的一部分功能,asp.net MVC4框架內置了用於實現該功能的類庫,只需要簡單搭建即可完成該功能. 下麵詳細介紹該功能的完成方法,尾部有實例源碼下載,希望可以給剛開始接觸MVC的朋友做個參考. 第一步:給VS安裝MVC4框架 VS2012自帶MVC4框架,其他版本可 ...
用戶登錄與許可權驗證是網站不可缺少的一部分功能,asp.net MVC4框架內置了用於實現該功能的類庫,只需要簡單搭建即可完成該功能.
下麵詳細介紹該功能的完成方法,尾部有實例源碼下載,希望可以給剛開始接觸MVC的朋友做個參考.
第一步:給VS安裝MVC4框架
VS2012自帶MVC4框架,其他版本可以使用獨立安裝包進行安裝,這裡就不討論了,本例使用VS2013創建,.NET4.0+MVC4
第二步:創建MVC4網站項目
選擇文件-新建-項目,按下圖示例創建一個空的MVC網站
第三步:配置web.config,啟用Form驗證.
打開根目錄下的web.config,在<system.web>節點下插入一下代碼,啟用Form驗證並指定預設登錄頁面
<authentication mode="Forms"> <forms loginUrl="/Home/Login" timeout="2880"/> </authentication>
第四步:創建所需要文件
本例需要創建以下文件:
Model文件夾下LoginModel.cs
Controllers文件夾下HomeController.cs
View下創建文件下Home,文件夾下創建文件:
Index.cshtml
Login.cshtml
Show.cshtml
Edit.cshtml
Add.cshtml
文件結構如下圖所示:
第五步:填充LoginModel代碼
public class LoginModel { [Display(Name="用戶名")] [Required(ErrorMessage="用戶名不能為空")] public string UserName { get; set; } [Display(Name="密碼")] [Required(ErrorMessage="密碼不能為空")] [DataType(DataType.Password)] [RegularExpression(@"^\w+$", ErrorMessage = "密碼格式有誤,只能是字母數字或者下劃線")] public string Password { get; set; } [Display(Name="記住登陸?")] public bool RememberMe { get; set; } public string Login() { //該方法應從資料庫中對比用戶名和密碼,並取得用戶許可權列表 //這裡為了簡單直接對比字元串並返回許可權列表,返回NULL則說明用戶名或者密碼錯誤 //許可權列表即為用,分割的許可權名稱 string result = null; if (this.UserName == "guest" & this.Password == "guest") result = "Add"; if (this.UserName == "admin" & this.Password == "admin") result = "Add,Edit"; return result; } }
複製上面代碼到類中時VS的智能感知會提示你缺少以下命名空間,添加上即可
using System.ComponentModel.DataAnnotations;
第五步:填充HomeControll代碼
public class HomeController : Controller { // // GET: /Home/ public ActionResult Index() { ViewBag.Info = "該頁面不含許可權註解,所有人均可訪問."; return View(); } [Authorize(Roles = "Edit")] //該註解表示只有包含Edit許可權的用戶才可以訪問 public ActionResult Edit() { ViewBag.Info = "該頁面需要包含Edit許可權的人才可訪問."; return View(); } [Authorize(Roles = "Add")] //該註解表示只有包含Add許可權的用戶才可以訪問 public ActionResult Add() { ViewBag.Info = "該頁面需要包含Add許可權的人才可訪問."; return View(); } [Authorize(Roles = "Add,Edit")] //該註解表示只有包含Add許可權的用戶才可以訪問 public ActionResult Show() { ViewBag.Info = "該頁面需要包含Edit或者Add許可權的人才可訪問."; return View(); } public ActionResult Login(LoginModel model) { return View(); } [HttpPost] //該註解表示只接收Post數據 [ValidateAntiForgeryToken]//該註解可以防止跨站攻擊 [ActionName("Login")]//該註解可以更改路由中Action名稱 public ActionResult LoginCheck(LoginModel model) { if (!ModelState.IsValid) { //用戶輸入服務端驗證,此處處理驗證不通過的提示代碼 本例略過 return View(); } string result = model.Login(); if (result == null) { //用戶名或者密碼不正確的提示代碼 本例略過 return View(); } else { //用戶登陸核心代碼 FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket( 1, model.UserName, DateTime.Now, DateTime.Now.AddHours(240),//記住密碼的時間 model.RememberMe,//是否保存cookie 記住密碼 result //獲取的用戶許可權列表 用逗號分割的字元串 ); string encryptedTickt = FormsAuthentication.Encrypt(authTicket); HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTickt); Response.Cookies.Add(authCookie); Response.Redirect("/Home", true); ActionResult empty = new EmptyResult(); return empty; } return View(); }
複製以上代碼,會提示添加以下命名空間:
using ChengChenXu.MVC4_Login_Demo.Models; //項目Model命名空間 using System.Web.Security;
第六步:填充View代碼,下麵代碼僅展示<Body>標簽內部的內容,頁頭沒有展示(源碼中完全).
Index.cshtml
<h1>@ViewBag.Info</h1><br /> <a href="/home/login">登陸</a><br /> <p>以下鏈接 登陸後才可以訪問 未登陸時如果點擊則會跳轉到登陸頁</p> <a href="/home/add">添加頁面</a><br /> <a href="/home/edit">編輯頁面</a><br /> <a href="/home/show">查看頁面</a><br />
Add.cshtml Edit.cshtml Show.cshtml 三個文件代碼一致
<h1>@ViewBag.Info</h1> <a href="/home">返回</a><br />
Login.cshtml 該文件首先要在頂部添加一行代碼,表示是一個強類型View
@model ChengChenXu.MVC4_Login_Demo.Models.LoginModel
頁面代碼:
@using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.LabelFor(model=>model.UserName) @Html.TextBoxFor(model => model.UserName) <br /> @Html.LabelFor(model=>model.Password) @Html.PasswordFor(model => model.Password) <br /> @Html.LabelFor(Model=>Model.RememberMe) @Html.CheckBoxFor(model=>model.RememberMe) <br /> <input type="submit" class="submit" tabindex="3" value="登錄" /> }
第七步:修改根目錄下Global.asax的代碼,添加許可權處理代碼,把下麵兩個方法複製添加到Global文件即可
public MvcApplication() { AuthorizeRequest += new EventHandler(MvcApplication_AuthorizeRequest); } void MvcApplication_AuthorizeRequest(object sender, EventArgs e) { var id = Context.User.Identity as FormsIdentity; if (id != null && id.IsAuthenticated) { var roles = id.Ticket.UserData.Split(','); Context.User = new GenericPrincipal(id, roles); } }
複製好後會提示缺少以下命名空間:
using System.Web.Security; using System.Security.Principal;
完成好之後全部實例就完成了,運行以下試試吧.
主頁為/Home 無需許可權
登錄頁為/Home/Login 無需許可權
添加頁為/Home/Add 需要Add許可權
展示頁為/Home/Show 需要Edit或者Add許可權
編輯頁為/Home/Edit 需要Edit許可權
內置了兩個賬號
賬號 密碼 許可權
guest guest "add"
admin admin "add,edit"
運行結果:
如果直接訪問除了Home和Login頁面之外的頁面(需要許可權的頁面) 則會跳轉到Login頁面
guest賬號可以訪問Add Show頁面
admin賬號可以訪問Add Edit Show頁面
錦上添花:
1 自動跳轉到登錄頁的時候URL會有一個ReturnUrl參數記錄跳轉前的頁面,可以捕捉該頁面登錄後跳回
2 MVC支持客戶端驗證,需要js文件支持,這樣客戶端就不再需要寫js代碼進行輸入驗證了.本例不再展示了,請自行搜索.
本博文轉自我的博客:http://chengchenxu.com/Article/show/14/
源碼下載:http://chengchenxu.com/ueditor/net/upload/file/20180305/6365584952537468509926479.rar