ASP.NET Core 中使用 Cookie 身份验证

news/2025/2/4 14:34:16/文章来源:https://www.cnblogs.com/51net/p/18698200

在 ASP.NET Core 中使用 Cookie 身份验证,通常是为了实现用户的登录和授权。以下是配置 Cookie 身份验证的步骤。

1. 安装必要的 NuGet 包

首先,确保项目中包含 Microsoft.AspNetCore.Authentication.Cookies 包。你可以通过 NuGet 包管理器或命令行安装它:

dotnet add package Microsoft.AspNetCore.Authentication.Cookies

2. 配置 Cookie 身份验证

在 ASP.NET Core 6 或更高版本中,配置通常发生在 Program.cs 中。以下是一个典型的配置过程:

在 Program.cs 中配置 Cookie 身份验证

using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var builder = WebApplication.CreateBuilder(args);

// 添加身份验证服务
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        // 设置登录页面路由
        options.LoginPath = "/Account/Login"; // 登录路径
        options.LogoutPath = "/Account/Logout"; // 登出路径
        options.AccessDeniedPath = "/Account/AccessDenied"; // 访问被拒绝路径

        // 设置 Cookie 的过期时间
        options.SlidingExpiration = true; // 启用滑动过期
        options.ExpireTimeSpan = TimeSpan.FromMinutes(30); // 设置过期时间

        // 可选的其他设置
        // options.Cookie.Name = "YourAppAuthCookie"; // 自定义 Cookie 名称
      // options.Cookie.HttpOnly = true; // 禁止 JavaScript 访问 Cookie
    // options.Cookie.SecurePolicy = CookieSecurePolicy.Always; // 强制 HTTPS 使用 Cookie
    });

builder.Services.AddAuthorization(); // 添加授权服务

builder.Services.AddControllersWithViews(); // 添加 MVC 或 Razor Pages 支持

var app = builder.Build();

// 使用身份验证中间件
app.UseAuthentication(); // 必须在 UseAuthorization 之前

// 使用授权中间件
app.UseAuthorization();

app.MapDefaultControllerRoute(); // 设置默认路由

app.Run();

3. 实现登录逻辑

你需要创建一个控制器来处理登录逻辑,并设置用户的身份验证 cookie。

登录控制器

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;
using System.Threading.Tasks;

publicclassAccountController : Controller
{
    // 登录页面
    [HttpGet]
    public IActionResult Login()
    {
        return View();
    }

    // 处理登录请求
    [HttpPost]
    public async Task<IActionResult> Login(string username, string password)
    {
        // 这里进行用户名和密码的验证,假设验证成功
        if (username == "admin" && password == "password") // 示例验证逻辑
        {
            // 创建用户的身份信息
            var claims = new List<Claim>
            {
                new Claim(ClaimTypes.Name, username),
                new Claim(ClaimTypes.Role, "Admin") // 添加角色信息
            };

            var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
            var authProperties = new AuthenticationProperties
            {
                IsPersistent = true, // 设置为 true 则用户在浏览器关闭后仍然保持登录状态
            };

            // 执行身份验证并设置 Cookie
            await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, 
                new ClaimsPrincipal(claimsIdentity), authProperties);

            return RedirectToAction("Index", "Home"); // 登录成功后重定向到主页
        }

        ModelState.AddModelError(string.Empty, "Invalid login attempt.");
        return View();
    }

    // 登出逻辑
    [HttpPost]
    public async Task<IActionResult> Logout()
    {
        await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); // 清除身份验证信息
        return RedirectToAction("Login", "Account"); // 重定向到登录页面
    }
}

4. 创建登录页面视图

你还需要为登录页面创建一个简单的视图。例如,在 Views/Account/Login.cshtml 中:

@{
    ViewData["Title"] = "Login";
}

<h2>Login</h2>

<form method="post">
    <div>
        <label for="username">Username</label>
        <input type="text" id="username" name="username" required />
    </div>
    <div>
        <label for="password">Password</label>
        <input type="password" id="password" name="password" required />
    </div>
    <div>
        <button type="submit">Login</button>
    </div>
</form>

5. 授权和授权策略

为了限制某些页面只能被已登录用户访问,你可以在控制器或页面上使用 [Authorize] 特性。

示例:使用 [Authorize] 特性

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

[Authorize] // 确保只有已登录的用户能访问
public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

6. 登录后的页面保护

你可以通过 Authorize 特性来保护需要用户登录才能访问的页面或操作。未登录用户将被重定向到登录页面。

总结

  • 在 Program.cs 中配置 Cookie 身份验证。
  • 使用 SignInAsync 来设置用户的身份验证 Cookie。
  • 使用 SignOutAsync 处理用户登出。
  • 通过 [Authorize] 特性来保护需要授权的页面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/878546.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GDB调试(一)

GDB调试 GDB简介 GDB的功能 GDB(GNU Debugger)是用于调试 C、C++ 等语言的强大工具。它允许开发者执行以下操作:启动程序并按照预期条件暂停(如断点处)。 检查程序中的变量和内存状态。 单步执行代码,观察每一步的变化。 修改运行中的变量值以测试不同的假设。 调试程序崩…

Nginx 粘性会话配置与实现详解

**Nginx 粘性会话(Sticky Session)**是指将同一个客户端的请求始终路由到相同的后端服务器,确保该客户端的多个请求在同一个会话期间都由同一台服务器处理。粘性会话通常在负载均衡环境中使用,特别是当应用程序依赖于在同一会话中保持用户状态(例如购物车、登录会话等)时…

ASP.NET Core 中,操作过滤器(Action Filters)

在ASP.NET Core 中,操作过滤器(Action Filters)用于在控制器的操作方法执行之前或之后执行自定义逻辑。操作过滤器主要用于在请求到达控制器方法之前进行处理(例如:验证请求参数、设置数据)、在操作执行后处理响应(例如:记录日志、修改响应结果)等。 操作过滤器的工作…

ASP.NET Core 中间件(Middleware)

在ASP.NET Core 中,中间件是用来处理 HTTP 请求和响应管道的组件。中间件的核心思想是通过一个链式的管道处理请求和响应,每个中间件既可以处理请求或响应,也可以将其传递给下一个中间件。以下是详细解释:1. 中间件是什么? 中间件是一个软件组件,用于在 HTTP 请求到达应用…

elf2部署官方yolov5模型

ELF2开发板(飞凌嵌入式)搭建深度学习环境部署(RKNN环境部署)本人主要介绍用于elf2的rk3588开发板的深度学习环境的搭建,和官方的方法不同,对于新手比较友好。零基础即可搭建,本人使用的是WSL2系统,当然使用虚拟机也是可以的,本人主要教学搭建yolov5模型转换为rknn的环…

ASP.NET Core 中授权过滤器(Authorization Filters)

在ASP.NET Core 中,授权过滤器(Authorization Filters)是用于在请求到达控制器操作方法之前,验证用户是否具有执行该操作的权限的一种机制。授权过滤器的主要作用是确保用户在访问控制器或操作方法时,已通过身份验证并且有足够的权限。 授权过滤器的工作原理 授权过滤器在…

Roo Code插件搭配DeepSeek快速创建项目示例

一、环境准备 1. 安装VSCode 访问 Visual Studio Code官网 下载并安装最新版本 2. 安装IDEA(运行Java项目) 访问IDEA官网下载并安装最新Community社区版二、Roo Code插件配置 1. 安装插件打开VSCode扩展市场(Ctrl+Shift+X) 搜索 "Roo Code" 安装官方插件(确认发…

电子书查找阅读教程

免责声明本文仅作学习交流,对于喜欢的作者,建议支持正版。软件下载Github发布地址:https://github.com/gedoor/legado/releases 完整教学:https://www.yuque.com/legado/wiki/xz直接浏览器打开选择最新版本下载即可书源导入喵工资订阅源:https://dy.miaogongzi.cc/直接浏览…

性能测试会被AI替代吗?

最近,deepseek火了,不少测试小伙伴忧心忡忡,担心测试岗位被替代 我个人观点是:经验类测试技术短期内还是很难被替代的。大家也可以问问deepseek或者其它ai,我们来看下deepseek的观点: 附文字版:性能测试是否会被AI替代,取决于具体的测试场景、技术发展阶段以及人类与…

Java Stream 流

目录概述StreamOptional开始管道中间管道(中间操作)终止管道(终端操作)常用的 Stream 操作方法匹配(Match)查找(Find)遍历(ForEach)过滤(Filter)映射(Map)扁平映射(FlatMap)截断(Limit)跳过(Skip)排序(Sorted)去重(Distinct)汇总(Collect)归约(Redu…

R9000P能连接wifi但无法上网

问题描述:前一晚还正常使用,第二天打开就不能上网,可以连接WiFi,切换过不同WiFi都一样,排除WiFi原因,此时浏览器显示找不到DNS,估计就是dns解析出了问题 解决办法:先去CMD下,输入ipconfig /flushdns 再控制面板->网络和Internet->找到下图,点击WLAN点击属性,双…