📜  ASP.NET Core-登录和注销

📅  最后修改于: 2020-11-21 05:07:09             🧑  作者: Mango


在本章中,我们将讨论登录和注销功能。与登录相比,注销非常容易实现。让我们继续进行“布局”视图,因为我们要构建具有某些链接的UI。这将允许已登录的用户注销并显示用户名。

 
       @ViewBag.Title 
    

    
      
@DateTime.Now
@RenderBody()
  • 对于匿名用户,我们将显示一个登录链接。

  • Razor视图上下文中提供了构建此UI所需的所有信息。

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

@using System.Security.Claims 
  
 
   
    
       
      @ViewBag.Title 
    

   
      
@if (User.IsSignedIn()) {
@User.GetUserName()
} else { Login Register }
@DateTime.Now
@RenderBody()
  • 每个Razor视图中都有一个User属性,我们要构建一个UI,该UI将显示已登录用户的名称。扩展方法IsSignedIn也在此处可用。

  • 我们可以调用此方法,如果它返回true,则可以在此处放置一些标记以显示用户名,并显示注销按钮。

  • 现在,如果用户已登录,则可以使用助手方法GetUserName显示用户的用户名。

  • 我们将必须在表单内构建一个注销按钮,该按钮将发布到Web服务器。如果您允许简单的GET REQUEST来允许用户离开,则必须这样做,因为它将创建某些不利条件。

  • 我们将其强制为帖子,并且当用户提交此表单时,我们所需要做的就是单击“注销”操作,该操作将通过AccountController实现,然后注销用户。

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

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

现在让我们转到AccountController并首先执行注销操作,如以下程序所示。

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

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

  • 我们需要注销的所有操作就是等待SignInManager的SignOutAsync方法。

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

现在让我们继续并构建我们的登录功能。在这里,我们将需要一对动作,一个动作响应一个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批注。现在,当我们构建标签时,文本“记住我”将显示一个空格。

  • 我们实际上希望作为此ViewModel的一部分的最后一个信息是具有将存储ReturnUrl的属性。

现在让我们添加登录操作,该操作将响应Get请求,如以下程序所示。

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

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

现在,通过在“视图”→“帐户”文件夹中添加新的MVC视图页面,我们将拥有一个新视图。

登录注销添加新项目

在中间窗格中,选择“ MVC视图页”并将其命名为Login.cshtml,然后单击“添加”按钮。让我们在Login.cshtml文件中添加以下代码。

@model LoginViewModel 
@{ 
   ViewBag.Title = "Login"; 
}  

Login

  • 在此登录视图中,我们将页面的标题设置为Login,然后有一个表单将发布到AccountLogin操作。

  • 我们需要使用标签助手asp-route-returnurl ,以确保ReturnUrl在表单发布回的URL中。

  • 我们需要将该ReturnUrl发送回服务器,以便如果用户成功登录,我们可以将其发送到他们尝试到达的位置。

  • 您在asp-route-,id或returnurl之后添加的任何内容(无论您拥有的是什么)都会进入请求的某个位置,无论是进入URL路径还是作为查询字符串参数。

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

`AccountController ,并执行Post操作。此操作响应HttpPost。这将是一个Async方法,因为我们将需要调用Identity框架并返回任务或IActionResult。

[HttpPost] 
public async Task 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); 
}
  • 我们称这个登录名,现在我们希望收到一个LoginViewModel。

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

  • PasswordSignInAsync方法将返回结果,如果结果成功,则表明用户已成功登录。

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

  • 如果用户刚刚登录并且没有特定的位置,我们将把用户重定向到HomeController的Index操作。

  • 我们可能处于用户提供无效密码或无效用户名的情况。我们还需要添加一个模型错误,以提示是否存在无效的登录尝试。这可以帮助用户了解是否出了问题。

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

登录注册

现在,我们有登录和注册链接。让我们单击“登录”链接。

登录注册链接

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

当您单击“登录”按钮时,浏览器将询问您是否要保存本地主机的密码。让我们单击“是”按钮。

登出

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

登出按钮

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

匿名用户

现在您可以看到我们已重定向到“登录”视图

让我们使用您的用户名和密码登录,然后选中“记住我”复选框。

检查记住我

现在,单击“登录”按钮。

登录按钮

现在,您可以看到我们已定向到要编辑的URL。这是因为我们适当地处理了返回URL。