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

news/2025/2/4 14:38:17/文章来源:https://www.cnblogs.com/51net/p/18698202

在 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.hqwc.cn/news/878548.html

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

相关文章

ASP.NET Core 中,Cookie 认证在集群环境下的应用

在 ASP.NET Core 中,Cookie 认证在集群环境下的应用通常会遇到一些挑战。主要的问题是 Cookie 存储在客户端的浏览器中,而认证信息(比如 Session 或身份令牌)通常是保存在 Cookie 中,多个应用实例需要共享这些 Cookie 信息,以便用户在集群中各个实例间无缝切换。 1. 集群…

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

在 ASP.NET Core 中使用 Cookie 身份验证,通常是为了实现用户的登录和授权。以下是配置 Cookie 身份验证的步骤。 1. 安装必要的 NuGet 包 首先,确保项目中包含 Microsoft.AspNetCore.Authentication.Cookies 包。你可以通过 NuGet 包管理器或命令行安装它: dotnet add pack…

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替代,取决于具体的测试场景、技术发展阶段以及人类与…