在本章中,无涯教程将讨论登录和注销功能,与登录相比,注销非常容易实现,继续进行"Layout"视图,因为要构建具有某些链接的UI,这将允许已登录的用户注销并显示用户名。
<!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>
对于匿名用户,将显示一个登录链接。
您可以从Razor视图Context中获得构建此UI所需的所有信息。
首先,在布局视图中添加名称空间 System.Security.Claims 。
链接:https://www.learnfk.comhttps://www.learnfk.com/asp.net_core/asp.net-core-log-in-and-log-out.html
来源:LearnFk无涯教程网
@using System.Security.Claims <!DOCTYPE html> <html> <head> <meta name = "viewport" content = "width=device-width" /> <title>@ViewBag.Title</title> </head> <body> <div> @if (User.IsSignedIn()) { <div>@User.GetUserName()</div> <form method = "post" asp-controller = "Account" aspcontroller = "Logout"> <input type = "submit" value = "Logout"/> </form> } else { <a asp-controller = "Account" asp-action = "Login">Login</a> <a asp-controller = "Account" asp-action = "Register">Register</a> } </div> <div> @DateTime.Now </div> <div> @RenderBody() </div> </body> </html>
现在,转到AccountController并首先执行注销操作,如以下程序所示。
[HttpPost] public async Task<IActionResult> Logout() { await _signManager.SignOutAsync(); return RedirectToAction("Index", "Home"); }
现在继续并构建登录功能,在这里,将需要一对动作,一个动作响应一个HttpGet请求并显示可用于登录的表单,另一个动作响应一个HttpPost请求。
首先,将需要一个新的ViewModel来提取登录数据,因为登录与注册非常不同,因此,添加一个新类,并将其命名为 LoginViewModel 。
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; } }
现在让添加登录操作,该操作将响应"Get"请求,如以下程序所示。
[HttpGet] public IActionResult Login(string returnUrl = "") { var model = new LoginViewModel { ReturnUrl = returnUrl }; return View(model); }
将 returnUrl 作为查询字符串中的参数。
returnUrl 可能并不总是存在。将一个空字符串作为默认值。
现在,通过在View→Account文件夹中添加新的MVC视图页面,将拥有一个新视图。
在中间窗格中,选择" MVC视图页"并将其命名为Login.cshtml,然后单击"Add"按钮。让无涯教程在Login.cshtml文件中添加以下代码。
@model LoginViewModel @{ ViewBag.Title = "Login"; } <h2>Login</h2> <form method = "post" asp-controller = "Account" asp-action = "Login" asp-route-returnurl = "@Model.ReturnUrl"> <div asp-validation-summary = "ValidationSummary.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 = "Login" /> </form>
AccountController ,并实施Post操作,此操作响应HttpPost,这将是一个Async方法,因为将需要调用Identity框架并返回一个任务或IActionResult。
[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"); } } } ModelState.AddModelError("","Invalid login attempt"); return View(model); }
现在保存所有内容并运行该应用程序。
现在,具有登录和注册链接。单击"Login"链接。
通过指定用户名和密码登录到上一章节中创建的用户,然后选中记住复选框。
当您单击"Login"按钮时,浏览器将询问您是否要保存本地主机的密码,单击"OK"按钮。
现在,通过单击注销按钮注销。
作为匿名用户,开始尝试编辑员工详细信息。
现在您可以看到已重定向到登录视图。使用您的用户名和密码登录,然后选中"Remember Me"复选框。
现在,单击"Login"按钮。
现在您可以看到已定向到要编辑的URL。这是因为无涯教程适当地处理了返回URL。
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)
Spring Cloud 微服务项目实战 -〔姚秋辰(姚半仙)〕