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

打印 上一主题 下一主题

主题 830|帖子 830|积分 2490

        
目录
步骤 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中设置身份验证服务:
  1. using Microsoft.AspNetCore.Authentication.JwtBearer;
  2. using Microsoft.IdentityModel.Tokens;
  3. using System.Text;
  4. var builder = WebApplication.CreateBuilder(args);
  5. // 添加身份验证服务
  6. builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  7.     .AddJwtBearer(options =>
  8.     {
  9.         options.TokenValidationParameters = new TokenValidationParameters
  10.         {
  11.             ValidateIssuer = true,
  12.             ValidateAudience = true,
  13.             ValidateLifetime = true,
  14.             ValidateIssuerSigningKey = true,
  15.             ValidIssuer = builder.Configuration["Jwt:Issuer"],
  16.             ValidAudience = builder.Configuration["Jwt:Audience"],
  17.             IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
  18.         };
  19.     });
  20. // 添加授权服务
  21. builder.Services.AddAuthorization();
  22. var app = builder.Build();
  23. // 使用身份验证和授权中间件
  24. app.UseAuthentication();
  25. app.UseAuthorization();
  26. // 其他配置和路由设置
  27. app.MapControllers();
  28. app.Run();
复制代码
步骤 4: 设置JWT设置

在appsettings.json中设置JWT的相关设置:
  1. {
  2.   "Jwt": {
  3.     "Issuer": "YourIssuer",
  4.     "Audience": "YourAudience",
  5.     "Key": "YourVerySecretKey"
  6.   }
  7. }
复制代码
步骤 5: 创建Token生成控制器

创建一个控制器来生成Token:
  1. using Microsoft.AspNetCore.Mvc;
  2. using Microsoft.IdentityModel.Tokens;
  3. using System;
  4. using System.IdentityModel.Tokens.Jwt;
  5. using System.Security.Claims;
  6. using System.Text;
  7. [ApiController]
  8. [Route("[controller]")]
  9. public class AuthController : ControllerBase
  10. {
  11.     private readonly IConfiguration _configuration;
  12.     public AuthController(IConfiguration configuration)
  13.     {
  14.         _configuration = configuration;
  15.     }
  16.     [HttpPost("login")]
  17.     public IActionResult Login([FromBody] LoginModel model)
  18.     {
  19.         // 假设这里有一个验证逻辑,验证用户名和密码
  20.         if (model.Username == "test" && model.Password == "password")
  21.         {
  22.             var tokenDescriptor = new SecurityTokenDescriptor
  23.             {
  24.                 Subject = new ClaimsIdentity(new Claim[]
  25.                 {
  26.                     new Claim(ClaimTypes.Name, model.Username)
  27.                 }),
  28.                 Expires = DateTime.UtcNow.AddMinutes(5),
  29.                 SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"])), SecurityAlgorithms.HmacSha256Signature),
  30.                 Issuer = _configuration["Jwt:Issuer"],
  31.                 Audience = _configuration["Jwt:Audience"]
  32.             };
  33.             var tokenHandler = new JwtSecurityTokenHandler();
  34.             var token = tokenHandler.CreateToken(tokenDescriptor);
  35.             return Ok(new { token = tokenHandler.WriteToken(token) });
  36.         }
  37.         else
  38.         {
  39.             return Unauthorized();
  40.         }
  41.     }
  42. }
  43. public class LoginModel
  44. {
  45.     public string Username { get; set; }
  46.     public string Password { get; set; }
  47. }
复制代码
步骤 6: 创建受掩护的控制器

创建一个控制器,只有持有有效Token的用户才能访问:
  1. [ApiController]
  2. [Route("[controller]")]
  3. public class SecretController : ControllerBase
  4. {
  5.     [Authorize]
  6.     [HttpGet]
  7.     public IActionResult Get()
  8.     {
  9.         return Ok("This is a secret message.");
  10.     }
  11. }
复制代码
步骤 7: 调用API

要调用API,首先必要获取Token。可以使用Postman或雷同的工具发送一个POST请求到/Auth/login,并提供用户名和密码。然后,使用返回的Token在Authorization头部中发送一个GET请求到/Secret。
  1. POST /Auth/login HTTP/1.1
  2. Host: localhost:5000
  3. Content-Type: application/json
  4. {
  5.     "Username": "test",
  6.     "Password": "password"
  7. }
复制代码
  1. GET /Secret HTTP/1.1
  2. Host: localhost:5000
  3. Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoidGVzdCIsImV4cCI6MTYxODI3MzYwNSwiaXNzIjoiWW91ciJJc3N1ZXIiLCJhdWQiOiJZb3VyQXV0aGVudGljYXRpb24ifQ.6_3QXxZ3VzZvjZ7RnV5NQz-7y_93fY0Y7Y6jV7-XzQ
复制代码
确保在实际应用中实现安全的用户验证逻辑,并且不要在代码中硬编码敏感信息。别的,根据你的详细需求,可能还必要实现用户注册、Token革新等功能
核心概念和留意事项


  • 安全性:确保密钥(Jwt:Key)的安全性,不要在源代码中硬编码密钥。可以使用环境变量或更安全的密钥管理系统。
  • Token 有效期:Token 的有效期设置为 30 分钟(在示例中),可以根据必要调整。确保在生产环境中合理设置 Token 的有效期,制止安全风险。
  • 用户验证:示例中简单地硬编码了用户名和密码以展示验证逻辑。在实际应用中,应更换为数据库或其他存储系统中的用户验证逻辑。
  • 授权控制:通过 [Authorize] 特性掩护必要身份验证的控制器或操作。可以使用 [Authorize(Roles = "Admin")] 等特性实现基于角色的访问控制。
  • 错误处置惩罚:处置惩罚可能的错误情况,例如无效的 Token、过期的 Token 等,以进步用户体验和系统安全性。
  • 跨域请求:如果必要支持跨域请求,请确保正确设置 CORS(跨域资源共享),以允许来自不同域的请求。
总结

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表