Json Web Token(jwt)     

一种不错的身份验证及授权方案,与 Session 相反,Jwt 将用户信息存放在 Token 的 payload 字段保存在客户端,通过 RSA 加密的方式,保证数据不会被篡改,验证数据有效性。

详细请参考jwt.io。 我现在还是一枚小白,希望能帮助更多的小白成长。因此文章都是一些比较简单的使用过程,文字讲解较少,怕误人子弟。

小白成长为大牛过程:知其然而不知其所引然

再知其然而知其所引然

1. 开发环境如下

vs2017+ASP.NET MVC 5+.NET FrameWork4.5.2

2. 在nuget上先添加封装了jwt使用的框架

因为环境是.NET FrameWork4.5.2   所以我采用3.0.1版本

 3.封装一个JWT帮助类

创建实体类  UserInfo

public string UserName { get; set; }

public string Pwd { get; set; }

    public class JwtHelp
{ //私钥 web.config中配置
//"GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk";
private static string secret = ConfigurationManager.AppSettings["Secret"].ToString(); /// <summary>
/// 生成JwtToken
/// </summary>
/// <param name="payload">不敏感的用户数据</param>
/// <returns></returns>
public static string SetJwtEncode(Dictionary<string, object> payload)
{ //格式如下
//var payload = new Dictionary<string, object>
//{
// { "username","admin" },
// { "pwd", "claim2-value" }
//}; IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
IJsonSerializer serializer = new JsonNetSerializer();
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder); var token = encoder.Encode(payload, secret);
return token;
} /// <summary>
/// 根据jwtToken 获取实体
/// </summary>
/// <param name="token">jwtToken</param>
/// <returns></returns>
public static UserInfo GetJwtDecode(string token)
{
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 userInfo = decoder.DecodeToObject<UserInfo>(token, secret, verify: true);//token为之前生成的字符串
return userInfo;
}
}
}

4.创建JwtController  生成jwtToken看看效果 

Get 请求需要改成这样

return Json(result,JsonRequestBehavior.AllowGet);

public class JwtController : Controller
{
// GET: Jwt
public ActionResult Index()
{
return View();
} /// <summary>
/// 创建jwtToken
/// </summary>
/// <param name="username"></param>
/// <param name="pwd"></param>
/// <returns></returns>
public ActionResult CreateToken(string username, string pwd)
{ DataResult result = new DataResult(); //假设用户名为"admin",密码为"123"
if (username == "admin" && pwd == "")
{ var payload = new Dictionary<string, object>
{
{ "username",username },
{ "pwd", pwd }
}; result.Token = JwtHelp.SetJwtEncode(payload);
result.Success = true;
result.Message = "成功";
}
else
{
result.Token = "";
result.Success = false;
result.Message = "生成token失败";
} return Json(result);
//get请求需要修改成这样
       //return Json(result,JsonRequestBehavior.AllowGet);
} }

5.我喜欢postMan测试神器   你值得拥有

 6.AuthorizeAttribute

接下来,我们需要编写有关权限控制及token解析有关的代码。

所有操作都在Home里面  将受限Action或Controller打上标签, 所有访问都想先权限验证通过后才能访问

编写一个继承AuthorizeAttribute实现类,根据实体类是否相等。

我先简单描述下程序执行过程

1.进入验证入口->验证核心代码->

1.返回false进入验证处理失败

2.返回true进入访问的controller/action里面

public class MyAuthorizeAttribute : AuthorizeAttribute
{
/// <summary>
/// 验证入口
/// </summary>
/// <param name="filterContext"></param>
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
} /// <summary>
/// 验证核心代码
/// </summary>
/// <param name="httpContext"></param>
/// <returns></returns>
protected override bool AuthorizeCore(HttpContextBase httpContext)
{ //前端请求api时会将token存放在名为"auth"的请求头中
var authHeader = httpContext.Request.Headers["auth"];
if (authHeader == null)
{
httpContext.Response.StatusCode = ;
return false;
} var userinfo = JwtHelp.GetJwtDecode(authHeader);
//举个例子 生成jwtToken 存入redis中
//这个地方用jwtToken当作key 获取实体val 然后看看jwtToken根据redis是否一样
if (userinfo.UserName == "admin" && userinfo.Pwd == "")
return true; httpContext.Response.StatusCode = ;
return false;
} /// <summary>
/// 验证失败处理
/// </summary>
/// <param name="filterContext"></param>
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{ base.HandleUnauthorizedRequest(filterContext);
if (filterContext.HttpContext.Response.StatusCode == )
{
filterContext.Result = new RedirectResult("/Error");
filterContext.HttpContext.Response.Redirect("/Home/Error");
}
}
}

使用postman  然后再Headers 地方将jswToken 传入进去

参考资料链接

https://www.cnblogs.com/lwhkdash/p/6686999.html

https://www.cnblogs.com/cnki/p/6297182.html

github下载链接  上述错误,请大家多多包涵。我还是一枚小白。

https://github.com/yaols/JWT.MvcDemo

jwt的ASP.NET MVC 身份验证的更多相关文章

  1. Asp.Net MVC 身份验证-Forms

    Asp.Net MVC 身份验证-Forms 在MVC中对于需要登录才可以访问的页面,只需要在对应的Controller或Action上添加特性[Authorize]就可以限制非登录用户访问该页面.那 ...

  2. Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码

    本问主要介绍asp.net的身份验证机制及asp.net MVC拦截器在项目中的运用.现在让我们来模拟一个简单的流程:用户登录>权限验证>异常处理 1.用户登录 验证用户是否登录成功步骤直 ...

  3. Asp.net Mvc身份验证

    1.安装组件 Microsoft.AspNet.Identity.Core,身份认证核心组件 安装Microsoft.AspNet.Identity.EntityFramework,EF实现身份认证 ...

  4. 转 asp.net mvc 身份验证中返回绝对路径的ReturnUrl

    原文:http://www.cnblogs.com/hyl8218/archive/2011/11/22/2259116.html 从HttpUnauthorizedResult的源码可以看出,Htt ...

  5. ASP.NET MVC 随想录——探索ASP.NET Identity 身份验证和基于角色的授权,中级篇

    在前一篇文章中,我介绍了ASP.NET Identity 基本API的运用并创建了若干用户账号.那么在本篇文章中,我将继续ASP.NET Identity 之旅,向您展示如何运用ASP.NET Ide ...

  6. 【MVC】ASP.NET MVC Forms验证机制

    http://www.cnblogs.com/bomo/p/3309766.html 随笔 - 121  文章 - 0  评论 - 92 [MVC]ASP.NET MVC Forms验证机制 ASP. ...

  7. ASP.NET Identity 身份验证和基于角色的授权

    ASP.NET Identity 身份验证和基于角色的授权 阅读目录 探索身份验证与授权 使用ASP.NET Identity 身份验证 使用角色进行授权 初始化数据,Seeding 数据库 小结 在 ...

  8. ASP.NET MVC Model验证(五)

    ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...

  9. ASP.NET MVC Model验证(四)

    ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...

随机推荐

  1. Python3 enumerate() 函数

    Python3 enumerate() 函数  Python3 内置函数 描述 enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标 ...

  2. 锁机制(Lock) 信号量机制(Semaphore) 事件机制(Event)

    IPC  进程间通信(inter-Process Communicate) 锁机制(Lock) l = Lock() 开启一个锁机制(实例化)   一把锁配一个钥匙 l.acquire()  获得钥匙 ...

  3. 6.ZigZag Conversion(Graph, traverse)

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  4. SQL时间格式化 转载备用~

    Sel1 取值后格式化{0:d}小型:如2005-5-6{0:D}大型:如2005年5月6日{0:f}完整型 2 当前时间获取 DateTime.Now.ToShortDateString 3 取值中 ...

  5. JS 图片切换

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="zzzz.aspx.cs&quo ...

  6. Adplus 抓取Crash Dump

    本实例在win8.1 安装window kits https://developer.microsoft.com/en-us/windows/hardware/windows-driver-kit 1 ...

  7. Java jdk 8 新特性

    list 统计(求和.最大.最小.平均) 第一种方式 int suma = listUsers.stream().map(e -> e.getAge()).reduce(Integer::sum ...

  8. 【转】MEF程序设计指南一:在应用程序中宿主MEF

    在应用程序中宿主MEF其实非常简单,只需要创建一个组合容器对象(CompositionContainer)的实例,然后将需要组合的部件(Parts)和当前宿主程序添加到容器中即可.首先需要添加MEF框 ...

  9. Ubuntu部分命令的使用简介

    1.查看USB设备 lsusb #查看系统中的usb设备 lsusb –v  #查看详细的usb设备信息 2.ubuntu mount u盘 第一步:查看U盘信息 sudo fdisk -l 得到类似 ...

  10. apache的错误日志分析