新闻中心

C#如何实现JWT(JSON Web Token)认证?ASP.NET Core Web API安全入门

2025-12-08
浏览次数:
返回列表
JWT是一种无状态的开放标准,用于安全传输用户信息,由Header、Payload、Signature三部分组成;在ASP.NET Core中,通过添加JwtBearer认证服务、配置TokenValidationParameters参数,并在登录接口生成令牌,实现API安全验证;使用[Authorize]特性保护接口,客户端在请求头携带Bearer Token进行身份验证。

c#如何实现jwt(json web token)认证?asp.net core web api安全入门

在ASP.NET Core Web API中实现JWT认证是保障接口安全的常见方式。它通过生成一个包含用户信息的加密令牌,让客户端在后续请求中携带该令牌进行身份验证,避免每次请求都登录。

什么是JWT?

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间以JSON格式安全地传输信息。一个JWT字符串通常由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),格式为 xxx.yyy.zzz

例如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT的优势在于无状态,服务端不需要存储会话信息,适合分布式系统和前后端分离架构。

配置JWT认证服务

Program.cs 中添加JWT认证配置:

安装NuGet包(若未安装):

Microsoft.AspNetCore.Authentication.JwtBearer

Program.cs 中配置服务:

var builder = WebApplication.CreateBuilder(args);

// 添加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 = 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();

确保这两个中间件在路由之后、控制器之前调用。

生成JWT令牌

创建一个简单的登录接口,在用户凭证验证通过后生成JWT令牌。

AdMaker AI AdMaker AI

从0到爆款高转化AI广告生成器

AdMaker AI 65 查看详情 AdMaker AI

示例Controller代码:

[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
    [HttpPost("login")]
    public IActionResult Login([FromBody] LoginModel model)
    {
        // 这里应验证用户名密码(可对接数据库或Identity)
        if (model.Username == "admin" && model.Password == "password")
        {
            var tokenHandler = new JwtSecurityTokenHandler();
            var key = Encoding.UTF8.GetBytes("your-very-secret-key-that-is-long-enough"); // 应从配置读取

            var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(new Claim[]
                {
                    new Claim(ClaimTypes.Name, model.Username),
                    new Claim(ClaimTypes.Role, "User") // 可扩展角色
                }),
                Expires = DateTime.UtcNow.AddHours(2),
                Issuer = "your-site.com",
                Audience = "users",
                SigningCredentials = new SigningCredentials(
                    new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256)
            };

            var token = tokenHandler.CreateToken(tokenDescriptor);
            var tokenString = tokenHandler.WriteToken(token);

            return Ok(new { Token = tokenString });
        }

        return Unauthorized();
    }
}

定义LoginModel:

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

保护API接口

使用 [Authorize] 特性标记需要认证的控制器或方法:

[Authorize]
[ApiController]
[Route("api/[controller]")]
public class SecureController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        var username = User.Identity.Name;
        return Ok(new { Message = $"Hello, {username}", Time = DateTime.Now });
    }
}

启动项目后,先调用 /api/auth/login 获取token,然后在后续请求的Header中添加:

Authorization: Bearer

如果token无效或过期,将返回401状态码。

配置JWT参数(推荐做法)

将JWT相关配置写入 appsettings.json

"Jwt": {
  "Key": "your-super-secret-key-must-be-long-enough-for-security",
  "Issuer": "your-site.com",
  "Audience": "users"
}

在代码中通过 builder.Configuration["Jwt:Key"] 读取,提高可维护性。

基本上就这些。只要配置好认证服务、生成token并正确传递,就能在ASP.NET Core中实现基础的JWT认证。实际项目中建议结合数据库验证用户、刷新token机制和更细粒度的权限控制。

以上就是C#如何实现JWT(JSON Web Token)认证?ASP.NET Core Web API安全入门的详细内容,更多请关注其它相关文章!


# 桃源软件网站建设  # 如何将  # 操作指南  # 身份验证  # 客户端  # 序列化  # 不需要  # 企业营销推广学会会长  # 网站建设老张  # 如何实现  # 建筑设计公司网站建设  # 重庆seo专业术语  # 网站建设策划方式有哪些  # 2017最新网站seo  # 天津本地网站排名优化  # 市场营销推广策略品牌分析  # 海南关键词排名优化服务  # 路由  # js  # json  # go  # app  # iis  # 后端  # mac  # ai  # word  # microsoft  # 状态码  # c#  # 安全传输  # .  # 令牌  # 是一种 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口  邮政快递包裹最新位置 邮政快递实时追踪入口  印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】  qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  必由学官方平台入口 必由学在线课堂登录地址  J*aScript中赋值与自增运算符的复杂交互与执行机制  Go语言中的*string:深入理解字符串指针  苹果手机如何防止被恶意App追踪  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  如何仅使用CSS更改登录界面背景图像图标的颜色  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  内存疯狂猛猛涨价:主板销量直接腰斩!  jQuery Mask 插件中实现电话号码固定前导零的教程  AO3镜像入口大全 AO3网页版内容访问全集  Fabric模组开发:自定义物品与物品组的现代管理方法  AO3最新镜像入口 Archive of Our Own官方平台访问  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  Golang如何使用const iota_Go iota常量计数器讲解  J*aScript中针对特定容器内图片动画的实现教程  C++指针和引用有什么区别_C++内存管理核心概念深度解析  谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示  MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId  Golang如何安装Swagger工具_GoSwagger文档生成环境  天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】  Python字典中优雅地迭代剩余元素的方法  处理动态列数据:J*a ArrayList的正确初始化与字符累加教程  漫蛙网页登录入口 漫蛙漫画官方授权网址  Win11网速慢怎么解决 Win11网络设置优化解除限速  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  Go语言中对Map值调用带指针接收者方法:原理与最佳实践  Tabulator表格日期时间排序问题及自定义解决方案  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录  vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法  php源码怎么看淘宝客系统_看php源码淘宝客系统技巧  AO3官网镜像链接 Archive of Our Own同人文在线浏览  Go语言中动态执行代码字符串的策略与实践  J*aScript DOM操作:高效清空列表元素的策略与实践  如何在CSS中使用visited与link控制链接颜色_visited link伪类配合  探索高级语言到原生C/C++的转译:挑战与内存管理策略  J*aScript中安全有效地处理localStorage字符串数据  KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法  知音漫客官网漫画下载_知音漫客网页版阅读记录  TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法  魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间 

搜索