猿教程 Logo

Asp.Net Core-登录和登出

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效:去购买

在本章中,我们将讨论登录和注销功能。 与登录相比,注销相当简单。 让我们继续使用布局视图,因为我们想要构建一个具有一些链接的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视图上下文中可以获得构建此UI所需的所有信息。

  • 首先,让我们在布局视图中添加命名空间System.Security.Claims。

@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>
  • 每个Razor视图中都有一个User属性,我们希望构建一个UI,以显示登录用户的名称。扩展方法IsSignedIn也可以在这里。

  • 我们可以调用这个方法,如果它返回true,这是我们可以放置一些标记来显示用户名,显示一个注销按钮。

  • 现在如果用户已经登录,我们可以使用帮助方法GetUserName显示用户的用户名。

  • 我们必须在表单中构建一个注销按钮,并将其发布到Web服务器。这必须做,因为它会创建某些不好的条件,如果你允许一个简单的GET REQUEST允许用户出去。

  • 我们将假设这是一个帖子,当用户提交此表单时,我们需要做的是打开Logout操作,我们将通过AccountController实现,并注销用户。

  • 如果用户没有登录,并且我们有一个匿名用户,那么我们需要显示一个链接,它将转到AccountController,特别是Login操作,它可以显示文本Login。

  • 我们还需要为新用户添加一个链接进行注册,并直接进入注册页面。

现在让我们转到AccountController,并在下面的程序中实现注销操作。

[HttpPost] 
public async Task<IActionResult> Logout() { 
   await _signManager.SignOutAsync(); 
   return RedirectToAction("Index", "Home"); 
}
  • 此操作只响应HttpPost。 这是一个异步操作。 我们将必须在Identity框架上调用另一个异步方法。

  • 我们可以返回一个IActionResult的任务,该操作命名为Logout。

  • 所有我们需要做的注销是等待SignInManager的SignOutAsyncmethod。

  • 用户上下文现在已经改变; 我们现在有一个匿名用户。 视图将重定向到主页,我们将返回到员工列表。

现在让我们继续并构建我们的登录功能。 在这里,我们需要两个Actioin,一个响应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; } 
}
  • 当用户登录时,他们必须提供一些信息,如用户名,密码。

  • 第三条信息必须是登录UI。 这些都带有一个小小的复选框,说 - “你想要记住我”。 这是我们想要一个会话cookie之间的选择,或者我们想要一个更永久的cookie。

  • 要允许此功能,我们添加了一个布尔属性RememberMe,我们使用了一个Display注释。 现在当我们创建一个标签时,文本记住我会显示一个空格。

  • 我们其实是想为这个视图模型的一部分,最后的信息是有将存储RETURNURL属性。

让我们现在添加将响应Get请求的Login操作,如下面的程序所示。

[HttpGet] 
public IActionResult Login(string returnUrl = "") { 
   var model = new LoginViewModel { ReturnUrl = returnUrl }; 
   return View(model); 
}
  • 我们将returnUrl作为查询字符串中的参数。

  • returnUrl可能不总是存在。 让我们有一个空字符串作为默认值。

我们现在将有一个新的视图,通过在Views → Account文件夹中添加一个新的MVC视图页。


在中间窗格中,选择MVC视图页并取名为Login.cshtml,然后单击添加按钮。 让我们在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>
  • 在这个登录视图中,我们将页面的标题设置为Login,然后我们有一个表单,将发布到AccountLogin操作。

  • 我们需要使用标记助手asp-route-returnurl来确保表单发回的URL中的ReturnUrl存在。

  • 我们需要将ReturnUrl发送回服务器,以便如果用户成功登录,我们可以将其发送到他们试图访问的地方。

  • 你在asp-route-,id或returnurl之后添加的任何内容,无论你在那里有什么,它将进入请求的某个地方,不管是进入URL路径还是作为查询字符串参数。

  • 我们有我们的ValidationSummary和输入用户名,密码和RememberMe,然后我们有一个提交按钮。

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,现在我们期望收到一个LoginViewModel。

  • 我们需要检查ModelState是否有效。 如果它是有效的,然后通过调用SignInManager上的API来登录用户。

  • PasswordSignInAsync方法将返回一个结果,如果结果成功,我们知道用户已成功登录。

  • 我们还有一个返回URL。 如果它是有效的本地网址,我们将被重定向到返回网址。

  • 如果用户刚刚登录,没有任何特定的地方,我们将重定向用户到HomeController的Index操作。

  • 我们可能遇到用户提供无效密码或无效用户名的情况。 我们还需要添加一个异常模型,提示是否存在无效的登录尝试。 这有助于用户知道是否发生了错误。

让我们现在保存所有内容并运行应用程序。


我们现在有登录和注册链接。 让我们点击登录链接。


让我们使用我们在上一章中创建的用户登录,指定用户名和密码,然后选中记住我复选框。

当您单击登录按钮时,浏览器将询问您是否要保存localhost的密码。 让我们点击Yes按钮。


现在,让我们通过点击注销按钮注销。


作为匿名用户,让我们去尝试编辑员工详细信息。


您现在可以看到,我们已被重定向到登录视图。

让我们用您的用户名和密码登录,并选中记住我复选框。


现在,单击登录按钮。


您现在可以看到我们被定向到我们要编辑的网址。 这是因为我们正确处理了返回Url。

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效: 去购买


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/ASPNET-CORE/core-login-logout.html