当前位置:网站首页>. Net7 miniapi (special part):preview5 optimizes JWT verification (Part 2)
. Net7 miniapi (special part):preview5 optimizes JWT verification (Part 2)
2022-06-26 02:19:00 【Dotnet cross platform】
Preview5 There is no change in the way the policy is validated , Just built in Token Generation , and 《.NET6 And MiniAPI( Ten ): Authentication and authorization policy based 》 The verification method is basically the same , The validation parameters used for generation and validation should be consistent , By inheritance AuthorizationHandler For each request .
On the specific route , use RequireAuthorization("Permission") To configure the policy name , In order to achieve the requested steering verification .
Not much said , Look at the code implementation , Sure 《.NET6 And MiniAPI( Ten ): Authentication and authorization policy based 》 For comparison .
using Microsoft.AspNetCore.Authorization;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
#region Add policy validation parameters
builder.Authentication.AddJwtBearer(opt =>
{
opt.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("1234567890abcdefg")),
ValidateIssuer = true,
ValidIssuer = "http://localhost:5274",
ValidateAudience = true,
ValidAudience = "http://localhost:5274",
ClockSkew = TimeSpan.Zero,
RequireExpirationTime = true,
}; ;
});
// Add policy name and note and policy validation service
builder.Services
.AddAuthorization(options =>
{
// Add policy name
options.AddPolicy("Permission", policyBuilder => policyBuilder.AddRequirements(new PermissionRequirement()));
})
.AddSingleton(new List<Permission> { new Permission { RoleName = "admin", Url = "/Policy", Method = "get" } })
.AddSingleton<IAuthorizationHandler, PermissionHandler>();
var app = builder.Build();
// Sign in , Generate token
app.MapGet("/login", () =>
{
// use JWTSecurityTokenHandler Generate token
return new JwtSecurityTokenHandler().WriteToken(
new JwtSecurityToken(
issuer: "http://localhost:5274",
audience: "http://localhost:5274",
claims: new Claim[] {
new Claim(ClaimTypes.Role, "admin"),
new Claim(ClaimTypes.Name, " Gui Suwei ")
},
notBefore: DateTime.UtcNow,
expires: DateTime.UtcNow.AddSeconds(500000),
signingCredentials: new SigningCredentials(
new SymmetricSecurityKey(Encoding.ASCII.GetBytes("1234567890abcdefg")),
SecurityAlgorithms.HmacSha256)
)
);
});
app.MapGet("/policy", (ClaimsPrincipal user) => $"Hello user :{user.Identity?.Name}, role :{user.Claims?.Where(s => s.Type == ClaimTypes.Role).First().Value}. This is a policy!").RequireAuthorization("Permission");
app.Run();
#region Policy validation function
public class PermissionRequirement : IAuthorizationRequirement
{
}
// A collection of entities with permissions
public class Permission
{
public string? RoleName { get; set; }
public string? Url { get; set; }
public string? Method { get; set; }
}
// Permission verification class
public class PermissionHandler : AuthorizationHandler<PermissionRequirement>
{
private readonly List<Permission> _userPermissions;
public PermissionHandler(List<Permission> permissions)
{
_userPermissions = permissions;
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement)
{
if (context.Resource is DefaultHttpContext)
{
var httpContext = context.Resource as DefaultHttpContext;
var questPath = httpContext?.Request?.Path;
var method = httpContext?.Request?.Method;
var isAuthenticated = context?.User?.Identity?.IsAuthenticated;
if (isAuthenticated.HasValue && isAuthenticated.Value)
{
var role = context?.User?.Claims?.SingleOrDefault(s => s.Type == ClaimTypes.Role)?.Value;
if (_userPermissions.Where(w => w.RoleName == role && w.Method?.ToUpper() == method?.ToUpper() && w.Url?.ToLower() == questPath).Count() > 0)
{
context?.Succeed(requirement);
}
else
{
context?.Fail();
}
}
}
return Task.CompletedTask;
}
}
#endregion边栏推荐
- VTK initialization code learning 1
- Consumer of microservices
- Prompt to update to the latest debug version during vscode debugging
- The first intimate contact of caching technology
- 为 ServiceCollection 实现装饰器模式
- 哪个证券公司手机股票开户更好更安全?
- .NET7之MiniAPI(特别篇) :Preview5优化了JWT验证(下)
- Wechat applet
- 图形渲染管线
- Use of static library and dynamic library
猜你喜欢

Exploring temporary information for dynamic network embedding

Jenkins localization and its invalid solution

Largeur d'abord traversée basée sur la matrice de contiguïté

Eureka注册信息配置备忘

CVPR2022 | 长期行动预期的Future Transformer

Ardiuno smart mosquito racket

SQL column value to row value (unpivot)

基于邻接表的广度优先遍历

V4l2+qt video optimization strategy

In depth good article: what is supernetting?
随机推荐
How to improve code execution efficiency with arm pipeline
Disruptor (I) sequence
Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) D. Felicity‘s Big Secret Revealed
短信插件哪个好用万能表单需要发短信着急测试
连接投影仪
cv==biaoding---open----cv001
MySQL doit maîtriser 4 langues!
Output Lua print to the cocos2d console output window
leetcode 300. Longest increasing subsequence (medium)
Breadth first traversal based on adjacency matrix
跨平台应用开发进阶(二十三) :一文走近 testflight 上架
Redis6.0新特性——ACL(权限控制列表)实现限制用户可执行命令和KEY
Implementation of image binary morphological filtering based on FPGA -- Corrosion swelling
创建OpenGl窗口
【缺陷检测】基于matlab GUI印刷电路板自动缺陷检测【含Matlab源码 1912期】
leetcode 300. Longest Increasing Subsequence 最长递增子序列 (中等)
Raspberry pie + AWS IOT Greengrass
Unexpected output super efficiency SBM model matlab code
Keda 2.7.1 brief analysis of scaledjob code
基于邻接矩阵的广度优先遍历