如何深入理解并精通ASP.NET Core 2.1中JWT的原理与应用?

2026-04-01 11:291阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计763个文字,预计阅读时间需要4分钟。

如何深入理解并精通ASP.NET Core 2.1中JWT的原理与应用?

在ASP.NET Core中,自定义JWT认证管理认证,基础内容如下:这相当常见,关键点在于中间件,只需将测试类中的自定义认证放到中间件中即可。

在aspnet core中,自定义jwt管道验证

有了上一节的内容作为基础,那这点也是非常容易的,关键点在中间件,只是把上一级在测试类中的自定义验证放到中间件中来即可,

不过需要注意:中间件 的位置很重要,只有它后面的管道才会收到影响;

那我们先建一个自定义中间件类:(中间件的详细内容这里就不讲了,大家可以参考官网和其他博文)

如何深入理解并精通ASP.NET Core 2.1中JWT的原理与应用?

/// <summary> /// 自定义授权中间件 /// </summary> public class JwtCustomerAuthorizeMiddleware { private readonly RequestDelegate next; public JwtCustomerAuthorizeMiddleware(RequestDelegate next, string secret, List<string> anonymousPathList) { #region 设置自定义jwt 的秘钥 if(!string.IsNullOrEmpty(secret)) { TokenContext.securityKey = secret; } #endregion this.next = next; UserContext.AllowAnonymousPathList.AddRange(anonymousPathList); } public async Task Invoke(HttpContext context, UserContext userContext,IOptions<JwtOption> optionContainer) { if (userContext.IsAllowAnonymous(context.Request.Path)) { await next(context); return; } var option = optionContainer.Value; #region 身份验证,并设置用户Ruser值 var result = context.Request.Headers.TryGetValue("Authorization", out StringValues authStr); if (!result || string.IsNullOrEmpty(authStr.ToString())) { throw new UnauthorizedAccessException("未授权"); } result = TokenContext.Validate(authStr.ToString().Substring("Bearer ".Length).Trim(), payLoad => { var success = true; //可以添加一些自定义验证,用法参照测试用例 //验证是否包含aud 并等于 roberAudience success = success && payLoad["aud"]?.ToString() == option.Audience; if (success) { //设置Ruse值,把user信息放在payLoad中,(在获取jwt的时候把当前用户存放在payLoad的ruser键中) //如果用户信息比较多,建议放在缓存中,payLoad中存放缓存的Key值 userContext.TryInit(payLoad["ruser"]?.ToString()); } return success; }); if (!result) { throw new UnauthorizedAccessException("未授权"); } #endregion #region 权限验证 if (!userContext.Authorize(context.Request.Path)) { throw new UnauthorizedAccessException("未授权"); } #endregion await next(context); } }

上面这个中间件中有个UserContext上线文,这个类主要管理当前用户信息和权限,其他信息暂时不管;我们先看一下这个中间件的验证流程如何:

该中间件主要是针对访问的路径进行验证,当然你也可以针对其他信息进行验证,比如(控制器名称,动作名称,等)

  • 检查当前url是否可以匿名访问,如果可以就直接通过,不做验证了;如果不是可以匿名访问的路径,那就继续
  • 获取当前docs.microsoft.com/zh-cn/aspnet/core/security/authorization/?view=aspnetcore-2.0

    下一章将讲解 用户,申明 ,角色的验证,并这些怎么在自定义的验证中实现,以便大家对他有个清晰的对比

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对易盾网络的支持。

本文共计763个文字,预计阅读时间需要4分钟。

如何深入理解并精通ASP.NET Core 2.1中JWT的原理与应用?

在ASP.NET Core中,自定义JWT认证管理认证,基础内容如下:这相当常见,关键点在于中间件,只需将测试类中的自定义认证放到中间件中即可。

在aspnet core中,自定义jwt管道验证

有了上一节的内容作为基础,那这点也是非常容易的,关键点在中间件,只是把上一级在测试类中的自定义验证放到中间件中来即可,

不过需要注意:中间件 的位置很重要,只有它后面的管道才会收到影响;

那我们先建一个自定义中间件类:(中间件的详细内容这里就不讲了,大家可以参考官网和其他博文)

如何深入理解并精通ASP.NET Core 2.1中JWT的原理与应用?

/// <summary> /// 自定义授权中间件 /// </summary> public class JwtCustomerAuthorizeMiddleware { private readonly RequestDelegate next; public JwtCustomerAuthorizeMiddleware(RequestDelegate next, string secret, List<string> anonymousPathList) { #region 设置自定义jwt 的秘钥 if(!string.IsNullOrEmpty(secret)) { TokenContext.securityKey = secret; } #endregion this.next = next; UserContext.AllowAnonymousPathList.AddRange(anonymousPathList); } public async Task Invoke(HttpContext context, UserContext userContext,IOptions<JwtOption> optionContainer) { if (userContext.IsAllowAnonymous(context.Request.Path)) { await next(context); return; } var option = optionContainer.Value; #region 身份验证,并设置用户Ruser值 var result = context.Request.Headers.TryGetValue("Authorization", out StringValues authStr); if (!result || string.IsNullOrEmpty(authStr.ToString())) { throw new UnauthorizedAccessException("未授权"); } result = TokenContext.Validate(authStr.ToString().Substring("Bearer ".Length).Trim(), payLoad => { var success = true; //可以添加一些自定义验证,用法参照测试用例 //验证是否包含aud 并等于 roberAudience success = success && payLoad["aud"]?.ToString() == option.Audience; if (success) { //设置Ruse值,把user信息放在payLoad中,(在获取jwt的时候把当前用户存放在payLoad的ruser键中) //如果用户信息比较多,建议放在缓存中,payLoad中存放缓存的Key值 userContext.TryInit(payLoad["ruser"]?.ToString()); } return success; }); if (!result) { throw new UnauthorizedAccessException("未授权"); } #endregion #region 权限验证 if (!userContext.Authorize(context.Request.Path)) { throw new UnauthorizedAccessException("未授权"); } #endregion await next(context); } }

上面这个中间件中有个UserContext上线文,这个类主要管理当前用户信息和权限,其他信息暂时不管;我们先看一下这个中间件的验证流程如何:

该中间件主要是针对访问的路径进行验证,当然你也可以针对其他信息进行验证,比如(控制器名称,动作名称,等)

  • 检查当前url是否可以匿名访问,如果可以就直接通过,不做验证了;如果不是可以匿名访问的路径,那就继续
  • 获取当前docs.microsoft.com/zh-cn/aspnet/core/security/authorization/?view=aspnetcore-2.0

    下一章将讲解 用户,申明 ,角色的验证,并这些怎么在自定义的验证中实现,以便大家对他有个清晰的对比

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对易盾网络的支持。