课程3:ASP.NET Core 身份验证 - Cookie

🚀前言

本文是《.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身份验证,敬请关注!

文章会持续更新,大家有想要了解的功能点或者话题,可以在评论区告诉我!

喜欢本专栏的文章,可以点赞、订阅支持一下,你的肯定是对我最大的支持!

也可以收藏本文章,收藏后可以快速查看本专栏后续更新的一系列文章!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程乐趣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值