ASP.NET Core 6.0 添加 JWT 认证和授权

软件测试视界 2024-03-07 ⋅ 30 阅读

引言

在现代 Web 应用程序中,认证和授权是确保安全性和访问控制的关键组成部分。JWT(JSON Web Token)是一种用于进行身份验证和授权的开放标准。在 ASP.NET Core 6.0 中,可以轻松地添加 JWT 认证和授权,以保护您的应用程序。

本文将介绍如何在 ASP.NET Core 6.0 中添加 JWT 认证并实现授权。我们将使用 ASP.NET Core Identity 作为用户管理系统,并演示如何生成和验证 JWT。最后,我们将通过将 JWT 添加到 API 控制器中来实现基于角色的授权。

1. 添加 JWT 认证中间件

要在 ASP.NET Core 6.0 中添加 JWT 认证,首先需要将相应的 NuGet 包添加到项目中。可以通过在项目文件 .csproj 中添加以下代码来完成:

<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.0" />
    <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.12.0" />
</ItemGroup>

接下来,在 Startup.cs 文件中进行配置。在 ConfigureServices 方法中,添加以下代码:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = "your_issuer",
            ValidAudience = "your_audience",
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"))
        };
    });

这将配置 JWT 认证中间件,并指定了用于验证 JWT 的参数,包括发行人(Issuer)、受众(Audience)和签名密钥(Secret Key)。

2. 生成和验证 JWT

为了生成和验证 JWT,我们可以创建一个辅助类来处理这些操作。创建一个名为 JwtHelper.cs 的新类,并添加以下代码:

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

public class JwtHelper
{
    public static string GenerateToken(string userId, string username, string secretKey, double expirationHours)
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.UTF8.GetBytes(secretKey);
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new Claim[]
            {
                new Claim(ClaimTypes.NameIdentifier, userId),
                new Claim(ClaimTypes.Name, username)
            }),
            Expires = DateTime.UtcNow.AddHours(expirationHours),
            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
        };
        var token = tokenHandler.CreateToken(tokenDescriptor);
        return tokenHandler.WriteToken(token);
    }

    public static ClaimsPrincipal ValidateToken(string token, string secretKey)
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.UTF8.GetBytes(secretKey);
        var validationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = "your_issuer",
            ValidAudience = "your_audience",
            IssuerSigningKey = new SymmetricSecurityKey(key)
        };
        try
        {
            var principal = tokenHandler.ValidateToken(token, validationParameters, out _);
            return principal;
        }
        catch (Exception)
        {
            return null;
        }
    }
}

这个辅助类中包含了 GenerateTokenValidateToken 方法,用于生成和验证 JWT。在这里,我们使用了 Microsoft.IdentityModel.Tokens 命名空间提供的类来处理 JWT 的创建和验证。

3. 添加基于角色的授权

要实现基于角色的授权,我们可以使用 ASP.NET Core Identity 来管理用户和角色。首先,在 Startup.cs 文件的 ConfigureServices 方法中添加以下代码:

services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddRoles<ApplicationRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

这将配置 ASP.NET Core Identity,使其支持用户、角色和 Entity Framework 存储。

接下来,在 ConfigureServices 方法中添加以下代码,以启用角色授权:

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

这将添加一个名为 "AdminOnly" 的授权策略,要求用户具有 "Admin" 角色才能访问相应的资源。

然后,在您的 API 控制器的目标动作上添加 [Authorize(Policy = "AdminOnly")] 属性,即可实现基于角色的授权。例如:

[Authorize(Policy = "AdminOnly")]
[HttpGet]
public IActionResult AdminOnlyAction()
{
    // 只有具有 "Admin" 角色的用户才能访问这个动作
    return Ok();
}

结论

通过添加 JWT 认证和授权,您可以提供安全的身份验证和访问控制机制。本文介绍了如何在 ASP.NET Core 6.0 中添加 JWT 认证,并使用 ASP.NET Core Identity 实现基于角色的授权。我们还演示了如何生成和验证 JWT,以及如何使用基于角色的授权限制访问。希望这篇博客能帮助您快速使用 JWT 认证和授权来保护您的应用程序。

参考资料:


全部评论: 0

    我有话说: