本文将带您了解关于如何在jwt授权的webapi上执行XUnit测试?的新内容,同时我们还将为您解释jwt接口鉴权的相关知识,另外,我们还将为您提供关于.Net5.0WebApi注册登录以及基于JWT
本文将带您了解关于如何在 jwt 授权的 web api 上执行 XUnit 测试?的新内容,同时我们还将为您解释jwt接口鉴权的相关知识,另外,我们还将为您提供关于.Net5.0 WebApi 注册登录以及基于JWT的简单身份认证与授权、.NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)、ASP.NET Core 2.0 Web API基于JWT自定义策略授权、Asp.net Core 3.1 Web API添加jwt验证(一):添加JwtToken控制API访问权限的实用信息。
本文目录一览:- 如何在 jwt 授权的 web api 上执行 XUnit 测试?(jwt接口鉴权)
- .Net5.0 WebApi 注册登录以及基于JWT的简单身份认证与授权
- .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)
- ASP.NET Core 2.0 Web API基于JWT自定义策略授权
- Asp.net Core 3.1 Web API添加jwt验证(一):添加JwtToken控制API访问权限
如何在 jwt 授权的 web api 上执行 XUnit 测试?(jwt接口鉴权)
有点晚,但在
var userModel = await res.Content.ReadAsAsync<User>();
ReadAsAsync
需要为 ReadAsStringAsync
.Net5.0 WebApi 注册登录以及基于JWT的简单身份认证与授权
- 新建一个API的项目
powershell中执行
dotnet new webapi
或者使用Visual Studio 2019
默认的模板已经配置了Swagger中间件,启用Swagger的验证功能,ConfigureServices方法中增加
services.AddSwaggerGen(c =>{ ... c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Id = "Bearer", Type = ReferenceType.SecurityScheme } }, Array.Empty<string>() } }); c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { Description = "Please enter into field the word ''Bearer'' followed by a space and the JWT value", Name = "Authorization", In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey });});
- 配置身份认证服务
- Configure方法
app.UseAuthorization()之前增加app.UseAuthentication();
- ConfigureServices方法
增加
services.AddAuthorization(options =>{ options.AddPolicy(JwtBearerDefaults.AuthenticationScheme, policy => { policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme); policy.RequireClaim(ClaimTypes.Name); policy.RequireRole(ClaimTypes.Role); });});services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Events = new JwtBearerEvents { OnTokenValidated = async context => { var userService = context.HttpContext.RequestServices.GetRequiredService<IUserService>(); var name = context.Principal.Identity.Name; var user = await userService.GetByNameAysnc(name); if (user == null) { context.Fail("Unauthorized"); } } }; options.TokenValidationParameters = new TokenValidationParameters { ValidateAudience = false, ValidateIssuer = false, ValidateActor = false, ValidateLifetime = true, IssuerSigningKey = UsersController.SecurityKey }; });
- 使用mssql数据库
- 引入依赖
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.0" /><PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets></PackageReference><PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.0" /><PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets></PackageReference>
- ConfigureServices方法
var sqlConnection = Configuration.GetConnectionString("SqlServerConnection");services.AddDbContext<WebAPIDBContent>(option => option.UseSqlServer(sqlConnection));
- 配置数据库
- 创建表
public class User{ [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } [Required, MaxLength(64)] public string UserName { get; set; } [Required, MaxLength(64)] public byte[] PasswordHash { get; set; } [Required, MaxLength(128)] public byte[] PasswordSalt { get; set; } [Required, MaxLength(20)] public string Phone { get; set; } [Required, MaxLength(20)] public string UserType { get; set; }}
- 创建数据库
public class WebAPIDBContent : DbContext{ public WebAPIDBContent(DbContextOptions<WebAPIDBContent> options) : base(options) { } public DbSet<User> Users { get; set; }}
- .迁移数据库
数据库连接配置:appsettings.json中增加
.........
.NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)
目录:
.NetCore WebApi——Swagger简单配置
.NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)
.NetCore WebApi —— Swagger版本控制
任何项目都有权限这一关键部分。比如我们有许多接口。有的接口允许任何人访问,另有一些接口需要认证身份之后才可以访问;以保证重要数据不会泄露。
关于JWT
维基百科上是这样定义的:
JWT(读作 [/dʒɒt/]),即JSON Web Tokens,是一种基于JSON的、用于在网络上声明某种主张的令牌(token)。JWT通常由三部分组成: 头信息(header), 消息体(payload)和签名(signature)。它是一种用于双方之间传递安全信息的表述性声明规范。JWT作为一个开放的标准(RFC 7519),定义了一种简洁的、自包含的方法,从而使通信双方实现以JSON对象的形式安全的传递信息。
认证的工作流程:
1. 客户端携带用户名、密码向授权服务申请 "令牌(token)"
2.授权服务器验证用户名、密码后根据它的身份生成一张专属的 "令牌" 并JWT的格式规范返回给客户端
3.客户端将获取到的令牌放入到http的请求头中,然后向资源服务器发起请求。服务器根据客户端发送过来的令牌来进行下一步处理(根据身份来响应客户端是否具有当前接口的权限)
如下图所示:
正文:
主要参考园友 在7楼 的这篇文章 https://www.cnblogs.com/RayWang/p/9536524.html
1. 启用Swagger的验证功能
在startup类中新添加红色部分代码。启动项目观察效果。
// 注册Swagger服务
services.AddSwaggerGen(c =>
{
// 添加文档信息
c.SwaggerDoc("v1", new Info
{
Title = "CoreWebApi",
Version = "v1",
Description = "ASP.NET CORE WebApi",
Contact = new Contact
{
Name = "Jee",
Email = "xiaomaprincess@gmail.com",
Url = "https://www.cnblogs.com/jixiaosa/"
}
});
#region 读取xml信息
// 使用反射获取xml文件。并构造出文件的路径
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
// 启用xml注释. 该方法第二个参数启用控制器的注释,默认为false.
c.IncludeXmlComments(xmlPath, true);
#endregion
#region 启用swagger验证功能
//添加一个必须的全局安全信息,和AddSecurityDefinition方法指定的方案名称一致即可,CoreAPI。
var security = new Dictionary<string, IEnumerable<string>> { { "CoreAPI", new string[] { } }, };
c.AddSecurityRequirement(security);
c.AddSecurityDefinition("CoreAPI", new ApiKeyScheme
{
Description = "JWT授权(数据将在请求头中进行传输) 在下方输入Bearer {token} 即可,注意两者之间有空格",
Name = "Authorization",//jwt默认的参数名称
In = "header",//jwt默认存放Authorization信息的位置(请求头中)
Type = "apiKey"
});
#endregion
});
没启动Swagger验证之前是这样的:
启用验证之后再看:多了个小按钮
点开之后是如下界面:文本框里要如输入从服务器获取的Token。格式为:Bearer + 空格+token。 Bearer可以看作是一个默认的规则。
2.生成token
.net core 内置了许多帮助类,巧妙的使用这些类组合,就可以生成我们想要的 token
新建一个tokenl类,编写一个方法来获取JWT字符串
/// <summary>
/// 生成JWT字符串
/// </summary>
public class Token
{
// 密钥,注意不能太短
public static string secretKey { get; set; } = "xiaomaPrincess@gmail.com";
/// <summary>
/// 生成JWT字符串
/// </summary>
/// <param name="tokenModel"></param>
/// <returns></returns>
public static string GetJWT(TokenModel tokenModel)
{
//DateTime utc = DateTime.UtcNow;
var claims = new List<Claim>
{
new Claim(JwtRegisteredClaimNames.Jti,tokenModel.ID.ToString()),
// 令牌颁发时间
new Claim(JwtRegisteredClaimNames.Iat, $"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}"),
new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}"),
// 过期时间 100秒
new Claim(JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddSeconds(100)).ToUnixTimeSeconds()}"),
new Claim(JwtRegisteredClaimNames.Iss,"API"), // 签发者
new Claim(JwtRegisteredClaimNames.Aud,"User") // 接收者
};
// 密钥
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var tokenHandler = new JwtSecurityTokenHandler();
JwtSecurityToken jwt = new JwtSecurityToken(
claims: claims,// 声明的集合
//expires: .AddSeconds(36), // token的有效时间
signingCredentials: creds
);
var handler = new JwtSecurityTokenHandler();
// 生成 jwt字符串
var strJWT = handler.WriteToken(jwt);
return strJWT;
}
}
基本信息类
public class TokenModel
{
/// <summary>
/// ID
/// </summary>
public int ID { get; set; }
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 手机
/// </summary>
public string Phone { get; set; }
/// <summary>
/// 邮箱
/// </summary>
public string Email { get; set; }
/// <summary>
/// 身份
/// </summary>
public string Sub { get; set; }
}
添加一个方法来获取token
/// <summary>
/// 获取令牌
/// </summary>
/// <param name="ID">ID</param>
/// <param name="name">账号</param>
/// <returns></returns>
[HttpPost]
public string GetJwt(int ID,string name)
{
TokenModel tokenModel = new TokenModel
{
ID = ID,
Name=name
};
return Token.GetJWT(tokenModel);
}
在Startup类中配置身份认证服务
(1)在ConfigureServices方法中注册服务
#region 添加验证服务
// 添加验证服务
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(o =>
{
o.TokenValidationParameters = new TokenValidationParameters
{
// 是否开启签名认证
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Token.secretKey)),
// 发行人验证,这里要和token类中Claim类型的发行人保持一致
ValidateIssuer = true,
ValidIssuer = "API",//发行人
// 接收人验证
ValidateAudience = true,
ValidAudience = "User",//订阅人
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero,
};
});
#endregion
(2)在Configure方法中启用验证中间件
// 启用Swagger中间件
app.UseSwagger();
// 配置SwaggerUI
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "CoreAPI");
c.RoutePrefix = string.Empty;
});
// 启用认证中间件
app.UseAuthentication();
app.UseMvc();
3. 添加一个测试测控制器来检测是否成功
注意要添加 [Authorize]标签
/// <summary>
/// 需要身份认证的控制器
/// </summary>
[Route("api/[controller]/[action]")]
[Produces("application/json")]
[ApiController]
[Authorize]// 添加授权特性
public class TestController : ControllerBase
{
/// <summary>
/// 认证通过之后可访问
/// </summary>
/// <returns></returns>
[HttpPost]
public ActionResult<TokenModel> Get(TokenModel tokenModel)
{
return new TokenModel{ ID=1 };
}
}
启动项目
测试一: 在没有获取token时访问此方法
返回401 身份验证未通过
测试二:先访问GetJWT接口获取token,在访问Test接口
最后将获取的token输入到Swagger的文本框中:Bearer +空格+Token
再次访问Test接口:成功返回数据
至此,一个简单身份认证加授权就完成了。
推荐一篇大神的文章 :讲述Claim的
理解ASP.NET Core验证模型(Claim, ClaimsIdentity, ClaimsPrincipal)不得不读的英文博文
源码:GitHub
https://github.com/xiaoMaPrincess/Asp.NetCore-WebApi
多层架构版本:
https://github.com/xiaoMaPrincess/.NetCoreWebApi
ASP.NET Core 2.0 Web API基于JWT自定义策略授权
总结
以上是小编为你收集整理的ASP.NET Core 2.0 Web API基于JWT自定义策略授权全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
Asp.net Core 3.1 Web API添加jwt验证(一):添加JwtToken控制API访问权限
创建项目
打开vs for mac,新建asp.net web api空项目
项目名称随便取,选择好存放位置,点创建
删除WeatherForecastController.cs以及WeatherForecast.cs
打开Properties/launchSettings.json,修改weatherforecast为/
添加依赖
打开Nuget包管理器,添加包 Microsoft.AspNetCore.Authentication.JwtBearer
添加配置
打开appsettings.json,添加token验证相关配置
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
// 添加Authentication节点
"Authentication": {
"Issure": "Bitbits.Inc",
"Audience": "LolipopClient",
"SecurityKey": "4C6A8A8B-1B9F-12E7-60C4-123BC0BB5D25"
}
}
注入Service
打开Startup.cs,修改ConfigureServices方法,添加service配置
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
// 添加下面配置信息
services.AddAuthentication(options =>
{
// 设置默认使用jwt验证方式
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
IConfigurationSection confSection = Configuration.GetSection("Authentication");
options.TokenValidationParameters = new TokenValidationParameters()
{
// 验证接收者
ValidateAudience = true,
// 验证发布者
ValidateIssuer = true,
// 验证过期时间
ValidateLifetime = true,
// 验证秘钥
ValidateIssuerSigningKey = true,
// 读配置Issure
ValidIssuer = confSection["Issure"],
// 读配置Audience
ValidAudience = confSection["Audience"],
// 设置生成token的秘钥
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(confSection["SecurityKey"]))
};
});
}
接下来修改Configure方法,添加Authorization、Authentication中间件
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
// 注意,这里的Authentication必须在Authorization上面
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
完整的Startup.cs如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.IdentityModel.Tokens;
namespace jwtTest
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddAuthentication(options =>
{
// 设置默认使用jwt验证方式
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
IConfigurationSection confSection = Configuration.GetSection("Authentication");
options.TokenValidationParameters = new TokenValidationParameters()
{
// 验证接收者
ValidateAudience = true,
// 验证发布者
ValidateIssuer = true,
// 验证过期时间
ValidateLifetime = true,
// 验证秘钥
ValidateIssuerSigningKey = true,
// 读配置Issure
ValidIssuer = confSection["Issure"],
// 读配置Audience
ValidAudience = confSection["Audience"],
// 设置生成token的秘钥
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(confSection["SecurityKey"]))
};
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
// 注意,这里的Authentication必须在Authorization上面
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
创建测试数据控制器
右键Controllers文件夹,新建类
选择ASP.NET Core,Web API控制器类,修改控制器名称后点击新建
打开刚刚新建的控制器类,删除红框选中内容
引入Microsoft.AspNetCore.Authorization,顺便修改写路由模板(图中箭头所指)并在控制器类中标注如下属性
Ps:这里的Authorize属性跟AllowAnonymous属性可以标注在方法或者类上面
完整的ValuesController.cs代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
// 引入下面这个包
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace jwtTest.Controllers
{
[Route("api/[controller]")]
// ApiController属性:框架自动注入参数校验、model类型推断等功能
[ApiController]
// Authorize属性:给控制器的所有动作加上权限验证,会跳过标注了AllowAnonymous的方法
[Authorize]
public class ValuesController : Controller
{
[HttpGet("noauth")]
// AllowAnonymous属性:标注了AllowAnonymous的方法不需要权限验证
[AllowAnonymous]
public string Get()
{
return "这个方法不需要权限校验";
}
[HttpGet("auth")]
public string Get2()
{
return "这个方法需要权限校验";
}
}
}
创建颁布JwtToken的控制器
新建AuthController
删除红框所示,并做上属性标注
添加AuthController构造函数跟IConfiguration依赖注入,代码如下:
添加Login方法,代码如下:
完整的AuthController.cs代码如下:
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
namespace jwtTest.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class AuthController : Controller
{
private IConfiguration _configuration { get; set; }
// 控制器注入Configuration依赖,方便获取appsettinfs.json中的SecurityKey
public AuthController(IConfiguration config)
{
_configuration = config;
}
[HttpGet("login")]
public ActionResult Login(string username, string password)
{
if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
{
// token中的claims用于储存自定义信息,如登录之后的用户id等
var claims = new[]
{
new Claim("userId", username)
};
// 获取SecurityKey
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration.GetSection("Authentication")["SecurityKey"]));
var token = new JwtSecurityToken(
issuer: _configuration.GetSection("Authentication")["Issure"], // 发布者
audience: _configuration.GetSection("Authentication")["Audience"], // 接收者
notBefore: DateTime.Now, // token签发时间
expires: DateTime.Now.AddMinutes(30), // token过期时间
claims: claims, // 该token内存储的自定义字段信息
signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256) // 用于签发token的秘钥算法
);
// 返回成功信息,写出token
return Ok(new { code = 200, message = "登录成功", data = new JwtSecurityTokenHandler().WriteToken(token) });
}
// 返回错误请求信息
return BadRequest(new { code = 400, message = "登录失败,用户名或密码为空" });
}
}
}
测试Token颁发功能
打开Postman,创建一个新的页面
在地址栏跟下面的请求表单处添加好相关参数
点击蓝色的Send按钮,底下会显示返回值
绿色框中显示的就是我们需要的token
测试API权限认证
新建一个Postman测试页面,填写好参数
先测试不需要权限认证的请求,结果如下:
接下来测试需要权限认证的请求,先不添加认证header
发送之后,获取返回值
接下来添加认证header,并再次发送请求
请求成功,返回了对应的请求体
至此,已经成功添加jwt权限控制
我们今天的关于如何在 jwt 授权的 web api 上执行 XUnit 测试?和jwt接口鉴权的分享就到这里,谢谢您的阅读,如果想了解更多关于.Net5.0 WebApi 注册登录以及基于JWT的简单身份认证与授权、.NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)、ASP.NET Core 2.0 Web API基于JWT自定义策略授权、Asp.net Core 3.1 Web API添加jwt验证(一):添加JwtToken控制API访问权限的相关信息,可以在本站进行搜索。
本文标签: