Authentication(认证) 和 Authorization(授权)傻傻分不清楚
1.注册中配置认证,添加JWThelper 认证 .添加授权验证
2.swagger 添加token 配置
1.添加JWT 认证
(注意你的包的版本信息 需要选择6.*)
前提需要安装unget 包Microsoft.AspNetCore.Authentication.JwtBearer
在你的appsetting.json 添加如下配置(注意你的Secretkey,需要一定的长度才能获取到256位)
"Jwt": {
"SecretKey": "****************************",
"Issuer": "WebAppIssuer",
"Audience": "WebAppAudience"
}
然后在你的注册器里添加如下代码
var configuration = builder.Configuration;
builder.Services.AddAuthentication(option =>
{
option.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = true,
ValidIssuer= configuration["Jwt:Issuer"],
ValidateAudience = true,
ValidAudience = configuration["Jwt:Audience"], //订阅人Audience
ValidateIssuerSigningKey = true, //是否验证SecurityKey
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["Jwt:SecretKey"])), //SecurityKey
ValidateLifetime = true, //是否验证失效时间
ClockSkew = TimeSpan.FromSeconds(30), //过期时间容错值,解决服务器端时间不同步问题(秒)
RequireExpirationTime = true,
};
});
builder.Services.AddSingleton(new JwtHelper(configuration));
这里就需要的 jwthelper 去处理的认证 根据自己的需求 定义角色 用户信息。如下简单,过期时间为一个小时。token 里添加头 注意是Bearer
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
namespace **************
{
public class JwtHelper
{
private readonly IConfiguration _configuration;
public JwtHelper(IConfiguration configuration)
{
_configuration = configuration;
}
public string CreateToken()
{
// 1. 定义需要使用到的Claims
var claims = new[]
{
new Claim(ClaimTypes.Name, "u_admin"), //HttpContext.User.Identity.Name
new Claim(ClaimTypes.Role, "r_admin"), //HttpContext.User.IsInRole("r_admin")
new Claim(JwtRegisteredClaimNames.Jti, "admin"),
new Claim("Username", "Admin"),
new Claim("Name", "超级管理员")
};
// 2. 从 appsettings.json 中读取SecretKey
var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"]));
// 3. 选择加密算法
var algorithm = SecurityAlgorithms.HmacSha256;
// 4. 生成Credentials
var signingCredentials = new SigningCredentials(secretKey, algorithm);
// 5. 根据以上,生成token
var jwtSecurityToken = new JwtSecurityToken(
_configuration["Jwt:Issuer"], //Issuer
_configuration["Jwt:Audience"], //Audience
claims, //Claims,
DateTime.Now, //notBefore
DateTime.Now.AddHours(1), //expires
signingCredentials //Credentials
);
// 6. 将token变为string
var token = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken);
token = "Bearer " + token;
return token;
}
}
}
接着 根据自身要求 生成一个认证token,验证token及授权[Authorize] 过滤器
[HttpGet]
public ActionResult<string> GetToken()
{
return _jwtHelper.CreateToken();
}
[Authorize]
[HttpGet]
public ActionResult<string> GetTest()
{
return "Test Authorize";
}
可以通过 postman 验证 为了方便操作 在swagger添加 授权就可以在浏览器里调试测试
2.swagger 添加token 配置
VS 2022 自带的注册器不带 如下配置
builder.Services.AddSwaggerGen(); 替换如下代码
配置Swagger,添加一个安全定义并应用到每个路由。
builder.Services.AddSwaggerGen(options =>
{
// 添加安全定义
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey,
Scheme = "Bearer" // 注意 "Bearer" 必须使用大写 "B"
});
// 添加全局的安全要求
options.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
}
},
new string[] {}
}
});
});
app.UseSwagger();
app.UseSwaggerUI(); 这个代码里是不带配置授权,这样页面里就没有地方让你输入token。
我们需要在使用swaggerUI时添加一些配置 如下
app.UseSwaggerUI(
options =>{
// 指定Swagger JSON端点
options.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
// 如果你想要在Swagger UI上隐藏这个选项,可以不添加下面这行代码
options.OAuthClientId(value: "swagger"); //default clientId
options.OAuthAppName("My API");
});
这样你的调试页面里将有输入token的地方。
参考如下文档
版权归原作者 � HW� 所有, 如有侵权,请联系我们删除。