惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
爱范儿
爱范儿
P
Proofpoint News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
J
Java Code Geeks
宝玉的分享
宝玉的分享
Jina AI
Jina AI
B
Blog
N
Netflix TechBlog - Medium
Recent Announcements
Recent Announcements
aimingoo的专栏
aimingoo的专栏
腾讯CDC
C
Check Point Blog
The Cloudflare Blog
阮一峰的网络日志
阮一峰的网络日志
博客园 - Franky
罗磊的独立博客
B
Blog RSS Feed
WordPress大学
WordPress大学
小众软件
小众软件
博客园 - 叶小钗
M
MIT News - Artificial intelligence
GbyAI
GbyAI

博客园 - 试试手气

Web Worker 入门 若依Ruoyi分离版替换 MyBatis-Plus 若依前端菜单管理中路由地址、组件路径、权限字符的使用 Idea clone 项目推送到自有仓库 Spring Boot —— Spring Security Spring Boot —— 集成文档工具 Spring Boot —— Filter 过滤器 Spring Boot —— Cors 跨域 Spring Boot —— 集成 Druid Spring Boot —— 集成 MyBatis-Plus Spring Boot —— 集成 Springdoc Navicat 使用笔记 Datagrip连接SQLServer失败 Asp.net mvc 笔记 Asp.net Core 笔记 mybatis 笔记 SQLServer 笔记 Asp.net Core 全局异常处理 SqlSugar 实践笔记
Asp.net Core 基于Cookie的身份认证
试试手气 · 2023-03-07 · via 博客园 - 试试手气

Asp.net Core 有一套完整、丰富的身份验证流程,如果可以,就用,不要自己再造轮子,你造的过微软吗
—— 我说的

先上登录代码

Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });
}

Startup.cs

using Microsoft.AspNetCore.Authentication.Cookies;
using Uap.Areas.Admin.Service;

namespace Uap;

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration;

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        // 将当前应用程序上下文放入MVC服务容器
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddScoped<IAdminService, AdminServiceImpl>();

        // 添加cookie身份认证
        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie(options =>
            {
                options.LoginPath = "/admin/login";
                options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
                options.AccessDeniedPath = "/navigator/forbidden";
            });
        // 配置 Cookie 策略
        services.Configure<CookiePolicyOptions>(options =>
        {
            // 默认用户同意非必要的 Cookie
            options.CheckConsentNeeded = context => true;
            // 定义 SameSite 策略,Cookies允许与顶级导航一起发送
            options.MinimumSameSitePolicy = SameSiteMode.Lax;
        });

        services.AddHttpContextAccessor();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseStaticFiles();

        app.UseHttpsRedirection();

        app.UseRouting();

        // 添加认证授权,需要在 UseAuthorization 之前
        app.UseAuthentication();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            //endpoints.MapControllers();
            endpoints.MapControllerRoute(
            name: "areas",
            pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
          );
        });
    }
}

Controller
可以自己实现 XxxController 如 AdminController

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;
using Uap.Areas.Admin.Models;
using Uap.Areas.Admin.Service;
        /// <summary>
        /// 登录方法
        /// </summary>
        /// <param name="username"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("dologin")]
        [AllowAnonymous]
        //[ValidateAntiForgeryToken]
        public async Task<IActionResult> doLogin([FromBody] AdminModel admin)
        {
            // 1. 校验账号,获取用户信息
            if (!ModelState.IsValid) { }
			// 自己实现的对账号密码进行校验的方法,非Framework方法,成功返回 true,否则返回 false
            var valid = this.AdminService.SignIn(admin);
            if (!valid)
            {
                return Unauthorized();
            }

            // 2. 创建用户声明信息
            var claims = new List<Claim>
            {
                new Claim(ClaimTypes.Name, admin.Username),
                new Claim(ClaimTypes.Role, "Administrator"),
            };

            // 3. 创建声明身份证
            var claimIdentity = new ClaimsIdentity(
                    claims, CookieAuthenticationDefaults.AuthenticationScheme);

            // 4. 创建证件持有者
            var principal = new ClaimsPrincipal(claimIdentity);

            // 5. 登录
			// HttpContext 下 SignInAsync 方法默认你找不到
			// 需要引入 using Microsoft.AspNetCore.Authentication;
            await HttpContext.SignInAsync(principal);

            return Ok();
        }

[Authorize]特性
在控制器、方法添加该注解,就可以达到不登录就不能访问的目的

[AllowAnonymous]特性
在方法上添加该注解,允许匿名,至少登录页、登录接口你得让匿名访问

最终效果:

  • 登录成功,向前台返回 OK,前台处理,也可以在后台直接 Redirect(url) 重定向到目标地址
  • 在登录成功前,如果访问 [Authorize] 控制范围内的接口,将自动跳转到 options.LoginPath 所指定的页面,地址栏自动带有登录成功后需要跳转的来源地址,无需自己实现
    image

感谢简洁又有效的好贴
在 ASP.NET Core 应用中使用 Cookie 进行身份认证
ASP.NET CORE中使用Cookie身份认证