ASP.NET Core 实战:基于 Jwt Token 的权限控制全揭露

开发 前端
通过结合ASP.NET Core和JWT,我们可以构建出一个安全、高效的权限控制框架。这种架构模式使得权限控制更加灵活和可扩展,同时也便于维护和扩展。希望本文能够帮助读者了解如何整合两者,打造出一个优秀的Web应用。​

引言 

在现代Web应用开发中,权限控制是确保应用安全性和用户体验的重要一环。ASP.NET Core是一个强大的Web框架,它支持多种认证和授权机制。其中,基于JSON Web Tokens(JWT)的权限控制是一种流行的解决方案。JWT提供了一种安全、可验证的方式来传递用户信息,从而实现无状态的认证和授权。本文将详细探讨如何在ASP.NET Core中实施基于JWT Token的权限控制,并提供代码示例来指导读者实现。

JWT基本原理 

JWT是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。这些信息可以被验证和信任,因为它们是数字签名的。JWT通常用于在用户和服务器之间安全地传输信息。一个JWT通常包含三个部分:Header(头部)、Payload(负载)和Signature(签名)。

安装依赖包 

首先,确保安装了以下NuGet包:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

这将添加JWT身份验证所需的依赖。

配置JWT身份验证 

在Startup.cs或Program.cs中配置JWT身份验证。你需要在appsettings.json文件中添加JWT配置,例如密钥、发行者和受众:

{
  "JwtSettings": {
    "Secret": "YourSecretKey",     // 用于加密的密钥(应非常复杂)
    "Issuer": "YourAppName",       // 发行者
    "Audience": "YourAppUsers",    // 受众
    "ExpireMinutes": 120           // 令牌有效期
  }
}

然后,在服务中配置JWT认证:

var builder = WebApplication.CreateBuilder(args);
// 从配置文件中获取JWT设置
var jwtSettings = builder.Configuration.GetSection("JwtSettings");
// 配置JWT身份验证
builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        ValidIssuer = jwtSettings["Issuer"],
        ValidAudience = jwtSettings["Audience"],
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings["Secret"])),
        ClockSkew = TimeSpan.Zero  // 默认的5分钟偏移时间
    };
});
var app = builder.Build();
// 启用认证中间件
app.UseAuthentication();
app.UseAuthorization();

这将配置JWT认证方案,并启用认证和授权中间件。

生成JWT Token 

创建一个控制器或服务,用于生成JWT令牌。例如,编写一个登录API来生成JWT令牌:

using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
    private readonly IConfiguration _configuration;

    public AuthController(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    [HttpPost("login")]
    public IActionResult Login([FromBody] LoginRequest loginRequest)
    {
        // 假设你已经验证了用户名和密码
        if (loginRequest.Username == "admin" && loginRequest.Password == "password")
        {
            var token = GenerateJwtToken(loginRequest.Username);
            return Ok(new { token });
        }
        return Unauthorized();
    }

    private string GenerateJwtToken(string username)
    {
        var jwtSettings = _configuration.GetSection("JwtSettings");
        var claims = new[]
        {
            new Claim(JwtRegisteredClaimNames.Sub, username),
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
        };
        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings["Secret"]));
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(claims),
            Issuer = jwtSettings["Issuer"],
            Audience = jwtSettings["Audience"],
            Expires = DateTime.UtcNow.AddMinutes(Convert.ToDouble(jwtSettings["ExpireMinutes"])),
            SigningCredentials = creds
        };
        var tokenHandler = new JwtSecurityTokenHandler();
        var securityToken = tokenHandler.CreateToken(tokenDescriptor);
        return tokenHandler.WriteToken(securityToken);
    }
}

这段代码展示了如何生成JWT Token,并将其返回给客户端。

验证JWT Token 

ASP.NET Core应用会自动验证客户端发送的JWT Token。确保在需要验证Token的控制器或操作上使用[Authorize]属性。

基于策略的授权 

你可以在Startup.cs的ConfigureServices方法中定义基于角色的策略或更复杂的策略,然后在控制器或操作上使用这些策略:

services.AddAuthorization(options =>
{
    options.AddPolicy("RequireAdminRole", policy => policy.RequireRole("Admin"));
});

然后,在控制器中使用这个策略:

[Authorize(Policy = "RequireAdminRole")]
public IActionResult AdminOnly()
{
    return Ok("Only Admins can see this.");
}

结语 

通过结合ASP.NET Core和JWT,我们可以构建出一个安全、高效的权限控制框架。这种架构模式使得权限控制更加灵活和可扩展,同时也便于维护和扩展。希望本文能够帮助读者了解如何整合两者,打造出一个优秀的Web应用。


责任编辑:武晓燕 来源: 程序员编程日记
相关推荐

2024-09-09 07:37:51

AspJWT权限

2024-09-10 08:13:16

Asp项目轻量级

2009-07-07 10:14:57

基于URL权限控制

2024-09-10 08:15:33

Asp项目API

2021-02-19 06:54:33

配置系统ASP.NET Cor

2009-07-27 14:24:16

ASP.NET访问权限

2018-08-20 08:03:46

跨平台 Web操作系统

2024-06-11 09:00:00

异步编程代码

2024-12-05 08:14:41

2024-11-27 08:34:53

ASPZIP压缩包

2022-02-15 08:34:56

AI发票识别

2021-03-04 11:10:29

容器化Docker虚拟机

2021-03-12 00:04:52

网关Api

2021-01-05 07:51:06

版本化ASP

2009-07-27 16:37:42

ASP.NET主机

2021-02-02 16:19:08

Serilog日志框架

2021-02-06 21:40:13

SignalR通讯TypeScript

2021-03-17 09:45:31

LazyCacheWindows

2023-07-04 08:26:15

2021-11-01 14:52:38

ElasticSear索引SQL
点赞
收藏

51CTO技术栈公众号