ASP.NET Core 中,认证(Authentication)和授权(Authorization)

devtools/2025/1/17 6:59:56/

在 ASP.NET Core 中,认证(Authentication)和授权(Authorization)是两个非常重要的概念。它们确保用户能够安全地访问应用程序,并且在访问过程中能按其权限被正确地控制。接下来,我将详细解释这两个概念,并且如何在 ASP.NET Core 中实现它们。

1. 认证(Authentication)

认证是指验证用户的身份,确保用户是他们声称的身份。在 ASP.NET Core 中,认证通常使用 Cookie、JWT(JSON Web Tokens)、OAuth2、OpenID Connect 等方式实现。

认证的基本流程:
  1. 用户输入凭证(用户名、密码、Token等)。

  2. 系统验证凭证是否有效。

  3. 如果凭证有效,生成一个身份标识(如 JWT 或 Cookie),并将其返回给用户。

  4. 用户在后续请求中附带此标识来证明自己的身份。

ASP.NET Core 提供了几种认证机制:

  • Cookie Authentication:使用 Cookie 来保存用户的身份标识,适用于传统的基于会话的 Web 应用。

  • JWT Bearer Authentication:使用 JSON Web Token(JWT)进行认证,常用于基于 API 的应用程序(如 SPA 或移动应用)。

  • OAuth2 / OpenID Connect:授权框架,用于实现第三方认证(例如 Google、Facebook 登录等)。

示例:JWT 认证

在 ASP.NET Core 中配置 JWT 认证的步骤如下:

  1. 安装必要的 NuGet 包

    dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
    
  2. 配置 Startup.cs 中的认证服务

    public void ConfigureServices(IServiceCollection services)
    {services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>{options.RequireHttpsMetadata = false;options.SaveToken = true;options.TokenValidationParameters = new TokenValidationParameters{ValidateIssuer = true,ValidateAudience = true,ValidateLifetime = true,ValidIssuer = Configuration["Jwt:Issuer"],ValidAudience = Configuration["Jwt:Audience"],IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SecretKey"]))};});
    }
    
  3. 在 Configure 方法中启用认证

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {app.UseAuthentication();app.UseAuthorization();
    }
    
  4. 生成 JWT Token: 在 Controller 中生成 JWT Token(通常是登录接口中):

    public IActionResult Login([FromBody] LoginModel model)
    {var claims = new[]{new Claim(ClaimTypes.Name, model.Username),new Claim(ClaimTypes.Role, "Admin")};var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key_here"));var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);var token = new JwtSecurityToken(issuer: "your_issuer",audience: "your_audience",claims: claims,expires: DateTime.Now.AddMinutes(30),signingCredentials: creds);return Ok(new { Token = new JwtSecurityTokenHandler().WriteToken(token) });
    }
    

2. 授权(Authorization)

授权是指验证用户是否具有访问特定资源的权限。授权决定了认证用户可以执行哪些操作,访问哪些资源。

ASP.NET Core 的授权可以基于角色、策略或基于要求的授权。

角色授权:

最常见的授权方式是基于角色的授权,用户具有某些角色,系统根据角色来决定是否允许访问资源。

在控制器中使用 [Authorize] 特性进行角色授权

[Authorize(Roles = "Admin")]
public IActionResult AdminOnly()
{return View();
}
策略授权:

策略授权允许你根据自定义的逻辑进行授权,通常结合策略处理更加复杂的授权需求。

  1. 创建一个自定义策略

    public class MinimumAgeRequirement : IAuthorizationRequirement
    {public int MinimumAge { get; }public MinimumAgeRequirement(int minimumAge){MinimumAge = minimumAge;}
    }
    
  2. 实现一个授权处理程序

    public classMinimumAgeHandler : AuthorizationHandler<MinimumAgeRequirement>
    {protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MinimumAgeRequirement requirement){var user = context.User;var birthdateClaim = user.FindFirst(c => c.Type == "Birthdate");if (birthdateClaim != null){var birthdate = DateTime.Parse(birthdateClaim.Value);var age = DateTime.Today.Year - birthdate.Year;if (age >= requirement.MinimumAge){context.Succeed(requirement);}}return Task.CompletedTask;}
    }
    
  3. 在 Startup.cs 中注册授权策略

    public void ConfigureServices(IServiceCollection services)
    {services.AddAuthorization(options =>{options.AddPolicy("Over18", policy =>policy.Requirements.Add(new MinimumAgeRequirement(18)));});services.AddSingleton<IAuthorizationHandler, MinimumAgeHandler>();
    }
    
  4. 在控制器中使用策略授权

    [Authorize(Policy = "Over18")]
    public IActionResult RestrictedContent()
    {return View();
    }
    

3. 区别与结合

  • 认证:通过验证用户身份来确认用户是谁,通常通过 Cookie 或 Token 来维持。

  • 授权:根据用户的角色或权限,决定是否允许其执行某些操作或访问某些资源。

这两者通常是配合使用的,认证用于确认用户身份,授权用于控制其能访问哪些资源或执行哪些操作。

4. 总结

在 ASP.NET Core 中,认证和授权是保障 Web 应用安全的关键部分。你可以根据应用的需求选择不同的认证和授权方式。例如,如果你有一个 API,你可能会选择使用 JWT 认证,而对于 Web 应用则可能会使用 Cookie 认证。而授权则可以通过角色、策略等多种方式进行。通过合理配置认证和授权,可以确保应用程序安全,并且按照最小权限原则来控制用户的访问。


http://www.ppmy.cn/devtools/151203.html

相关文章

Java反射、静态代理、动态代理

往期推荐 Java io模型-CSDN博客 如何设计一个能根据任务优先级来执行的线程池-CSDN博客 Web实时消息推送的几种方案_setmessageinnerhtml is not defined-CSDN博客 yum、dnf、apt包管理工具-CSDN博客 概述 反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够…

在使用 GitLab API 时,如果只能获取少量的 Merge Request(MR)信息,而没有完整的数据

在使用 GitLab API 时&#xff0c;如果只能获取少量的 Merge Request&#xff08;MR&#xff09;信息&#xff0c;而没有完整的数据&#xff0c;通常是因为以下原因之一&#xff1a; 1. 分页限制 GitLab API 默认会分页返回数据&#xff0c;每页的默认数量是 20 条&#xff08…

关于《关卡1:Pandas处理时间数据》学习心得分享

碎碎念&#xff1a;由于我在时间序列分析方面的知识尚显薄弱&#xff0c;因此参加了和鲸举办的时间序列数据处理训练营&#xff0c;期望能够提升相关技能。同时&#xff0c;我借助了GPT来补充一些内容&#xff0c;希望这些分享能对各位读者有所帮助。欢迎大家一起学习交流&…

深入理解 Entity、VO、QO、DTO 的区别及其在 MVC 架构中的应用

文章背景 在现代软件开发中&#xff0c;我们经常会接触到各种数据结构的概念&#xff0c;比如 Entity、VO&#xff08;Value Object&#xff09;、QO&#xff08;Query Object&#xff09;、DTO&#xff08;Data Transfer Object&#xff09;等。这些概念尽管看似相似&#xff…

【算法】图解二叉树的前中后序遍历

目录 1.递归序实现 2.非递归实现 二叉树的节点结构 public static class Node {public int value;public Node left;public Node right;public Node(int data) {this.value data;} } 1.递归序实现 递归的方法遍历二叉树时每一个节点都会被访问三次 public static void f…

【微信小程序】let和const-综合实训

let 和 const 都是用于声明变量的关键字&#xff0c;它们与传统的 var 关键字相比&#xff0c;有很多不同之处。 let 声明块级作用域变量&#xff0c;可再赋值&#xff1b;const 声明块级作用域常量&#xff0c;不可再赋值。 以下是它们的详细介绍&#xff1a; 一、基本概念…

Ruby语言的网络编程

Ruby语言的网络编程 引言 Ruby是一种高度抽象的动态编程语言&#xff0c;以其简洁的语法和强大而灵活的功能而闻名。自1995年由松本行弘&#xff08;Yukihiro Matsumoto&#xff09;发布以来&#xff0c;Ruby便吸引了无数开发者&#xff0c;尤其是在Web开发领域。随着互联网的…

【Uniapp-Vue3】pages.json页面路由globalStyle的属性

项目的全局配置在pages.json中。 一、导航栏设置 二、下拉刷新设置 下拉就可以看到设置的样式 三、上拉触底 这个页面中&#xff0c;向下滑动页面到底部就会输出“到底了” 现在将触底距离设置为500 走到半路就会输出“到底了”