手把手教你AspNetCore WebApi认证与授权的方法

前言

这几天小明又有烦恼了,之前给小红的接口没有做认证授权,直接裸奔在线上,被马老板发现后狠狠的骂了一顿,赶紧让小明把授权加上。赶紧Baidu一下,发现大家都在用JWT认证授权,这个倒是挺适合自己的。

什么是Token

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

什么是JWT

Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

JWT认证流程

从图中可以看出主要有两部分组成:1、获取Token,2、通过Token进行授权。

使用JWT认证

首先,安装JwtBearer包。

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer --version 3.1.0

接下来,定义一个配置类,我这里为了简单直接用常量代替了,你也可以放在配置文件中。

public class TokenParameter
{
 public const string Issuer = "深度码农";//颁发者
 public const string Audience = "深度码农";//接收者
 public const string Secret = "1234567812345678";//签名秘钥
 public const int AccessExpiration = 30;//AccessToken过期时间(分钟)
}

接下来,定义一个通过用户名和密码,获取Token的控制器。

[Route("api/oauth")]
[ApiController]
public class OAuthController : ControllerBase
{
 /// <summary>
 /// 获取Token
 /// </summary>
 /// <returns></returns>
 [HttpGet]
 [Route("token")]
 public ActionResult GetAccessToken(string username, string password)
 {
  //这儿在做用户的帐号密码校验。我这儿略过了。
  if (username != "admin" || password != "admin")
   return BadRequest("Invalid Request");

  var claims = new[]
  {
   new Claim(ClaimTypes.Name, username),
   new Claim(ClaimTypes.Role, ""),
  };

  var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(TokenParameter.Secret));
  var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
  var jwtToken = new JwtSecurityToken(TokenParameter.Issuer, TokenParameter.Audience, claims, expires: DateTime.UtcNow.AddMinutes(TokenParameter.AccessExpiration), signingCredentials: credentials);
  var token = new JwtSecurityTokenHandler().WriteToken(jwtToken);

  return Ok(token);
 }
}

接下来,添加Token身份认证到容器(Startup.ConfigureServices)。

services.AddAuthentication(x =>
{
 x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
 x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x =>
{
 x.RequireHttpsMetadata = false;
 x.SaveToken = true;
 x.TokenValidationParameters = new TokenValidationParameters
 {
  ValidateIssuerSigningKey = true,//是否调用对签名securityToken的SecurityKey进行验证
  IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(TokenParameter.Secret)),//签名秘钥
  ValidateIssuer = true,//是否验证颁发者
  ValidIssuer = TokenParameter.Issuer, //颁发者
  ValidateAudience = true, //是否验证接收者
  ValidAudience = TokenParameter.Audience,//接收者
  ValidateLifetime = true,//是否验证失效时间
 };
});

接下来,添加身份认证到中间件(Startup.Configure)。

app.UseAuthentication();//必须在app.UseAuthorization();之前

接下来,控制器需要授权控制的添加[Authorize]。

[HttpGet("{id}")]
[Authorize]
public async Task<ActionResult<Todo>> GetTodo(Guid id)
{
 var todo = await context.Todo.FindAsync(id);

 if (todo == null)
 {
  return NotFound();
 }

 return todo;
}

最后,我们测试一下接口,效果如下。

这时会返回401,因为身份认证没有通过,说明身份验证起效果了。

接下来我们访问一下GetAccessToken接口,拿到Token,在访问GetTodo接口时放入Token,我们可以看到访问成功了。

小结

目前为止,小明把授权认证搞定了,赶紧给马老板汇报工作去吧。当然这个授权认证还是非常简单的,还有很多等待的小伙伴们去发掘,比如如何自动刷新Token?如何强制Token失效?OAuth其他实现方式等等?大家如果有兴趣,让小明下次告诉你们。

到此这篇关于手把手教你AspNetCore WebApi认证与授权的方法的文章就介绍到这了,更多相关AspNetCore WebApi认证与授权内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • .net core webapi jwt 更为清爽的认证详解

    我的方式非主流,控制却可以更加灵活,喜欢的朋友,不妨花一点时间学习一下 jwt认证分为两部分,第一部分是加密解密,第二部分是灵活的应用于中间件,我的处理方式是将获取token放到api的一个具体的controller中,将发放token与验证分离,token的失效时间,发证者,使用者等信息存放到config中. 1.配置: 在appsettings.json中增加配置 "Jwt": { "Issuer": "issuer",//随意定义 &quo

  • 手把手教你AspNetCore WebApi认证与授权的方法

    前言 这几天小明又有烦恼了,之前给小红的接口没有做认证授权,直接裸奔在线上,被马老板发现后狠狠的骂了一顿,赶紧让小明把授权加上.赶紧Baidu一下,发现大家都在用JWT认证授权,这个倒是挺适合自己的. 什么是Token Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码. 什么是JWT Json web token (JWT),是为了在网

  • 手把手教你AspNetCore WebApi数据验证的实现

    前言 小明最近又遇到麻烦了,小红希望对接接口传送的数据进行验证,既然是小红要求,那小明说什么都得满足呀,这还不简单嘛. 传统验证 [HttpPost] public async Task<ActionResult<Todo>> PostTodo(Todo todo) { if (string.IsNullOrEmpty(todo.Name)) { return Ok("名称不能为空"); } context.Todo.Add(todo); await conte

  • 手把手教你用Django执行原生SQL的方法

    前言 Hey,各位小伙伴,这次怎么来玩一下,如何使用Django执行原生SQL. 我们都知道,Python在web界的扛把子--Django,可谓是集大成为统一,各种各样的插件.forms组件.model模型.Admin后台等等,后面我会专门出文章娓娓道来,反正就是一个字,NB. 本次就来学一下,如何在Django执行原生语句. 起因 在使用Django时,一般情况下,我们使用Django自带的model查询是没有问题的,基本能满足80%的问题 但是,但是,那20%就不要了吗???肯定不行哎,小

  • 手把手教你写一个spring IOC容器的方法

    本文分享自华为云社区<手把手教你写一个spring IOC容器>,原文作者:技术火炬手. spring框架的基础核心和起点毫无疑问就是IOC,IOC作为spring容器提供的核心技术,成功完成了依赖的反转:从主类的对依赖的主动管理反转为了spring容器对依赖的全局控制.今天就带大家手写一个spring IOC容器. 第0步(准备工作): (1)JDK1.8及java环境变量 (2)maven包及maven环境变量 (3)idea 第1步(创建项目,引入tomcat包) PS:由于该项目的作用

  • .NET Core支持Cookie和JWT混合认证、授权的方法

    目录 前言 Cookie认证 JWT认证 滑动过期思考扩展 总结 前言 为防止JWT Token被窃取,我们将Token置于Cookie中,但若与第三方对接,调用我方接口进行认证.授权此时仍需将Token置于请求头,通过实践并联系理论,我们继续开始整活!首先我们实现Cookie认证,然后再次引入JWT,最后在结合二者使用时联系其他我们可能需要注意的事项 Cookie认证 在startup中我们添加cookie认证服务,如下: services.AddAuthentication(options

  • 手把手教你用Java实现一套简单的鉴权服务

    前言 时遇JavaEE作业,题目要求写个简单web登录程序,按照老师的意思是用servlet.jsp和jdbc完成.本着要么不做,要做就要做好的原则,我开始着手完成此次作业(其实也是写实训作业的用户鉴权部分),而之前写项目的时候也有相关经验,这次正好能派上用场. 一.何为鉴权服务 引用百度百科的话说 鉴权(authentication)是指验证用户是否拥有访问系统的权利. 鉴权包括两个方面: 用户鉴权,网络对用户进行鉴权,防止非法用户占用网络资源. 网络鉴权,用户对网络进行鉴权,防止用户接入了非

  • 手把手教你实现Java第三方应用登录

    目录 什么是OAuth2.0 申请网站接入 创建SpringBoot应用 实现登录流程 大家在自己做项目的时候有没有想过实现一个第三方应用登录呢?类似这种: 本篇文章就来聊一聊该如何实现第三方应用登录. 什么是OAuth2.0 OAuth是一项协议,它为用户资源的授权提供了一个安全.开放而简易的标准,OAuth的授权不会使第三方触及到用户的账号信息(比如密码),因此OAuth是相对安全的.而OAuth2.0就是OAuth的延续,不过2.0更加关注客户端开发者的简易性. 申请网站接入 常见的第三方

  • ASP.NET Core 6.0 添加 JWT 认证和授权功能

    目录 序言 相关名词 认证(Authentication) 基本步骤 1 安装 Nuget 包 2 准备配置信息 3 添加服务 4 调用中间件 5 JwtHelper 类实现 6 控制器配置 7 测试调用 授权(Authorization) 相关标签(Attribute) 授权方式 1 Policy(策略) 2 Role(角色) 3 Scheme(方案) 3 定义权限项 4 实现 Requirement 5 实现授权处理程序 Handler 6 添加授权处理程序 7 添加授权策略 8 控制器配置

  • Android消息推送:手把手教你集成小米推送(附demo)

    前言 在Android开发中,消息推送功能的使用非常常见. 为了降低开发成本,使用第三方推送是现今较为流行的解决方案. 今天,我将手把手教大家如何在你的应用里集成小米推送 目录 1. 官方Demo解析 首先,我们先对小米官方的推送Demo进行解析. 请先到官网下载官方Demo和SDK说明文档 1.1 Demo概况 目录说明: DemoApplication类 继承自Application类,其作用主要是:设置App的ID & Key.注册推送服务 DemoMessageReceiver类 继承自

  • 手把手教你写一个微信小程序(推荐)

    需求 小程序语音识别,全景图片观看,登录授权,获取个人基本信息 一:基础框架 官方开发文档:https://developers.weixin.qq.com/miniprogram/dev/ (其实官方文档写的很清楚了) 1.跟着官方文档一步一步来,新建一个小程序项目就好 2.然后呢,毕竟默认的只是基本骨架,肌肉线条还是要自己填的 app.json 是当前小程序的全局配置 小程序的所有页面路径.界面表现.网络超时时间.底部 tab 需求一:底部tab,我们要像原生APP那样要有是三个常驻的按钮,

随机推荐