ASP.NET WebApi 基于JWT实现Token签名认证(发布版)

时间: 2023-06-20 18:07:42 浏览: 285

首先,我们需要安装 Microsoft.AspNet.WebApiMicrosoft.Owin.Security.Jwt NuGet 包。

接下来,我们需要在 WebApiConfig.cs 文件中配置 Web API 路由:

public static void Register(HttpConfiguration config)
{
    // 配置路由
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

    // 配置 JWT 认证
    ConfigureJwtAuth(config);
}

然后,我们需要在 Web.config 文件中配置 JWT 令牌的密钥和有效期:

<appSettings>
  <add key="jwtSecret" value="my_secret_key" />
  <add key="jwtExpireDays" value="7" />
</appSettings>

接下来,我们需要创建一个 JwtAuthManager 类来管理 JWT 认证:

using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;

public class JwtAuthManager : IJwtAuthManager
{
    private readonly string _jwtSecret;
    private readonly double _jwtExpireDays;

    public JwtAuthManager(string jwtSecret, double jwtExpireDays)
    {
        _jwtSecret = jwtSecret;
        _jwtExpireDays = jwtExpireDays;
    }

    public string GenerateToken(IEnumerable<Claim> claims)
    {
        var key = Encoding.ASCII.GetBytes(_jwtSecret);
        var jwtToken = new JwtSecurityToken(
            claims: claims,
            expires: DateTime.Now.AddDays(_jwtExpireDays),
            signingCredentials: new SigningCredentials(
                new SymmetricSecurityKey(key),
                SecurityAlgorithms.HmacSha256Signature)
        );
        var token = new JwtSecurityTokenHandler().WriteToken(jwtToken);
        return token;
    }
}

然后,我们需要创建一个 JwtAuthAttribute 特性,用于在控制器或操作方法上应用 JWT 认证:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class JwtAuthAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        try
        {
            var token = actionContext.Request.Headers.Authorization.Parameter;
            var jwtAuthManager = actionContext.ControllerContext.Configuration
                .DependencyResolver.GetService(typeof(IJwtAuthManager)) as IJwtAuthManager;
            var principal = jwtAuthManager.ValidateToken(token);
            Thread.CurrentPrincipal = principal;
            HttpContext.Current.User = principal;
        }
        catch (Exception)
        {
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
            return;
        }

        base.OnAuthorization(actionContext);
    }
}

最后,我们需要在 ConfigureJwtAuth 方法中注册依赖项并配置 JWT 认证:

private static void ConfigureJwtAuth(HttpConfiguration config)
{
    var jwtSecret = ConfigurationManager.AppSettings["jwtSecret"];
    var jwtExpireDays = double.Parse(ConfigurationManager.AppSettings["jwtExpireDays"]);

    var container = new UnityContainer();
    container.RegisterType<IJwtAuthManager, JwtAuthManager>(
        new InjectionConstructor(jwtSecret, jwtExpireDays));
    config.DependencyResolver = new UnityResolver(container);

    config.Filters.Add(new JwtAuthAttribute());
}

现在,我们可以在控制器或操作方法上应用 JwtAuth 特性来启用 JWT 认证:

[RoutePrefix("api/products")]
public class ProductsController : ApiController
{
    [HttpGet]
    [Route("")]
    [JwtAuth]
    public IHttpActionResult Get()
    {
        // ...
    }

    [HttpGet]
    [Route("{id}")]
    [JwtAuth]
    public IHttpActionResult Get(int id)
    {
        // ...
    }

    [HttpPost]
    [Route("")]
    [JwtAuth]
    public IHttpActionResult Post([FromBody] Product product)
    {
        // ...
    }

    // ...
}

这样,我们就成功地基于 JWT 实现了 Token 签名认证。

阅读全文
向AI提问 loading 发送消息图标

相关推荐

大家在看

recommend-type

PT650D称重显示器在配料秤中的应用

pt650D是珠海志美公司生产,采用最新的如下: Deha—si鲫a芯片生产,以达到高精度及快速的转换 效果,具有三路标准光耦输入口,峰,谷值保持功 能,高低限位有滞后开关功能。PT650D采用模块化 设计可根据需要选择高低限位,Rs232,Rs:485通讯 功能,单一物料配料软件等多项模块功能进行组合。 放大调校可以通过输入间距电压的方式进行
recommend-type

一类具有连续分布时滞的分布参数系统的反馈控制

针对一类同时具有变时滞和连续分布时滞的分布参数系统的状态反馈控制问题进行了研究, 通过选择适当的Lyapunov-Krasovskii 函数, 采用线性矩阵不等式(LMI) 方法, 得到了变时滞闭环系统渐近稳定的一个充分条件. 设计了无记忆的状态反馈控制器, 使得在一个正定矩阵存在的条件下, 闭环系统是可镇定的, 从而得到了常时滞分布参数系统可镇定的一个推论. 最后, 通过一个数值仿真例子说明了所给出设计方法的可行性和有效性.
recommend-type

BCM 56XX SDK 编程手册

Broadcom SDK 5.6 平台指南,关于SDK编译方法、步骤的编程手册,是学习了解Broadcom SDK的很有用的参考手册
recommend-type

C# Socket 实现的淘宝秒杀器(抢拍器)

C# Socket 实现的淘宝秒杀器(抢拍器)
recommend-type

115网盘 v4.0.0.55 官方正式免费版.zip

115网盘,云端存取,文件同步只在弹指间。 云端存取:随时随地访问115的所有文件,上传、下载、分享、文件操作,一个不能少 断点续传:上传下载支持断点续传 即拍即传:拍照、录音、录像,把随手拍摄记录的文件保存到网盘 在线阅读:保存在网盘的图片、音乐、视频、文档等可以直接调用手机内的程序来浏览阅读。

最新推荐

recommend-type

ASP.Net Core3.0中使用JWT认证的实现

在本文中,我们将深入探讨如何在ASP.NET Core 3.0中实现JWT(JSON Web Tokens)认证,这是一种轻量级的安全身份验证机制。 JWT认证允许服务器通过向客户端发送一个令牌来确认其身份,而不需要在后续请求中携带任何...
recommend-type

ASP.NET MVC使用ActionFilterAttribute实现权限限制的方法(附demo源码下载)

在ASP.NET MVC框架中,ActionFilterAttribute是一种强大的工具,它允许开发者定义自定义的行为来扩展MVC控制器的行为。本文将深入探讨如何利用ActionFilterAttribute实现权限限制,以便控制用户访问特定的控制器或...
recommend-type

详解使用JWT实现单点登录(完全跨域方案)

JSON Web Token(JWT)是一种流行的轻量级身份验证和授权机制,常用于实现单点登录(Single Sign-On, SSO)系统,特别是在完全跨域的场景下。JWT允许用户在多个相关应用或服务之间共享认证信息,而无需多次登录。...
recommend-type

ffmpeg 的视频格式转换 c# win10

ffmpeg 的视频格式转换 c# win10
recommend-type

WPF实现左右滑动切换图片的小程序

在探讨如何利用WPF(Windows Presentation Foundation)实现滑动条更换图片的功能时,首先需要对WPF的基本概念和相关技术有所了解。 WPF是一个用于开发Windows桌面应用程序的UI框架,它允许开发者利用XAML(可扩展应用程序标记语言)创建界面,并结合.NET框架进行编程。WPF的核心优势在于其丰富的视觉效果、数据绑定能力、可扩展性和硬件加速。它支持复杂的视觉设计和丰富的交互性,非常适合进行复杂的用户界面设计。 ### 1. XAML与C#结合使用 实现WPF滑动条换图片的基本思路是,使用XAML定义界面布局,将滑动条(Slider)控件和图片显示控件(例如Image)放置于界面上,并利用C#代码实现滑动条值改变时触发的事件处理逻辑,从而达到更换图片的目的。 ### 2. 控件介绍 **Slider控件**: 在WPF中,Slider控件用于创建滑动条。它具有Minimum、Maximum、Value等属性,分别代表滑动条的最小值、最大值和当前值。通过设置这些属性,开发者可以定义滑动条的范围和用户可选择的值。 **Image控件**: Image控件用于显示图片。它有一个Source属性,可以通过设置该属性来指定显示的图片。Source属性可以接受多种类型的值,例如bitmap、png等格式的图片文件。 ### 3. 实现逻辑 要实现滑动条更换图片的功能,核心步骤如下: 1. **准备图片资源**: 将需要显示的图片放入项目的文件夹中,并在项目中建立一个图片资源列表,例如一个数组或列表,里面存放所有图片文件的相对路径或绝对路径。 2. **设置Slider控件的属性**: 需要确保Slider控件的Minimum属性设置为0,Maximum属性设置为图片数量减1(即图片索引的上限)。这样,滑动条的值就可以对应到数组索引。 3. **绑定事件处理逻辑**: 将Slider的Value属性通过数据绑定与图片索引相绑定。当滑动条的值发生变化时(即用户拖动滑动条时),会触发一个事件处理函数。 4. **图片更换逻辑**: 在事件处理函数中,根据滑动条的Value属性值来选择图片。将当前图片路径设置到Image控件的Source属性中。这里需要确保索引不会越界,即在图片总数范围内。 5. **异常处理**: 在图片路径设置之前,应进行判断,确保路径有效,避免程序因为无法找到文件而异常退出。可以进行异常捕获或者预先检查路径是否存在。 ### 4. 示例代码 以下是一个简化的C#代码示例,用于说明如何在WPF中实现滑动条更换图片的基本逻辑: ```csharp // 假设有一个图片数组 string[] imagePaths = new string[] { "image1.png", "image2.png", ... }; private void Slider_Loaded(object sender, RoutedEventArgs e) { // 与滑动条的Maximum属性绑定 this.Slider.Value = imagePaths.Length - 1; } private void Slider_SelectionChanged(object sender, SelectionChangedEventArgs e) { // 确保值在有效范围内 if (this.Slider.Value >= 0 && this.Slider.Value < imagePaths.Length) { // 设置图片源 ImageControl.Source = new BitmapImage(new Uri(imagePaths[(int)this.Slider.Value])); } else { // 处理异常情况 MessageBox.Show("图片索引超出范围"); } } ``` 在这个示例中,`Slider_Loaded`是滑动条加载完成时触发的事件处理函数,在该函数中设置了滑动条的最大值。`Slider_SelectionChanged`是滑动条值变化时触发的事件处理函数,在该函数中根据滑动条的值更换图片。 ### 5. 总结 使用WPF实现滑动条更换图片是一个结合XAML布局设计与C#后端逻辑处理的典型示例。通过理解WPF中的事件处理、数据绑定、异常处理等概念,并将这些知识应用到实际项目中,可以创建出美观且功能强大的桌面应用程序。在实际开发过程中,还需要考虑用户界面的美观性、操作的流畅性和异常的鲁棒性等因素,以提高用户体验。
recommend-type

【EasyX文本框性能提升秘籍】:专家级技巧优化交互体验

# 1. EasyX文本框概述及性能问题 在信息技术飞速发展的今天,用户界面(UI)的响应速度和视觉效果对于提升用户体验至关重要。EasyX 是一个轻量级的图形库,它提供了一系列丰富的接口以简化文本框等界面元素的创建和管理。尽管 EasyX 在易用性和轻量级方面具有优势,但其文本框组件在高性能应用场合中面临着诸多挑战,特别是当处
recommend-type

基于YOLOv8锥桶检测

<think>好的,用户想用YOLOv8实现锥桶检测。首先,我需要回忆YOLOv8的相关知识,知道它是Ultralytics维护的最新版本,相比YOLOv5可能有一些改进。用户之前可能了解过YOLOv5,现在想升级到v8,所以需要比较两者的差异,但重点还是放在实现步骤上。接下来,用户需要具体的教程,所以步骤要详细。首先,环境配置是基础,需要安装Ultralytics的库,可能还需要PyTorch和CUDA支持GPU加速。然后,数据准备是关键,用户可能需要收集锥桶的图片,标注成YOLO格式,也就是txt文件,每个对象一行,包括类别、中心坐标和宽高。这里要提醒用户注意数据集的划分,比如训练集、验证
recommend-type

多目标视频跟踪技术详解与粒子滤波应用

视频跟踪技术是计算机视觉和图像处理领域的一项核心技术,它涉及到从视频序列中自动检测和跟踪感兴趣目标(如人、车辆、动物等)。当提到“多目标跟踪”时,意味着系统可以同时跟踪视频中的多个目标,并将它们区分开来。这对于智能监控、人机交互、自动驾驶车辆等应用场景至关重要。 描述中提到的“实时效果还好”,这暗示了该视频跟踪系统具有较好的处理速度,能够快速响应视频中的变化,并且对多目标进行跟踪时的准确度和稳定性较高,这对于实际应用来说是非常重要的。实时跟踪能够为用户提供及时的反馈,这对于需要快速响应的应用场景尤为关键。 针对标签“视频跟踪 多目标”,以下是详细的知识点: 1. 多目标跟踪算法: - 目标检测:多目标跟踪的第一步是目标检测,即在视频帧中识别出所有的目标物体。常用的算法有YOLO(You Only Look Once)、SSD(Single Shot MultiBox Detector)、Faster R-CNN等。 - 跟踪算法:检测到目标后,需要使用特定算法进行跟踪。常见的跟踪算法有卡尔曼滤波、均值漂移、光流法、以及基于深度学习的方法如Siamese Networks、DeepSORT等。 - 数据关联:多目标跟踪的一个挑战是如何将一帧中的目标与之前帧中的目标正确对应,即解决数据关联问题。粒子滤波器(Particle Filter)是一种常用的解决方法。 2. 粒子滤波器(Particle Filter): 粒子滤波器是一种基于蒙特卡洛方法的递归贝叶斯滤波技术,它通过一组随机样本(粒子)来表示概率分布,每个粒子代表一个可能的系统状态。在多目标跟踪中,粒子滤波器能够根据视频帧中的观测数据来更新每个目标的状态估计。 粒子滤波器工作原理: - 初始化:为每个目标生成一组随机粒子,每个粒子代表一个可能的状态。 - 预测:根据系统的动态模型,对下一时刻每个粒子的状态进行预测。 - 更新:当新的观测数据到来时,对每个粒子的权重进行更新,权重反映了粒子代表的状态与实际观测的匹配程度。 - 重采样:根据粒子的权重进行重采样,去除权重较低的粒子,复制权重较高的粒子,从而得到新的粒子集。 - 输出:粒子集的均值或其他统计特性作为目标状态的估计。 3. 应用场景: - 智能监控:在安全监控中,需要实时跟踪视频中的人物或车辆,进行行为分析和异常检测。 - 人机交互:在增强现实或交互式游戏场景中,需要准确跟踪用户的身体部位或手部动作。 - 自动驾驶:自动驾驶车辆需要实时跟踪道路上的其他车辆、行人以及各种障碍物,以确保行车安全。 4. 技术挑战: - 目标遮挡:当目标被遮挡或部分遮挡时,正确地识别和跟踪目标变得困难。 - 目标交互:多目标之间的交互(如相交、相离)可能会对跟踪算法造成干扰。 - 算法效率:实时跟踪对算法的计算效率要求很高,需要在保持跟踪准确性的同时,降低算法的计算复杂度。 以上是基于给定文件信息的详细知识点。视频跟踪技术的多目标实时跟踪功能对众多行业提供了深远的影响,其发展也带来了对计算资源、算法优化等方面的挑战,这需要不断地研究和创新来解决。
recommend-type

【紧急!EasyX文本框问题速查手册】:快速定位与解决常见难题

# 1. EasyX文本框问题速查概述 在图形用户界面(GUI)编程中,文本框是一个基础且核心的组件,承担着与用户进行信息交互的主要任务。EasyX文本框作为一款简便的图形库,为文本交互提供了直观的解决方案。然而,在实际开发过程中,开发者经常遇到各种与文本框相关的问题,如绘制错误、布局不合理、输入处理不当等。本章将概述EasyX文本框
recommend-type

UInputComponent

<think>好的,我需要回答用户关于Unreal Engine中UInputComponent的实现和使用的问题。用户之前已经询问过SetupPlayerInputComponent的相关内容,现在想更深入了解UInputComponent的具体实现和解决相关问题。我需要结合之前的回答和用户提供的引用内容,但注意用户提到这些引用可能不直接相关,需要更多参考用户的上一次问题和我的回答。 首先,我需要回顾UInputComponent的基本功能。它是处理输入绑定的核心组件,负责将输入事件(如按键、鼠标动作)映射到游戏角色的函数。在之前的回答中,我提到了如何在角色类中重写SetupPlayerI
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部