Asp.NET Core WebApi 创建带鉴权机制的Api

构建一个包含 JWT(JSON Web Token)鉴权的 Web API 是一种常见的做法,用于保护 API 端点并验证用户身份。以下是一个基于 ASP.NET Core 的完整示例,展示如何实现 JWT 鉴权。


1. 创建 ASP.NET Core Web API 项目

使用 .NET CLI 或 Visual Studio 创建一个新的 Web API 项目:

bash 复制代码
dotnet new webapi -n JwtAuthApi
cd JwtAuthApi

2. 安装必要的 NuGet 包

确保安装了以下包(通常默认已包含):

  • Microsoft.AspNetCore.Authentication.JwtBearer
  • Microsoft.IdentityModel.Tokens
  • System.IdentityModel.Tokens.Jwt

如果未安装,可以运行以下命令:

bash 复制代码
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

3. 配置 JWT 鉴权

(1) 修改 appsettings.json

appsettings.json 中添加 JWT 配置:

json 复制代码
{
  "Jwt": {
    "Key": "YourSecretKeyForJwtAuthentication", // 用于签名的密钥
    "Issuer": "YourIssuer",                    // 发行者
    "Audience": "YourAudience"                 // 受众
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}
(2) 配置服务 (Program.cs)

Program.cs 中配置 JWT 鉴权服务:

csharp 复制代码
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;

var builder = WebApplication.CreateBuilder(args);

// 添加 JWT 鉴权
var jwtSettings = builder.Configuration.GetSection("Jwt");
var key = Encoding.ASCII.GetBytes(jwtSettings["Key"]);

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(key)
    };
});

builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

// 使用鉴权中间件
app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();

4. 创建用户登录和生成 JWT 的逻辑

(1) 创建模型类

创建一个简单的用户模型和返回的响应模型:

csharp 复制代码
public class UserModel
{
    public string Username { get; set; }
    public string Password { get; set; }
}

public class AuthResponse
{
    public string Token { get; set; }
    public DateTime Expiration { get; set; }
}
(2) 创建生成 JWT 的方法

Controllers/AuthController.cs 中实现登录和生成 JWT 的逻辑:

csharp 复制代码
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] UserModel user)
    {
        // 模拟用户验证(实际应从数据库中验证)
        if (user.Username == "admin" && user.Password == "password")
        {
            var token = GenerateJwtToken(user.Username);
            return Ok(new AuthResponse
            {
                Token = token,
                Expiration = DateTime.UtcNow.AddMinutes(30) // 设置过期时间
            });
        }

        return Unauthorized(new { message = "Invalid username or password" });
    }

    private string GenerateJwtToken(string username)
    {
        var jwtSettings = _configuration.GetSection("Jwt");
        var key = Encoding.ASCII.GetBytes(jwtSettings["Key"]);

        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new[]
            {
                new Claim(ClaimTypes.Name, username),
                new Claim(ClaimTypes.Role, "Admin") // 示例角色
            }),
            Expires = DateTime.UtcNow.AddMinutes(30), // 设置过期时间
            Issuer = jwtSettings["Issuer"],
            Audience = jwtSettings["Audience"],
            SigningCredentials = new SigningCredentials(
                new SymmetricSecurityKey(key),
                SecurityAlgorithms.HmacSha256Signature)
        };

        var tokenHandler = new JwtSecurityTokenHandler();
        var securityToken = tokenHandler.CreateToken(tokenDescriptor);
        return tokenHandler.WriteToken(securityToken);
    }
}

5. 创建受保护的 API 端点

(1) 创建一个受保护的控制器

Controllers/SecureController.cs 中创建一个需要 JWT 鉴权的端点:

csharp 复制代码
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
[Authorize] // 要求鉴权
public class SecureController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        var username = User.Identity.Name;
        return Ok(new { message = $"Hello, {username}! This is a secure endpoint." });
    }
}

6. 测试 API

(1) 登录获取 JWT

发送 POST 请求到 /api/auth/login,请求体如下:

json 复制代码
{
  "username": "admin",
  "password": "password"
}

响应会返回一个 JWT Token。

(2) 访问受保护的端点

将获取到的 Token 添加到请求头中,格式为:

复制代码
Authorization: Bearer <JWT_TOKEN>

然后访问 /api/secure,你将看到受保护的响应。


总结

通过以上步骤,我们实现了一个包含 JWT 鉴权的 Web API。这个示例展示了如何生成 JWT、验证 JWT,以及如何保护 API 端点。你可以根据实际需求扩展功能,例如从数据库验证用户、支持角色权限等。

相关推荐
瀚海澜生6 分钟前
链表系列进阶攻略(三):拆解 LRU 与分割链表,突破链表解题瓶颈
后端·算法
bobz96515 分钟前
supervisord 的使用
后端
大道无形我有型16 分钟前
📖 Spring 事务机制超详细讲解(哥们专属)
后端
Re27517 分钟前
springboot源码分析--自动配置流程
spring boot·后端
Piper蛋窝20 分钟前
Go 1.2 相比 Go1.1 有哪些值得注意的改动?
后端·go
努力的搬砖人.23 分钟前
java爬虫案例
java·经验分享·后端
海风极客35 分钟前
一文搞懂JSON和HJSON
前端·后端·面试
南雨北斗36 分钟前
2.单独下载和配置PHP环境
后端
海风极客37 分钟前
一文搞懂Clickhouse的MySQL引擎
后端·面试·架构
都叫我大帅哥39 分钟前
遍历世界的通行证:迭代器模式的导航艺术
java·后端·设计模式