本文仅仅是能够告诉读者怎么用,什么效果,不包含原理讲解。
在java学习中,登录往往是通过cookie,session,过滤器这样的模式完成的,.net core中登录模块完成了非常好的封装,来提供登录校验的这种能力,但是封装太好往往会看不懂,做不出来,本篇文章不讨论内部细节,以一个项目的模式来看看在Visual Studio中如何去使用这个写好的框架。
打开visual studio开始项目的构建
然后选择.net core web
这里我们先不生成登录模块,自己尝试的时候没有界面,不太好理解,我们进去了再用。
一个非常普通的web项目。
装点包
把这些包装上
接下来我们来生成验证模板
如果刚才的包装的没问题的话会有一个identity这个就是验证模板
然后到达了这个界面,让我们生成对应的文件,
登录模块我们往往都放在导航栏上,所以_layout上添加登录时vs默认的模板,我们就选择项目生成的模板就可以了。
这里是在问我们要什么功能,我们一开始就要个登录,退出,注册就可以了。
这里是数据库信息,因为用户信息要存在数据库中,所以我们要一个DbContext对象
点加号来一个就行。
ok,点击add就成了。之后会卡一会儿给你生成文件。
我们生成了一个文件夹,包括了登录要的这些东西,accout下就是我们的界面。
这个时候可以启动看一下。
发现什么都没有。
去文件里面看一下。打开_LoginPartial.cshtml文件。
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
<li class="nav-item">
<a id="manage" class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">Hello @UserManager.GetUserName(User)!</a>
</li>
<li class="nav-item">
<form id="logoutForm" class="form-inline" asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Action("Index", "Home", new { area = "" })">
<button id="logout" type="submit" class="nav-link btn btn-link text-dark">Logout</button>
</form>
</li>
}
else
{
<li class="nav-item">
<a class="nav-link text-dark" id="register" asp-area="Identity" asp-page="/Account/Register">Register</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" id="login" asp-area="Identity" asp-page="/Account/Login">Login</a>
</li>
}
</ul>
发现了有a标签。那么我们自然要把这个东西放到导航栏_layout.cshtml中。下面我们在_layout文件中引入_loginPartial.
再次启动看看
有了,但是没效果。通过查看url发现路由肯定有问题。那么我们打开Startup.cs文件改改路由。
再次跑起来就有效果了。
页面上的问题解决了。该解决数据的问题了。
这个就是刚才生成好的DbContext对象,它里面就包括了验证所需要的表信息。
这个也是生成的,就写了要在哪里去生成表。
就是first code的那一套
实体和表的关系就生成好了。直接生成库吧。
在vs的数据库界面看看,发现生成了一大堆表。
这就好了。
我们在startup中改个点。
一定要用UseAuthentication(),不然登录不了。
然后我们打开HomeController在Index方法上加 [Authorize]
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using LoginTest.Models;
using Microsoft.AspNetCore.Authorization;
namespace LoginTest.Controllers
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
[Authorize]
public IActionResult Index()
{
return View();
}
public IActionResult Privacy()
{
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
}
这就是说明要验证,只有在登录状况下才能访问,不然重定向到登录界面。
代码就完成了,我们试一下看看什么效果。
一进来我们点击导航栏的home发现是去登录界面了。
注册一个一登录(记得在数据库的AspNetUsers表中吧EmailConfirmed的状态改一下不然会被校验卡住)
登录了再点击home就ok了