.NET 6.0 Web API项目中实现基于Token的身份验证

        

目录

步骤 1: 创建Web API项目

步骤 2: 安装必要的NuGet包

步骤 3: 配置身份验证服务

步骤 4: 配置JWT设置

步骤 5: 创建Token生成控制器

步骤 6: 创建受保护的控制器

步骤 7: 调用API

核心概念和注意事项

总结


        本文以一个完整的示例,展示如何在.NET 6.0 Web API项目中实现基于Token的身份验证。这个例子包括了如何创建和验证JWT Token,以及如何在控制器中使用这些Token。

步骤 1: 创建Web API项目

首先,用Visual Studio 2022创建一个基于.NET6.0的 Web API项目。

步骤 2: 安装必要的NuGet包

安装Microsoft.AspNetCore.Authentication.JwtBearer包。

步骤 3: 配置身份验证服务

Program.cs中配置身份验证服务:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;

var builder = WebApplication.CreateBuilder(args);

// 添加身份验证服务
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = builder.Configuration["Jwt:Issuer"],
            ValidAudience = builder.Configuration["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
        };
    });

// 添加授权服务
builder.Services.AddAuthorization();

var app = builder.Build();

// 使用身份验证和授权中间件
app.UseAuthentication();
app.UseAuthorization();

// 其他配置和路由设置

app.MapControllers();
app.Run();

步骤 4: 配置JWT设置

appsettings.json中配置JWT的相关设置:

{
  "Jwt": {
    "Issuer": "YourIssuer",
    "Audience": "YourAudience",
    "Key": "YourVerySecretKey"
  }
}

步骤 5: 创建Token生成控制器

创建一个控制器来生成Token:

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

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

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

    [HttpPost("login")]
    public IActionResult Login([FromBody] LoginModel model)
    {
        // 假设这里有一个验证逻辑,验证用户名和密码
        if (model.Username == "test" && model.Password == "password")
        {
            var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(new Claim[]
                {
                    new Claim(ClaimTypes.Name, model.Username)
                }),
                Expires = DateTime.UtcNow.AddMinutes(5),
                SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"])), SecurityAlgorithms.HmacSha256Signature),
                Issuer = _configuration["Jwt:Issuer"],
                Audience = _configuration["Jwt:Audience"]
            };
            var tokenHandler = new JwtSecurityTokenHandler();
            var token = tokenHandler.CreateToken(tokenDescriptor);
            return Ok(new { token = tokenHandler.WriteToken(token) });
        }
        else
        {
            return Unauthorized();
        }
    }
}

public class LoginModel
{
    public string Username { get; set; }
    public string Password { get; set; }
}

步骤 6: 创建受保护的控制器

创建一个控制器,只有持有有效Token的用户才能访问:

[ApiController]
[Route("[controller]")]
public class SecretController : ControllerBase
{
    [Authorize]
    [HttpGet]
    public IActionResult Get()
    {
        return Ok("This is a secret message.");
    }
}

步骤 7: 调用API

要调用API,首先需要获取Token。可以使用Postman或类似的工具发送一个POST请求到/Auth/login,并提供用户名和密码。然后,使用返回的Token在Authorization头部中发送一个GET请求到/Secret

POST /Auth/login HTTP/1.1
Host: localhost:5000
Content-Type: application/json

{
    "Username": "test",
    "Password": "password"
}
GET /Secret HTTP/1.1
Host: localhost:5000
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoidGVzdCIsImV4cCI6MTYxODI3MzYwNSwiaXNzIjoiWW91ciJJc3N1ZXIiLCJhdWQiOiJZb3VyQXV0aGVudGljYXRpb24ifQ.6_3QXxZ3VzZvjZ7RnV5NQz-7y_93fY0Y7Y6jV7-XzQ

确保在实际应用中实现安全的用户验证逻辑,并且不要在代码中硬编码敏感信息。此外,根据你的具体需求,可能还需要实现用户注册、Token刷新等功能

核心概念和注意事项

  1. 安全性:确保密钥(Jwt:Key)的安全性,不要在源代码中硬编码密钥。可以使用环境变量或更安全的密钥管理系统。

  2. Token 有效期:Token 的有效期设置为 30 分钟(在示例中),可以根据需要调整。确保在生产环境中合理设置 Token 的有效期,避免安全风险。

  3. 用户验证:示例中简单地硬编码了用户名和密码以展示验证逻辑。在实际应用中,应替换为数据库或其他存储系统中的用户验证逻辑。

  4. 授权控制:通过 [Authorize] 特性保护需要身份验证的控制器或操作。可以使用 [Authorize(Roles = "Admin")] 等特性实现基于角色的访问控制。

  5. 错误处理:处理可能的错误情况,例如无效的 Token、过期的 Token 等,以提高用户体验和系统安全性。

  6. 跨域请求:如果需要支持跨域请求,请确保正确配置 CORS(跨域资源共享),以允许来自不同域的请求。

总结

        通过以上步骤,你已经成功在 .NET 6.0 Web API 项目中实现了基于 JWT Token 的身份验证。这个示例包括了如何创建和验证 JWT Token,以及如何在控制器中使用这些 Token。希望这个示例对你有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿享天开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值