一、开发环境

VS2017  enterprise

win10 Pro 64

.net 4.6.2

二、开发过程

1、使用VS2017 创建.netframework项目,选择WebApi

2、从Nuget包中搜索并安装JWT

3、在Models中创建AuthInfo.cs、LoginRequest.cs、TokenInfo.cs三个类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;namespace apiToken.Models
{/// <summary>/// 身份验证信息 模拟JWT的payload/// </summary>public class AuthInfo{/// <summary>/// 用户名/// </summary>public string UserName { get; set; }/// <summary>/// 角色/// </summary>public List<string> Roles { get; set; }/// <summary>/// 是否管理员/// </summary>public bool IsAdmin { get; set; }/// <summary>/// 口令过期时间/// </summary>public DateTime? ExpiryDateTime { get; set; }}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;namespace apiToken.Models
{/// <summary>/// 登录用户信息/// </summary>public class LoginRequest{/// <summary>/// 用户名/// </summary>public string UserName { get; set; }/// <summary>/// 密码/// </summary>public string Password { get; set; }}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;namespace apiToken.Models
{/// <summary>/// 生成的口令信息/// </summary>public class TokenInfo{/// <summary>/// 是否成功/// </summary>public bool Success { get; set; }/// <summary>/// 令牌/// </summary>public string Token { get; set; }/// <summary>/// 错误信息/// </summary>public string Message { get; set; }}
}

4、在Controllers文件夹下创建TokenController.cs文件,生成口令

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using JWT;
using JWT.Algorithms;
using JWT.Serializers;
using apiToken.Models;
using System.Text;namespace apiToken.Controllers
{[RoutePrefix("api/Token")]public class TokenController : ApiController{/// <summary>/// 登录/// </summary>/// <param name="loginRequest"></param>/// <returns></returns>[HttpPost][Route("Login")]public TokenInfo Login([FromBody] LoginRequest loginRequest){TokenInfo tokenInfo = new TokenInfo();//需要返回的口令信息if (loginRequest != null){string userName = loginRequest.UserName;string passWord = loginRequest.Password;bool isAdmin = (userName == "admin")?true:false;//模拟数据库数据,真正的数据应该从数据库读取//身份验证信息AuthInfo authInfo = new AuthInfo { UserName=userName,Roles=new List<string> {"admin","commonrole"}, IsAdmin= isAdmin, ExpiryDateTime=DateTime.Now.AddHours(2)};const string secretKey = "Hello World";//口令加密秘钥try{byte[] key = Encoding.UTF8.GetBytes(secretKey);IJwtAlgorithm algorithm = new HMACSHA256Algorithm();//加密方式IJsonSerializer serializer = new JsonNetSerializer();//序列化JsonIBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();//base64加解密IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);//JWT编码var token = encoder.Encode(authInfo, key);//生成令牌//口令信息tokenInfo.Success = true;tokenInfo.Token = token;tokenInfo.Message = "OK";}catch(Exception ex){tokenInfo.Success = false;tokenInfo.Message = ex.Message.ToString();}}else{tokenInfo.Success = false;tokenInfo.Message = "用户信息为空";}return tokenInfo;}}
}

5、在项目中添加AuthAttributes文件夹,并且在文件夹在创建ApiAuthorizeAttribute.cs文件,用于创建身份拦截器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Http.Controllers;
using JWT;
using JWT.Serializers;
using apiToken.Models;
using System.Text;
using System.Net;
using System.Net.Http;namespace apiToken.AuthAttributes
{/// <summary>/// 身份认证拦截器/// </summary>public class ApiAuthorizeAttribute: AuthorizeAttribute{/// <summary>/// 指示指定的控件是否已获得授权/// </summary>/// <param name="actionContext"></param>/// <returns></returns>protected override bool IsAuthorized(HttpActionContext actionContext){//前端请求api时会将token存放在名为"auth"的请求头中var authHeader = from t in actionContext.Request.Headers where t.Key == "auth" select t.Value.FirstOrDefault();if (authHeader != null){const string secretKey = "Hello World";//加密秘钥string token = authHeader.FirstOrDefault();//获取tokenif (!string.IsNullOrEmpty(token)){try{byte[] key = Encoding.UTF8.GetBytes(secretKey);IJsonSerializer serializer = new JsonNetSerializer();IDateTimeProvider provider = new UtcDateTimeProvider();IJwtValidator validator = new JwtValidator(serializer, provider);IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);//解密var json = decoder.DecodeToObject<AuthInfo>(token, key, verify: true);if (json != null){//判断口令过期时间if (json.ExpiryDateTime < DateTime.Now){return false;}actionContext.RequestContext.RouteData.Values.Add("auth", json);return true;}return false;}catch (Exception ex){return false;}}}return false;}/// <summary>/// 处理授权失败的请求/// </summary>/// <param name="actionContext"></param>protected override void HandleUnauthorizedRequest(HttpActionContext actionContext){var erModel = new{Success="false",ErrorCode="401"};actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, erModel, "application/json");}/// <summary>///  为操作授权时调用/// </summary>/// <param name="actionContext"></param>//public override void OnAuthorization(HttpActionContext actionContext)//{//}}
}

6、创建UserInfoController.cs 用于测试身份验证

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using apiToken.AuthAttributes;
using Newtonsoft.Json;namespace apiToken.Controllers
{[RoutePrefix("api/UserInfo")][ApiAuthorize]public class UserInfoController : ApiController{/// <summary>/// 获取用户信息/// </summary>/// <returns></returns>[HttpGet][Route("GetUserInfo")]public string GetUserInfo(){var userInfo = new{UserName="test",Tel="123456789",Address="testddd"};return JsonConvert.SerializeObject(userInfo);}       }
}

最后将webapi接口在IIS中发布,通过PostMan进行测试

如果Token不正确或者Token失效则不会进入请求

注:如果遇到跨域的问题,可以下webconfig中做如下配置

想要更详细的了解Nuget中的JWT的使用,可通过此链接学习https://github.com/jwt-dotnet/jwt

需要源码程序可同学可通过此链接下载 https://download.csdn.net/download/liwan09/10769921

.Net WebAPI JWT身份验证相关推荐

  1. Asp.Net Core 5 REST API 使用 JWT 身份验证 - Step by Step(二)

    翻译自 Mohamad Lawand 2021年1月22日的文章 <Asp Net Core 5 Rest API Authentication with JWT Step by Step> ...

  2. angular jwt_Angular5 JWT身份验证(Spring Boot安全性)

    angular jwt 欢迎使用带有Spring Security的angular5 jwt身份验证.在本教程中,我们将在一个angular5单页应用程序中使用jwt身份验证创建一个全栈应用程序,该应 ...

  3. Angular5 JWT身份验证(Spring Boot安全性)

    欢迎使用带有Spring Security的angular5 jwt身份验证.在本教程中,我们将在一个angular5单页应用程序中使用jwt身份验证创建一个完整的堆栈应用程序,该应用程序具有由spr ...

  4. 带有GraphQL数据访问和JWT身份验证的.NET 5服务

    目录 介绍 服务如何运作? GraphQL的用法和优化 组成和结构 如何运行? 前提条件(对于Windows) 行动顺序 使用Playground的查询和变异 测验 结论 本文和代码说明了.NET 5 ...

  5. ASP.NET Core与Dapper和VS 2017使用JWT身份验证WEB API并在Angular2客户端应用程序中使用它

    目录 介绍 背景 步骤1 创建ASP.NET Core Web API项目 Fitness.JWT.API项目说明 使用代码 startup.cs JwtIssuerOptions.cs JwtCon ...

  6. c# WebApi之身份验证:Basic基础认证

    为什么需要身份认证 身份认证是为了提高接口访问的安全性,如果没有身份验证,那么任何匿名用户只要知道服务器的url,就可以随意访问服务器,从而访问或者操作数据库,这会是很恐怖的事. 什么是Basic基础 ...

  7. 用户登入身份验证,手机app登入身份验证,TokenAuth身份验证,JSON Web Token(JWT)身份验证

                                                                        JJWT身份验证 1.pom依赖: <dependency ...

  8. WebApi 登录身份验证

    前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个功能复杂的业务应用系统,通过角色授权来控制用户访问,本文通过Form认证,Mvc的Controller基类及Action的权 ...

  9. Vue路由之axios配置JWT身份验证

    前言: 认证和授权,其实吧简单来说就是:认证就是让服务器知道你是谁,授权就是服务器让你知道你什么能干,什么不能干(例如下面meta元信息),认证授权俩种方式:Session-Cookie与JWT,下面 ...

最新文章

  1. OpenCV中的特征匹配(Feature Matching)
  2. 解决了一个遗留的Portlet奇怪问题
  3. linux 查看 内存 占用,Linux终端:用smem查看内存占用情况
  4. I2C 总线原理与架构
  5. 【Flutter】Dart 技巧 ( 独立主函数入口 | 可空类型判定 | 默认值设定 )
  6. 学习《Hardware-Efficient Bilateral Filtering for Stereo Matching》一文笔记。
  7. centos7搭建时间服务器
  8. AVS264_FAQ集锦
  9. 实例应用 自定义页面taglib标签
  10. 对USB驱动程序的理解(1)
  11. java 替换回车换行符
  12. webpack——一站到底一
  13. Android消息推送(Android Push Notification)
  14. 模糊控制 MATLAB 仿真
  15. leetcode 718 最长公共子串
  16. 一种辅助整理WoS英文论文题录文档的方法(python-docx)
  17. 计算机 医学 sci期刊,医学临床研究方面2分的sci期刊
  18. LoadRunner “add measurements”(添加度量)菜单问题
  19. iphone开发笔记一 mac os 10.7.2安装与配置
  20. 软件测试好学吗?发展前景如何?

热门文章

  1. oracle 空间 链接,Oracle 自动段空间管理(ASSM:auto segment space management)
  2. windows--realvnc server的安装配置
  3. linux中root所属的组的gid为,linux用户和用户组
  4. idea 设置自动生成类和方法注释,TODO标记作者日期信息以及过滤自己所写标记
  5. LBP特征原理与人脸检测
  6. EGFR靶点药物研发进展-销售数据-上市药品前景分析
  7. Graph is finalized and cannot be modified
  8. Java 中的 PO、VO、DTO、BO、POJO、BO/DO、DAO
  9. 【地雷开荒技能搭配】
  10. 使用getJSON的同步异步问题