首页 > 其他分享 >NetCore JWT token

NetCore JWT token

时间:2023-03-04 09:45:21浏览次数:49  
标签:return NetCore JWT public token context var new options

在netcore中jwt使用场景很多,网上有很多的资料,这里不再累述,之后有机会会单独介绍,今天主要以实战为主。

1、create jwt token

 1 public interface IJwtTokenService
 2     {
 3         string GetJwtToken();
 4     }
 5 
 6     public class JwtTokenService : IJwtTokenService
 7     {
 8         private readonly IConfiguration _config;
 9         public JwtTokenService(IConfiguration config)
10         {
11             this._config = config;
12         }
13         public string GetJwtToken()
14         {
15             var claims = new List<Claim>()
16             {
17                 new Claim(JwtRegisteredClaimNames.Sub,"jwtsubvalue"),
18                 new Claim(JwtRegisteredClaimNames.Name,"jwtnamevalue"),
19                 new Claim("Scope","API"),
20                 new Claim("Role","Admin")
21             };
22             var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["JwtToken:SecretKey"]));
23             var credentials = new SigningCredentials(securityKey,SecurityAlgorithms.HmacSha256);
24             var issuer = _config["JwtToken:Issuer"];
25             var audience = _config["JwtToken:Audience"];
26             var expires = DateTime.Now.AddMinutes(Convert.ToDouble(_config["JwtToken:ExpiredMinutes"]));
27 
28             var jwtToken = new JwtSecurityToken(issuer, audience, claims: claims, notBefore: DateTime.Now, expires: expires, signingCredentials: credentials);
29             return new JwtSecurityTokenHandler().WriteToken(jwtToken);
30         }
31     }
jwt token

2、configuration中所需配置信息

1  "JwtToken": {
2     "SecretKey": "12345678901234567890123456789012",
3     "Issuer": "https://localhost:5000",
4     "Audience": "https://localhost:5000",
5     "ExpiredMinutes": 10
6   }

3、在Program中配置authentication

 1 var configuration = builder.Configuration;
 2 builder.Services.AddAuthentication(options =>
 3 {
 4     options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
 5     options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
 6 })
 7 .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
 8     {
 9         options.TokenValidationParameters = new TokenValidationParameters
10         {
11             ValidateIssuer = true,
12             ValidateAudience = true,
13             ValidateLifetime = true,
14             ValidateIssuerSigningKey = true,
15             ValidIssuer = configuration["JwtToken:Issuer"],
16             ValidAudience = configuration["JwtToken:Audience"],
17             IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["JwtToken:SecretKey"]))
18         };
19         options.Events = new JwtBearerEvents
20         {
21             OnTokenValidated = context =>
22             {
23                 var token = context.SecurityToken as JwtSecurityToken;
24                 var identity = context.Principal?.Identity as ClaimsIdentity;
25                 if (!string.IsNullOrEmpty(token?.Issuer))
26                     context.Success();
27                 else
28                     context.Fail($"Token invalid");
29                 return Task.CompletedTask;
30             },
31             OnAuthenticationFailed = context =>
32             {
33                 context.Fail(context.Exception);
34                 return Task.CompletedTask;
35             },
36             OnForbidden = context =>
37             {
38                 context.Fail("403 forbidden");
39                 return Task.CompletedTask;
40             },
41             OnChallenge = context =>
42             {
43                 var error = context.Error;
44                 return Task.CompletedTask;
45             },
46             OnMessageReceived = context =>
47             {
48                 var token = context.Token;
49                 return Task.CompletedTask;
50             }
51         };
52         //Configure authentication scheme forwarding to another scheme
53         options.ForwardDefaultSelector = context =>
54         {
55             if (context.Request.Headers.TryGetValue("x-api-type", out Microsoft.Extensions.Primitives.StringValues uiTokenType))
56                 return "CustomScheme";
57             return JwtBearerDefaults.AuthenticationScheme;
58         };
59     }).AddJwtBearer("CustomScheme", options =>
60     {
61         options.Authority = configuration["JwtToken:Issuer"];
62         options.TokenValidationParameters = new TokenValidationParameters
63         {
64             ValidateIssuer = true,
65             ValidIssuer = configuration["JwtToken:Issuer"]
66         };
67         options.Events = new JwtBearerEvents
68         {
69             OnTokenValidated = context =>
70             {
71                 context.Success();
72                 return Task.CompletedTask;
73             }
74         };
75     });
authentication

4、在请求管道中应用authentication

app.UseAuthentication();

5、添加测试controller,指定[Authorize] atrribute

 1 [Authorize]
 2         [HttpGet("all")]
 3         public IActionResult Get([FromServices] IConfiguration configuration)
 4         {
 5             return Ok(
 6                 new
 7                 {
 8                     ID = 1,
 9                     Name = "consul service",
10                     version = 1.0,
11                     serviceIP = configuration["ip"],
12                     servicePort = configuration["port"]
13                 });
14         }
test controller

通过swagger测试返回401

 

 6、swagger中authorize之后返回[Authorize] api controller,返回200

 

 

下面介绍下如何在swagger中支持authorize及api分组

 1 #region Swagger
 2 builder.Services.AddEndpointsApiExplorer();
 3 builder.Services.AddSwaggerGen(c => 
 4 {
 5     //c.IgnoreObsoleteActions();
 6     //c.TagActionsBy(api =>
 7     //{
 8     //    if (api.GroupName != null)
 9     //        return new[] { api.GroupName };
10     //    var controllerActionDescriptor = api.ActionDescriptor as ControllerActionDescriptor;
11     //    if (controllerActionDescriptor != null)
12     //        return new[] { controllerActionDescriptor.ControllerName };
13     //    throw new InvalidOperationException("Unable to determine tag for endpoint.");
14     //});
15     //c.DocInclusionPredicate((name, api) => api.GroupName == "demo1");
16 
17     c.SwaggerDoc("demo1", new OpenApiInfo { Title = "demo1", Description = "this is demo1 v1", Version = "demo1v1" });
18     c.SwaggerDoc("demo2", new OpenApiInfo { Title = "demo2", Description = "this is demo2 v1", Version = "demo2v1" });
19 
20     c.AddSecurityDefinition("bearerauth", new OpenApiSecurityScheme
21     {
22         Name = "Authorization",
23         Type = SecuritySchemeType.Http,
24         Scheme = "Bearer",
25         BearerFormat = "Bearer",
26         In = ParameterLocation.Header,
27         Description = "JWT Authorization header using the Bearer scheme."
28     });
29     c.AddSecurityRequirement(new OpenApiSecurityRequirement
30     {
31         {
32             new OpenApiSecurityScheme
33             {
34                 //Notes: this is for swagger authentication
35                 //Type= SecuritySchemeType.Http,
36                 //In= ParameterLocation.Header,
37 
38                 Reference=new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "bearerauth" }
39             },
40             new string[]{}
41         }
42     });
43 });
44 #endregion
swagger authorize & group
1 app.UseSwagger();
2 app.UseSwaggerUI(c =>
3 {
4     c.SwaggerEndpoint($"/swagger/demo1/swagger.json", "demo1");
5     c.SwaggerEndpoint($"/swagger/demo2/swagger.json", "demo2");
6 });
swagger group endpoint

接下来介绍Authorization Policy及custom policy

 1 builder.Services.AddAuthorization(options => 
 2 {
 3     var defaultPolicy = new AuthorizationPolicyBuilder();
 4     defaultPolicy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme);
 5     defaultPolicy.RequireAuthenticatedUser();
 6     options.DefaultPolicy = defaultPolicy.Build();
 7 
 8     options.AddPolicy("CustomScopePolicy", policy => 
 9     {
10         policy.RequireAuthenticatedUser();
11         policy.RequireClaim("Scope", "API");
12     });
13     options.AddPolicy("CustomRolePolicy", policy => 
14     {
15         policy.RequireAuthenticatedUser();
16         policy.RequireClaim("Role", "Admin");
17     });
18     options.AddPolicy("RoleScopePolicy", policy =>
19     {
20         policy.RequireAuthenticatedUser();
21         policy.AddRequirements(new CustomRequirement("admin"));
22     });
23 });
24 
25 builder.Services.AddTransient<IJwtTokenService, JwtTokenService>();
26 builder.Services.AddSingleton<IAuthorizationHandler, CustomRoleBaseAuthorizationHandler>();
27 builder.Services.AddSingleton<IAuthorizationHandler, CustomScopeBaseAuthorizationHandler>();
policy
app.UseAuthorization();
 1  public class CustomRoleBaseAuthorizationHandler : AuthorizationHandler<CustomRequirement>
 2     {
 3         protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomRequirement requirement)
 4         {
 5             var principal = context.User;
 6             var roleClaim = principal.Claims.FirstOrDefault(c => c.Type.Equals("Role", StringComparison.OrdinalIgnoreCase));
 7             if (roleClaim?.Value.Equals(requirement.Role, StringComparison.OrdinalIgnoreCase) ?? false)
 8                 context.Succeed(requirement);
 9             return Task.CompletedTask;
10         }
11     }
12 
13  public class CustomScopeBaseAuthorizationHandler : AuthorizationHandler<CustomRequirement>
14     {
15         protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomRequirement requirement)
16         {
17             var principal = context.User;
18             var claim = principal.Claims.FirstOrDefault(c => c.Type.Equals("Scope", StringComparison.OrdinalIgnoreCase));
19             if (claim?.Value.Equals("API", StringComparison.OrdinalIgnoreCase) ?? false)
20                 context.Succeed(requirement);
21             return Task.CompletedTask;
22         }
23     }
custom policy handler
1  public class CustomRequirement : IAuthorizationRequirement
2     {
3         public string Role { get; set; }
4         public CustomRequirement(string role)
5         {
6             Role = role;
7         }   
8     }
custom requirement

添加测试controller

 1 [HttpGet("v1"), Authorize(Policy = "RoleScopePolicy")]
 2         public IActionResult Index()
 3         {
 4             return new JsonResult(new List<string> { "group1", "group2" });
 5         }
 6 
 7         [HttpGet("v2"),Authorize(Policy = "CustomRolePolicy")]
 8         [ApiExplorerSettings(IgnoreApi = false)]
 9         public IActionResult IndexV2()
10         {
11             return new JsonResult(new List<string> { "group3", "group4" });
12         }
test controller

测试结果

 

 OK 搞定!

标签:return,NetCore,JWT,public,token,context,var,new,options
From: https://www.cnblogs.com/qindy/p/17100967.html

相关文章

  • NetCore Resource
    在netcore中resource的配置及应用1、创建resource资源文件   2、在容器中添加配置1builder.Services.AddLocalization(options=>options.ResourcesPath="......
  • 调用接口获得token_Jmeter篇--如何进行参数关联
    如下登录接口可以获取到tokencopy的时候记得用text,json可能有问题 方法一:正则表达式提取器1.   (.*?)括号左边和右边分别放左边界和有边界模板:储存对象的规......
  • docker下netcore内存dump
    一般开发阶段可以通过visualstudio来检查程序的内存、cup等的优化问题。vs下调试=》性能探查器,这里面大有千秋。但是好多内存问题是经过时间积累下来才暴露出来的,在生产......
  • 调用接口获得token_Postman篇--如何进行参数关联
    具体操作如下:1、点击右上角的小眼睛,在弹出的页面中输入环境变量名称对于需要关联获得的token值,初始值不填2.如下接口能够获取到token,在Tests中获取请求值,输入以下代码(......
  • jmeter跨线程组调用变量-以token为例
    跨线程组调用变量的解决方法:在beanshell取样器中使用setProperty函数设置全局变量,其他线程组用P函数调用全局变量 跨线程组调用变量的步骤:以token为例跨线程组调用有两......
  • 基础方式获取接口token鉴权码
      运行结果: 代码:classTestLoginApi:access_token=""session=requests.session()#通过session去关联deftest_get_token(self):print......
  • .net 使用Microsoft.IdentityModel.Tokens.Jwt进行身份认证
    .net使用Microsoft.IdentityModel.Tokens.Jwt进行身份认证2023-02-0408:23·opendotnet什么是JWTJWT(全称:JsonWebToken)是一个开放标准(RFC7519),它定义了一种......
  • 路飞-day3——路飞前端全局css,全局配置文件、配置axios实现前后台交互、安装vue-cooki
    目录一、路飞前端全局css,全局配置文件1.1整理项目1.2设置全局css1.3配置全局js二、配置axios实现前后台交互三、安装vue-cookies四、安装elementui五、安装bootstrap和j......
  • JWT
    用户使用账号和密码登录,调用后端登录接口后端验证用户身份,生成一个包含用户信息和其他数据的JSON对象,称为payload后端使用一个密钥对payload进行加密,生成一个字符串,称为......
  • session、token、cookie的区别
    session、token、cookie都是用于实现用户的鉴权和认证的技术,但是它们有以下几个区别:cookie是服务器发送给客户端的一小段数据,存储在客户端,每次请求同一网站时,浏览器会自......