Asp.net mvc驗(yàn)證用戶登錄之Forms實(shí)現(xiàn)詳解
這里我們采用asp.net mvc 自帶的AuthorizeAttribute過(guò)濾器驗(yàn)證用戶的身份,也可以使用自定義過(guò)濾器,步驟都是一樣。
第一步:創(chuàng)建asp.net mvc項(xiàng)目, 在項(xiàng)目的App_Start文件夾下面有一個(gè)FilterConfig.cs,在這個(gè)文件中可以注冊(cè)全局的過(guò)濾器。我們?cè)谖募刑砑覣uthorizeAttribute過(guò)濾器如下:
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); //將內(nèi)置的權(quán)限過(guò)濾器添加到全局過(guò)濾中 filters.Add(new System.Web.Mvc.AuthorizeAttribute()); } }
第二步:在web.config配置文件中修改網(wǎng)站的身份認(rèn)證為mode="Forms"
<system.web> <!--Cockie名稱,當(dāng)用未登入時(shí)跳轉(zhuǎn)的url--> <authentication mode="Forms"> <forms name="xCookie" loginUrl="~/Login/Index" protection="All" timeout="60" cookieless="UseCookies"></forms> </authentication> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> </system.web>
提示:配置name值作為最終生成的cookie的名稱,loginUrl指定當(dāng)用戶未登入是跳轉(zhuǎn)的頁(yè)面,這里挑戰(zhàn)到登入頁(yè)面
第三步:添加用戶登入相關(guān)的控制器和視圖
創(chuàng)建LoginController控制器:
public class LoginController : Controller { [HttpGet] [AllowAnonymous] public ActionResult Index() { return View(); } [HttpPost] [AllowAnonymous] public ActionResult Login(User user) { if (!user.Username.Trim().Equals("liuxin") || !user.Password.Trim().Equals("abc")) { ModelState.AddModelError("", "用戶名或密碼錯(cuò)誤"); return View("index", user); } //if (!user.Username.Trim().Equals("liuxin")) { // ModelState.AddModelError("Username", "用戶名錯(cuò)誤"); // return View("index", user); //} //if (!user.Password.Trim().Equals("abc")) { // ModelState.AddModelError("Password", "密碼錯(cuò)誤"); // return View("index", user); //} user.Id = Guid.NewGuid().ToString("D");//為了測(cè)試手動(dòng)設(shè)置一個(gè)用戶id FormsAuthHelp.AddFormsAuthCookie(user.Id, user, 60);//設(shè)置ticket票據(jù)的名稱為用戶的id,設(shè)置有效時(shí)間為60分鐘 return Redirect("~"); } [HttpGet] public ActionResult Logout() { FormsAuthHelp.RemoveFormsAuthCookie(); return Redirect("~/Login/Index"); } }
特別注意:Index和Login這兩個(gè)方法得使用“[AllowAnonymous]”指明這兩個(gè)方法可以匿名訪問(wèn),否則由于過(guò)濾器不允許匿名訪問(wèn),導(dǎo)致登入頁(yè)面和用戶提交都無(wú)法進(jìn)行。顯然這不是我們希望看到的。
提示:為了測(cè)試方便這邊的用戶的數(shù)據(jù)是寫死的,用戶的id也是臨時(shí)生成了一個(gè)
public class User { public string Id { get; set; } public string Username { get; set; } public string Password { get; set; } }
創(chuàng)建登入視圖:
@{ Layout = null; ViewBag.Title = "Index"; } <h3>您尚未登入,請(qǐng)登入</h3> @using(Html.BeginForm("Login", "Login", FormMethod.Post)) { @Html.Label("Username", "用戶名:")@Html.TextBox("Username", null, new { id = "Username", placeholder = "請(qǐng)輸入用戶名" }) @Html.ValidationMessage("Username")<br/> @Html.Label("Password", "密 碼:")@Html.TextBox("Password", null, new { id = "Password", placeholder = "請(qǐng)輸入密碼" }) @Html.ValidationMessage("Password")<br/> <input type="submit" value="登入" /> <input type="reset" value="重置" /> @Html.ValidationSummary(true) }
提示:當(dāng)檢測(cè)到用戶未登入,則跳轉(zhuǎn)到web.config中配置的url頁(yè)面,當(dāng)用戶填寫密碼并提交時(shí),用戶輸入的數(shù)據(jù)會(huì)提交到LoginController控制器下的Login方法,驗(yàn)證用戶的輸入,認(rèn)證失敗重新返回到登入界面,當(dāng)認(rèn)證成功,將會(huì)執(zhí)行
<<***FormsAuthHelp.AddFormsAuthCookie(user.Id, user, 60);//設(shè)置ticket票據(jù)的名稱為用戶的id,設(shè)置有效時(shí)間為60分鐘***>>,這條語(yǔ)句的作用是生成一個(gè)ticket票據(jù),并封裝到cookie中,asp.net mvc正式通過(guò)檢測(cè)這個(gè)cookie認(rèn)證用戶是否登入的,具體代碼如下
第四步:將用戶信息生成ticket封裝到cookie中
public class FormsAuthHelp { /// <summary> /// 將當(dāng)前登入用戶的信息生成ticket添加到到cookie中(用于登入) /// </summary> /// <param name="loginName">Forms身份驗(yàn)證票相關(guān)聯(lián)的用戶名(一般是當(dāng)前用戶的id,作為ticket的名稱使用)</param> /// <param name="userData">用戶信息</param> /// <param name="expireMin">有效期</param> public static void AddFormsAuthCookie(string loginName, object userData, int expireMin) { //將當(dāng)前登入的用戶信息序列化 var data = JsonConvert.SerializeObject(userData); //創(chuàng)建一個(gè)FormsAuthenticationTicket,它包含登錄名以及額外的用戶數(shù)據(jù)。 var ticket = new FormsAuthenticationTicket(1, loginName, DateTime.Now, DateTime.Now.AddDays(1), true, data); //加密Ticket,變成一個(gè)加密的字符串。 var cookieValue = FormsAuthentication.Encrypt(ticket); //根據(jù)加密結(jié)果創(chuàng)建登錄Cookie //FormsAuthentication.FormsCookieName是配置文件中指定的cookie名稱,默認(rèn)是".ASPXAUTH" var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieValue) { HttpOnly = true, Secure = FormsAuthentication.RequireSSL, Domain = FormsAuthentication.CookieDomain, Path = FormsAuthentication.FormsCookiePath }; //設(shè)置有效時(shí)間 if (expireMin > 0) cookie.Expires = DateTime.Now.AddMinutes(expireMin); var context = HttpContext.Current; if (context == null) throw new InvalidOperationException(); //寫登錄Cookie context.Response.Cookies.Remove(cookie.Name); context.Response.Cookies.Add(cookie); } /// <summary> /// 刪除用戶ticket票據(jù) /// </summary> public static void RemoveFormsAuthCookie() { FormsAuthentication.SignOut(); } }
第五步:測(cè)試執(zhí)行
1. 啟動(dòng)網(wǎng)站輸入相應(yīng)的網(wǎng)址:如下圖
2. 此時(shí)用戶尚未登入將會(huì)跳轉(zhuǎn)到登入界面:如下圖
3.輸入錯(cuò)誤的密碼會(huì)重新跳轉(zhuǎn)到登入界面并提示出錯(cuò)
4. 輸入正確的用戶名密碼
5.點(diǎn)擊用戶退出會(huì)刪除掉cookie所以又會(huì)跳轉(zhuǎn)到登入界面。
源碼下載地址。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- .net core利用orm如何操作mysql數(shù)據(jù)庫(kù)詳解
- .net MVC使用IPrincipal進(jìn)行Form登錄即權(quán)限驗(yàn)證(3)
- ASP.NET MVC下Ajax.BeginForm方式無(wú)刷新提交表單實(shí)例
- .net WINFORM的GDI雙緩沖的實(shí)現(xiàn)方法
- Asp.net webForm設(shè)置允許表單提交Html的方法
- asp.net mvc中Forms身份驗(yàn)證身份驗(yàn)證流程
- asp.net core標(biāo)簽助手的高級(jí)用法TagHelper+Form
- 深入理解Asp.Net中WebForm的生命周期
- .net MVC中使用forms驗(yàn)證詳解
- .NET Orm性能測(cè)試分析
相關(guān)文章
在ASP.net中保存/取出圖片入/從SQL數(shù)據(jù)庫(kù)
在ASP.net中保存/取出圖片入/從SQL數(shù)據(jù)庫(kù)...2006-09-09.NET使用DinkToPdf將HTML轉(zhuǎn)成PDF的示例代碼
這篇文章主要介紹了.NET使用DinkToPdf將HTML轉(zhuǎn)成PDF的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02.NET發(fā)起web請(qǐng)求時(shí)維持Session
一般使用.NET C#發(fā)起一個(gè)web請(qǐng)求是用WebClient類,應(yīng)為使用很簡(jiǎn)單,但是每調(diào)用一次OpenRead就會(huì)在服務(wù)器啟用一個(gè)新Session,使用HttpWebRequest + CookieContainer就可以讓多個(gè)web請(qǐng)求只有一個(gè)session。2009-05-05通過(guò)RadioButton對(duì)DataList控件進(jìn)行單選實(shí)例說(shuō)明
本例實(shí)現(xiàn)通過(guò)RadioButton對(duì)DataList控件進(jìn)行單選,aspx拉一個(gè)DataList控件,把RadioButton置于DataList的ItemTemplate模版內(nèi);在.aspx.cs內(nèi)為DataList控件綁定數(shù)據(jù),很實(shí)用的功能,感興趣的朋友可以了解下啊2013-01-01解析WPF綁定層次結(jié)構(gòu)數(shù)據(jù)的應(yīng)用詳解
本文講述WPF中單層次數(shù)據(jù)和多層次數(shù)據(jù)的綁定方法,主要闡述數(shù)據(jù)綁定的顯示層面,其中涉及了ListBox和Treeview控件。并說(shuō)明它們之間的差異2013-05-05