日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程

發布時間:2025/3/15 asp.net 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ASP.NET Core 登錄登出 - ASP.NET Core 基礎教程 - 簡單教程,簡單編程

原文:ASP.NET Core 登錄登出 - ASP.NET Core 基礎教程 - 簡單教程,簡單編程

ASP.NET Core 登錄登出

上一章節我們總算完善了注冊的功能,而且也添加了一個用戶,現在,我們是時候繼續完善登錄登出功能了。

本章節應該是我們這個序列的最后一章節,因為本章節接收,我們大概的基礎的 ASP.NET Core 知識都講解了一遍。雖然很膚淺,但總算日常使用的知識點都有所涉及

本章節,我們將學習登錄和注銷功能。 與登錄相比,注銷相當簡單。

我們首先重新布局下視圖,在首頁中去掉登錄和注冊鏈接,而改成在 _Layout.cshtml 布局視圖中添加這些鏈接,如果用戶已經登錄,則隱藏登錄和注冊,而顯示用戶名和注銷按鈕

我們首先來看看之前的 _Layout.cshtml 模板的內容

<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>@ViewBag.Title</title> </head> <body> <div>@DateTime.Now</div> <div> @RenderBody() </div> </body> </html>

刪除 @DateTime.Now 然后改成如下內容

@using System.Security.Claims <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width" /> <title>@ViewBag.Title</title> <style> body { margin: 10px auto; text-align: center } table { margin: 0 auto; width: 90% } table, th, td { border: 1px solid #eee; border-collapse: collapse; border-spacing: 0; padding: 5px; text-align: center } .txt-left { text-align: left; } </style> </head> <body> <div> @if ( User.Identity.IsAuthenticated ) { <div>@User.Identity.Name</div> <form method="post" asp-controller="Account" asp-action="Logout"> <input type="submit" value="登出" /> </form> } else { <a asp-controller="Account" asp-action="Login">登錄</a> <a asp-controller="Account" asp-action="Signup">注冊</a> } </div> <div>@RenderBody()</div> </body> </html>

上面這段代碼,又多了很多新面孔

  • 為了判斷用戶是否已經登錄,我們必須使用 User.Identity.IsAuthenticated 來判斷,如果返回 true 則說明已經登錄,否則表示未登錄

  • 為了顯示當前登錄的用戶名,我們使用了 User.Identity.Name 表達式

  • 為了在當前視圖中使用 User 對象,我們必須引入命名空間 System.Security.Claims

  • 同時,我們也把 Index.cshtml 中的樣式移到了當前視圖

  • 接著修改 Index.cshtml ,去掉注冊鏈接,去掉樣式,修改完成后代碼顯示如下

    @model HomePageViewModel @{ViewBag.Title = "職工列表"; } <h1>職工列表</h1> <table> <tr> <td>ID</td> <td>姓名</td> <td class="txt-left">操作</td> </tr> @foreach (var employee in Model.Employees) { <tr> <td>@employee.ID</td> <td>@employee.Name</td> <td class="txt-left"><a asp-action="Detail" asp-route-Id="@employee.ID">詳情</a> &nbsp; <a asp-controller="Home" asp-action="Edit" asp-route-id="@employee.ID">編輯</a></td> </tr> } </table> <br/> <p><a asp-action="Create" >新增員工</a></p>

    保存所有代碼,刷新瀏覽器,訪問首頁,顯示如下

    因為之前注冊的時候我們已經登錄過了,所以這時候就會顯示登錄狀態

    注銷功能

    如果點擊 登出 則會報錯,原因是我們還沒實現該功能呢

    修改 AccountController 類添加動作方法 Logout

    [HttpPost] public async Task<IActionResult> Logout() { await _signManager.SignOutAsync(); return RedirectToAction("Index", "Home"); }

    這個注銷操作也是有很多的名堂可講了

  • 因為在 _Layout.cshtml 的登出操作使用的是 HTTP POST 方法。所以這里添加了 [HttpPost] 特性

  • 注銷操作需要與 Identity 框架進行交互,告訴 Identity 框架注銷當前用戶。這個操作通過調用 _signManager.SignOutAsync 方法來完成,因為這是一個異步方法,所以需要使用 await 來修飾等待

  • 因為使用了異步方法,所以整個方法也是異步的,那么返回結果也就需要是異步結果,使用 async Task<IActionResult> 來修飾

  • 當 Identity 注銷完成后,當前用戶就變成了匿名用戶,而匿名用戶能訪問的只有首頁,所以就跳回了首頁

  • 保存所有代碼,重啟應用程序,點擊 登出 顯示如下

    登錄功能

  • 登出成功后,我們可以繼續點擊 登錄 鏈接來登錄,因為還沒有實現該功能,所以會出現 404 錯誤

  • 從前面可知,登錄頁面的網址為 /Account/Login,為了實現登錄功能,我們需要添加一對動作方法 Login ,一個用于響應 HTTP GET 請求顯示登錄表單,另一個用戶響應 HTTP POST 請求完成登錄操作

    [HttpGet] public IActionResult Login() { return View(); }[HttpPost] public IActionResult Login() { return View(); }
  • 為了能夠記住顯示登錄之前的頁面,我們需要保存來路,這一點,ASP.NET Core MVC 早就已經想好了,只要給我們的方法添加上 returnUrl 即可

    [HttpGet] public IActionResult Login(string returnUrl = "" ) { return View(); }[HttpPost] public IActionResult Login(string returnUrl = "") { return View(); }
  • 因為注冊的時候只輸入了用戶名和密碼,所以登錄的時候也就只有用戶名和密碼了,所以我們需要創建一個模型,用來接收登錄提交的用戶數據

    public class LoginViewModel { public string Username { get; set; }[DataType(DataType.Password)] public string Password { get; set; }[Display(Name ="Remember Me")] public bool RememberMe { get; set; } public string ReturnUrl { get; set; }}

    與 RegisterViewModel 不同的是,少了 ConfirmPassword 而多了一個 RememberMe 和 ReturnUrl 用戶保存是否記住密碼選項和登錄來路

    其實這里有多了一個新的特性,就是 Display ,這個特性用于填充登錄表單的 <label> 的名字

  • 接下來我們就可以修改顯示表單的 Login 方法將 LoginViewModel 實例傳給視圖

    [HttpGet] public IActionResult Login(string returnUrl = "") { var model = new LoginViewModel { ReturnUrl = returnUrl }; return View(model); }
  • 然后在 Views/Account 目錄下新建一個 Login.cshtml 登錄表單視圖,內容如下

    @model LoginViewModel @{ ViewBag.Title = "Login"; } <h2>登錄</h2><form method="post" asp-controller="Account" asp-action="Login" asp-route-returnurl = "@Model.ReturnUrl"> <div asp-validation-summary="ModelOnly"></div> <div> <label asp-for="Username"></label> <input asp-for="Username" /> <span asp-validation-for="Username"></span> </div> <div> <label asp-for="Password"></label> <input asp-for="Password" /> <span asp-validation-for="Password"></span> </div> <div> <label asp-for="RememberMe"></label> <input asp-for="RememberMe" /> <span asp-validation-for="RememberMe"></span> </div> <input type = "submit" value="登錄" /> </form>

    代碼很普通,很多知識我們之前已經接觸過了,不過唯一的不同的就是 asp-route-returnurl = "@Model.ReturnUrl"

    asp-route-returnurl 屬性會把當前值附在提交的 URL 后面,鍵名為 returnurl,值為指定的值

  • 接下來我們實現登錄動作,因為 LoginViewModel 已經包含了 ReturnUrl ,所以我們可以把 returnurl 參數刪掉

    [HttpPost] public async Task<IActionResult> Login(LoginViewModel model) { if (ModelState.IsValid) { var result = await _signManager.PasswordSignInAsync(model.Username,model.Password, model.RememberMe,false);if (result.Succeeded) { if (!string.IsNullOrEmpty(model.ReturnUrl) && Url.IsLocalUrl(model.ReturnUrl)) {return Redirect(model.ReturnUrl);} else { return RedirectToAction("Index", "Home"); } } }if ( string.IsNullOrEmpty(model.ReturnUrl) ){model.ReturnUrl = "";}ModelState.AddModelError("","Invalid login attempt"); return View(model); }
  • 因為 LoginViewModel 已經包含了 ReturnUrl ,所以我們可以把 returnurl 參數刪掉

  • 檢查 ModelState 是否有效。如果它有效,則通過調用 SignInManager 上的 PasswordSignInAsync 來登錄用戶

    該方法接受四個參數,前三個分別為用戶名、密碼、和是否記住我三個參數

  • 如果驗證成功且成功登錄,則重定向到 returnurl

  • 如果失敗,則顯示失敗信息給用戶

  • 修改完成后,AccountController.cs 的完整代碼如下

    using System; using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks; using Microsoft.AspNetCore.Identity; using System.ComponentModel.DataAnnotations; using HelloWorld.Models; namespace HelloWorld.Controllers { public class AccountController : Controller { private SignInManager<User> _signManager; private UserManager<User> _userManager; public AccountController(UserManager<User> userManager, SignInManager<User> signManager) { _userManager = userManager; _signManager = signManager; } [HttpGet] public ViewResult Signup() { return View(); } [HttpPost] public async Task<IActionResult> Signup(RegisterViewModel model) { if (ModelState.IsValid) { var user = new User { UserName = model.Username }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { await _signManager.SignInAsync(user, false); return RedirectToAction("Index", "Home"); } else { foreach (var error in result.Errors) { ModelState.AddModelError("", error.Description); } } } return View(); } [HttpPost] public async Task<IActionResult> Logout() { await _signManager.SignOutAsync(); return RedirectToAction("Index", "Home"); } [HttpGet] public IActionResult Login(string returnUrl = "") { var model = new LoginViewModel { ReturnUrl = returnUrl }; return View(model); } [HttpPost] public async Task<IActionResult> Login(LoginViewModel model) { if (ModelState.IsValid) {

    轉載于:https://www.cnblogs.com/lonelyxmas/p/9724425.html

    總結

    以上是生活随笔為你收集整理的ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。