首页 > 编程语言 >ASP.NET Core 中基于 Cookie 的身份鉴权实现步骤

ASP.NET Core 中基于 Cookie 的身份鉴权实现步骤

时间:2025-01-23 11:22:32浏览次数:1  
标签:Core ASP 登出 app 身份验证 Cookie new public

在 ASP.NET Core 应用中,基于 Cookie 的身份鉴权是一种常见的身份验证方式,特别适用于传统的 Web 应用程序。Cookie 能够在用户的浏览器中存储身份验证数据,从而在用户访问应用的不同页面时保持登录状态。

首先,在 Startup.csProgram.cs 文件中配置 Cookie 身份验证。这包括设置登录路径、登出路径、Cookie 的过期时间等参数。

Program.cs 文件中,配置 Cookie 身份验证:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.LoginPath = "/Account/Login";
        options.LogoutPath = "/Account/Logout";
        options.AccessDeniedPath = "/Account/AccessDenied";
        options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
        options.SlidingExpiration = true;
    });

builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

二、创建登录和登出逻辑

接下来,你需要创建处理登录和登出请求的控制器和视图。

创建 AccountController

创建一个 AccountController,用于处理登录和登出逻辑:

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

public class AccountController : Controller
{
    [HttpGet]
    public IActionResult Login(string returnUrl = "/")
    {
        ViewData["ReturnUrl"] = returnUrl;
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = "/")
    {
        if (ModelState.IsValid)
        {
            // 验证用户名和密码
            if (model.Username == "admin" && model.Password == "123456")
            {
                var claims = new List<Claim>
                {
                    new Claim(ClaimTypes.Name, model.Username),
                    new Claim(ClaimTypes.Role, "Admin")  // 可以根据需要添加角色
                };

                var claimsIdentity = new ClaimsIdentity(
                    claims, CookieAuthenticationDefaults.AuthenticationScheme);

                var authProperties = new AuthenticationProperties
                {
                    IsPersistent = model.RememberMe,
                    RedirectUri = returnUrl
                };

                await HttpContext.SignInAsync(
                    CookieAuthenticationDefaults.AuthenticationScheme,
                    new ClaimsPrincipal(claimsIdentity),
                    authProperties);

                return LocalRedirect(returnUrl);
            }
            else
            {
                ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            }
        }

        return View(model);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Logout()
    {
        await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
        return RedirectToAction("Index", "Home");
    }
}

创建 Login 视图

创建一个 Login.cshtml 视图,用于显示登录表单:

@model LoginViewModel

<h2>Login</h2>

<form asp-action="Login" asp-route-returnUrl="@ViewData["ReturnUrl"]" method="post">
    <div asp-validation-summary="All" class="text-danger"></div>
    <div class="form-group">
        <label asp-for="Username"></label>
        <input asp-for="Username" class="form-control" />
        <span asp-validation-for="Username" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="Password"></label>
        <input asp-for="Password" class="form-control" type="password" />
        <span asp-validation-for="Password" class="text-danger"></span>
    </div>
    <div class="form-group">
        <div class="checkbox">
            <label asp-for="RememberMe">
                <input asp-for="RememberMe" />
                @Html.DisplayNameFor(m => m.RememberMe)
            </label>
        </div>
    </div>
    <button type="submit" class="btn btn-primary">Log in</button>
</form>

创建 LoginViewModel

创建一个 LoginViewModel,用于绑定登录表单的数据:

public class LoginViewModel
{
    [Required]
    [Display(Name = "User name")]
    public string Username { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

三、保护 API 路由

一旦配置了 Cookie 身份验证,你可以使用 [Authorize] 特性来保护你的 API 路由,确保只有经过身份验证的用户可以访问受保护的资源。

[Authorize]
public class ProtectedController : Controller
{ 
    public IActionResult GetProtectedData()
    {
        return Ok(new { message = "This is protected data" });
    }
}

四、客户端请求

客户端在请求受保护的 API 时,浏览器会自动发送存储在 Cookie 中的身份验证数据。服务器会通过 Cookie 中间件验证这些数据的有效性,并允许或拒绝请求。

五、登出逻辑

用户可以通过访问登出路径来登出。登出逻辑会清除用户的 Cookie,从而结束会话。

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout()
{
    await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    return RedirectToAction("Index", "Home");
}

总结

通过以上步骤,可以在 ASP.NET Core 应用中实现基于 Cookie 的身份鉴权,确保你的应用能够安全地验证用户身份并授权访问特定资源。Cookie 的持久性和易于管理的特性使其成为传统 Web 应用中身份验证的理想选择。

标签:Core,ASP,登出,app,身份验证,Cookie,new,public
From: https://www.cnblogs.com/netcore5/p/18687385

相关文章

  • ASP.NET Core 使用响应压缩中间件提高程序性能
    20250104_ASP.NETCore使用响应压缩中间件提高程序性能ASP.NETCore中的响应压缩中间件1.什么是响应压缩中间件响应压缩中间件是ASP.NETCore的一部分,它通过应用支持的压缩算法(如Gzip和Brotli)来减小服务器发送到客户端的响应体积。这有助于加速数据传输,尤其适用于大段文本和......
  • ASP.NET Core 中的超时中间件
    ASP.NETCore中的超时中间件在ASP.NETCore中,超时中间件允许为HTTP请求设置超时限制,以提高应用程序的健壮性和响应能力。1.添加超时中间件到应用需要在的服务集合中添加请求超时中间件,再将其添加到请求处理管道中。usingMicrosoft.AspNetCore.Http.Timeouts;varbuilder......
  • ASP.NET Core 快速轻量级的浏览器检测和设备检测库
    在.NETFramework4.7中那样,通过HttpContext.Request的Browser属性轻松获取发起HTTP请求的浏览器信息,ASP.NETCore并未直接提供这一功能,现在有了BrowserDetector这个强大的NuGet包,你可以在ASP.NETCore应用中轻松实现浏览器、设备类型以及操作系统的检测。Browser......
  • 使用SpongeExt快捷完成CudaSPONGE结合PySAGES的增强采样
    技术背景在前面的一些文章中,我们介绍过关于CudaSPONGE的安装和基础使用方法,CudaSPONGE提供的Python接口,PySAGES增强采样软件的基本使用方法,还有一篇关于CudaSPONGE和PySAGES相结合的文章,并且做了一些简单的CudaSPONGE结合PySAGES的性能测试。其中因为CudaSPONGE与PySAGES的接口实......
  • 《OWASP TOP 10重磅来袭!网络安全的“定时炸弹”,你防范好了吗?》
    OWASPTOP10owasp官网:http://www.owasp.org.cn/一、引言简介Web应用安全的重要性在于保护网站和服务器免受外部攻击,确保数据安全和用户隐私。常见的Web应用安全漏洞包括注入攻击、身份验证漏洞、敏感数据暴露等。为了应对这些挑战,企业应采取多层次的安全防护措施,如使用W......
  • .net core 的 swagger 分组简单使用
    1.Programm中添加builder.Services.AddSwaggerGen(c=>{c.SwaggerDoc("v1",newOpenApiInfo{Title="BarcodeAPI",Version="v1"});c.SwaggerDoc("WMS",newOpenApiInfo{Title="W......
  • 当ASP.NET API接口被刷:全面应对指南
    一、引言在当今数字化的网络世界中,ASP.NETAPI作为后端服务与前端应用、第三方系统交互的桥梁,扮演着至关重要的角色。然而,令人头疼的是,API接口常常遭受恶意刷取的威胁。想象一下,大量毫无意义的恶意请求如潮水般涌来,服务器资源被无情地消耗,合法用户的请求只能在一旁苦苦等......
  • 08使用EFCore进行增删改查 - ASP.NET Core WebAPI
    文章目录一、如何在控制器中使用EFCore1.注册服务2.获取db对象3.使用db对象进行crud二、如何在筛选器中使用EFCore1.与控制器类中同样操作2.注意事项一、如何在控制器中使用EFCore1.注册服务在program.cs文件中添加以下代码。builder.Services.AddDbContext<App......
  • .NET Core 中如何构建一个弹性的 HTTP 请求机制?
    1.理解弹性HTTP请求机制什么是弹性?弹性是指系统在面对故障或异常情况时,能够保持或快速恢复到正常状态的能力。在HTTP请求的上下文中,弹性意味着当请求失败时,系统能够自动采取一系列措施(如重试、降级、断路等)来确保请求最终成功或优雅地处理失败。为什么需要弹性HTTP请求......
  • DevExpress ASP.NET Web Forms v24.2 最新版本系统环境配置要求
    本文档包含有关安装和使用 DevExpressASP.NETWebForms控件的系统要求的信息。点击获取DevExpressv24.2正式版.NETFrameworkDevExpressASP.NETWebForms控件支持以下.NET框架版本。如果您需要DevExpress产品的早期版本,请咨询“在线客服”获取。IDEDevExpressASP.......