课程简介目录
🚀前言
本文是《.Net Core从零学习搭建权限管理系统》教程专栏的课程(点击链接,跳转到专栏主页,欢迎订阅,持续更新…)
专栏介绍:以实战为线索,基于.Net 7 + REST + Vue、前后端分离,不依赖任何第三方框架,从零一步一步讲解权限管理系统搭建。
专栏适用于人群:Web后端开发人员
一、.Net Core 身份验证简介
身份验证在MSDN叫做Authorization,其目的就是验证Http请求,只有验证通过,才能访问特定的资源。
在Asp.Net Core提供非常多的Authorization方式。
在MSDN官方文档,我们也可以看到有以下的验证方式【截图是Asp.Net Core 7.0,各个版本有差异】:
今天我们重点来,讲解Cookies验证,这是我们比较经常用到的方式之一。
二、开启Cookie身份验证
说明:此课程示例代码,建立在课程2基础上。源代码:《课程2:认识Identiy》
在项目入口文件:Program.cs,添加Cookie身份验证。
Program.cs 最终代码如下:
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Authentication.Cookies;
using WebAPI;
using Microsoft.Extensions.Options;
var builder = WebApplication.CreateBuilder(args);
//数据库链接字符串
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
//数据库上下文注入、使用SqlServer
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
//Identity注入,添加数据库上下文
builder.Services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddControllers();
//添加Authentication服务:Cookie验证
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme);
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseHttpsRedirection();
//添加authentication中间件
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
三、添加登录接口
3.1 添加登录Dto
首先,先添加一个用来接受参数的Dto:LoginUserDto,登录接口需要用户名与密码,并且必填。
using System.ComponentModel.DataAnnotations;
namespace WebAPI.Dtos
{
public class LoginUserDto
{
/// <summary>
/// 登录账号
/// </summary>
[Required]
public string UserName { get; set; }
/// <summary>
/// 登录密码
/// </summary>
[Required]
public string Password { get; set; }
}
}
3.2 添加登录接口Login
添加Api控制器:AuthController,专门用来做登录验证的。
并添加一个接口:Login,并通过PasswordSignInAsync,验证用户名与密码。
声明:HttpPost(“login”),定义为Post请求并且路由为:api/auth/login。
SignInManager:为Identity提供的登录API。
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using WebAPI.Dtos;
namespace WebAPI.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class AuthController : ControllerBase
{
private readonly SignInManager<IdentityUser> _signInManager;
public AuthController(SignInManager<IdentityUser> signInManager)
{
_signInManager = signInManager;
}
/// <summary>
/// 登录
/// </summary>
/// <param name="loginUserDto"></param>
/// <returns></returns>
[HttpPost("login")]
public async Task<IActionResult> Login([FromBody]LoginUserDto loginUserDto)
{
var result = await _signInManager.PasswordSignInAsync(loginUserDto.UserName, loginUserDto.Password, true, false);
if (result.Succeeded)
{
return Ok("登录成功");
}
else
{
return Ok("登录失败");
}
}
}
}
3.3 获取用户信息接口,添加身份验证
在控制器:UserController,接口:Get,添加:[Authorize],用于身份验证。
代码如下:
/// <summary>
/// 根据用户昵称,获取用户信息
/// </summary>
/// <param name="userName"></param>
/// <returns></returns>
[HttpGet("{userName}")]
[Authorize]
public async Task<IActionResult> Get(string userName)
{
var result = await _userManager.FindByNameAsync(userName);
return Ok(result);
}
最终项目目录结构:
四、获取用户信息接口测试
4.1 测试获取用户信息接口
运行项目,并使用API调试工具测试。我这边使用的是浏览器插件:Talend API Tester,大家可以使用其他工具,比如PostMan等。
输入的参数:
1、METHOD:GET
2、URL:https://localhost:7015/api/user/test@api.com;端口记得改为自己的,test@api.com:这个是我们上面添加的用户账号。
执行结果:返回302,代表执行失败,因为未登录,系统默认重定向:https://localhost:7015/Account/Login?ReturnUrl=%2Fapi%2Fuser%2Ftest@api.com,这个是系统默认的。
4.2 登录
在API调试工具,测试登录接口。
输入的参数:
1、METHOD:POST
2、URL:https://localhost:7015/api/auth/login;端口记得改为自己的。
3、Content-Type:application/json
4、Body:
{
"userName":"test@api.com",
"password":"Abc1213@"
}
执行结果:返回200,代表执行成功。并且从返回报文可以看到:有返回Cookie。
4.3 再次测试:获取用户信息接口
输入的参数:
1、METHOD:GET
2、URL:https://localhost:7015/api/user/test@api.com;端口记得改为自己的,test@api.com:这个是我们上面添加的用户账号。
执行结果:返回200,代表执行成功,并返回用户信息。
4.4 其他浏览器测试:获取用户信息接口
上面的测试步骤,是在同一个浏览器测试的,所以我们可以直接测试:获取用户信息接口。
如果是在其他浏览器,或者其他电脑,我们可以拷贝步骤: 3.4.2 ,返回的Cookie,用于身份验证。
输入的参数:
1、METHOD:GET
2、URL:https://localhost:7015/api/user/test@api.com;端口记得改为自己的,test@api.com:这个是我们上面添加的用户账号。
3、HEADER添加Cookies:Cookie的值对应为登录接口返回的Cookie。【见3.4.2】
执行结果:返回200,代表执行成功,并返回用户信息。
五、最后
Cookie身份验证就介绍到这边啦!
下一课程,介绍JWT身份验证,敬请关注!
文章会持续更新,大家有想要了解的功能点或者话题,可以在评论区告诉我!
喜欢本专栏的文章,可以点赞、订阅支持一下,你的肯定是对我最大的支持!
也可以收藏本文章,收藏后可以快速查看本专栏后续更新的一系列文章!