asp.net core模块学习
一、配置管理
二、管道
三、认证与授权
四、MVCDemo
五、IdentityServer4
https://pan.baidu.com/s/15etE9CNfzDLCHW6ZHc-euw
2,JWT认证
jwt验证网站: https://jwt.io/
namespace JwtAuthenticate.Models { public class JwtSettings { //token是谁颁发的 public string Issure{get;set;} //可以给那些客户端使用 public string Audience{get;set;} //需要加密的Secretkey public string Secretkey{get;set;} } }JwtAuthenticate.Models.JwtSettings
{ "Logging": { "IncludeScopes": false, "Debug": { "LogLevel": { "Default": "Warning" } }, "Console": { "LogLevel": { "Default": "Warning" } } }, "JwtSettings":{ "Audience":"http://localhost:5000", "Issure":"http://localhost:5000", "SecretKey":"11111111111111111" } }appsettings.json
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using JwtAuthenticate.Models; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using System.Text; namespace JwtAuthenticate { 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) { //将配置文件jwtSettings注册进来 //public AuthorizeController(IOptionsStartupjwtSettings)会使用到 services.Configure(Configuration.GetSection("jwtSettings")); var jwtSettings=new JwtSettings(); Configuration.Bind("JwtSettings",jwtSettings); services.AddAuthentication(options=>{//配置Authentication options.DefaultAuthenticateScheme=JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme=JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options=>{//配置JwtBearer options.TokenValidationParameters=new TokenValidationParameters{ ValidIssuer=jwtSettings.Issure, ValidAudience=jwtSettings.Audience, IssuerSigningKey=new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.Secretkey)) }; }); services.AddMvc(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseAuthentication(); app.UseMvc(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; using JwtAuthenticate.Models; using System.Security.Claims; using Microsoft.IdentityModel.Tokens; using System.Text; using Microsoft.Extensions.Options; using System.IdentityModel.Tokens.Jwt; namespace JwtAuthenticate.Controllers { [Route("api/[controller]")] public class AuthorizeController:Controller { private JwtSettings _jwtSettings; public AuthorizeController(IOptionsAuthorizeControllerjwtSettings) { _jwtSettings=jwtSettings.Value; } [HttpGet] public string A() { return "a"; } [HttpPost] public IActionResult Token([FromBody]LoginViewModel model) { if(!ModelState.IsValid)return BadRequest(); if(!(model.UserName=="hunter"&&model.Password=="123456"))return BadRequest(); var claims=new Claim[]{ new Claim(ClaimTypes.Name,"hunter"), new Claim(ClaimTypes.Role,"admin") }; var key=new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.Secretkey)); var creds=new SigningCredentials(key,SecurityAlgorithms.HmacSha256); var token=new JwtSecurityToken( _jwtSettings.Issure ,_jwtSettings.Audience ,claims,DateTime.Now,DateTime.Now.AddMinutes(30) ,creds); return Ok(new {token=new JwtSecurityTokenHandler().WriteToken(token)}); } } }
3,基于Claim的Jwt认证
①加上authorize标签
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; namespace JwtAuthenticate.Controllers { [Route("api/[controller]")] public class ValuesController : Controller { [Authorize(Policy="values.Get")] // GET api/values [HttpGet] public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } [Authorize(Policy="values.Get")] // GET api/values/5 [HttpGet("{id}")] public string Get(int id) { return "value"; } [Authorize(Policy="values.Post")] // POST api/values [HttpPost] public void Post([FromBody]string value) { } [Authorize(Policy="values.Put")] // PUT api/values/5 [HttpPut("{id}")] public void Put(int id, [FromBody]string value) { } [Authorize(Policy="values.Delete")] // DELETE api/values/5 [HttpDelete("{id}")] public void Delete(int id) { } } }ValuesController
②设置Policy
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using JwtAuthenticate.Models; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using System.Text; namespace JwtAuthenticate { 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) { //将配置文件jwtSettings注册进来 //public AuthorizeController(IOptionsStartupjwtSettings)会使用到 services.Configure(Configuration.GetSection("jwtSettings")); var jwtSettings=new JwtSettings(); Configuration.Bind("JwtSettings",jwtSettings); services.AddAuthentication(options=>{//配置Authentication options.DefaultAuthenticateScheme=JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme=JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options=>{//配置JwtBearer options.TokenValidationParameters=new TokenValidationParameters{ ValidIssuer=jwtSettings.Issure, ValidAudience=jwtSettings.Audience, IssuerSigningKey=new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.Secretkey)) }; }); //设置policy services.AddAuthorization(option=>{ option.AddPolicy("values.Get",policy=>{policy.RequireClaim("values.Get");}); option.AddPolicy("values.Post",policy=>{policy.RequireClaim("values.Post");}); option.AddPolicy("values.Delete",policy=>{policy.RequireClaim("values.Delete");}); option.AddPolicy("values.Put",policy=>{policy.RequireClaim("values.Put");}); }); services.AddMvc(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseAuthentication(); app.UseMvc(); } } }
③授权
只能访问values.Get和values.Put了
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; using JwtAuthenticate.Models; using System.Security.Claims; using Microsoft.IdentityModel.Tokens; using System.Text; using Microsoft.Extensions.Options; using System.IdentityModel.Tokens.Jwt; namespace JwtAuthenticate.Controllers { [Route("api/[controller]")] public class AuthorizeController:Controller { private JwtSettings _jwtSettings; public AuthorizeController(IOptionsAuthorizeControllerjwtSettings) { _jwtSettings=jwtSettings.Value; } [HttpGet] public string A() { return "a"; } [HttpPost] public IActionResult Token([FromBody]LoginViewModel model) { if(!ModelState.IsValid)return BadRequest(); if(!(model.UserName=="hunter"&&model.Password=="123456"))return BadRequest(); var claims=new Claim[]{ new Claim(ClaimTypes.Name,"hunter"), new Claim("values.Get","true"), new Claim("values.Put","true") }; var key=new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.Secretkey)); var creds=new SigningCredentials(key,SecurityAlgorithms.HmacSha256); var token=new JwtSecurityToken( _jwtSettings.Issure ,_jwtSettings.Audience ,claims,DateTime.Now,DateTime.Now.AddMinutes(30) ,creds); return Ok(new {token=new JwtSecurityTokenHandler().WriteToken(token)}); } } }
案例下载:https://pan.baidu.com/s/1NKJNVMIHeVdPFcua_eH1sQ
https://pan.baidu.com/s/1y1B3Vnudkke71eIuPQ937A
https://pan.baidu.com/s/1zoX3P5yuktW_HaaOGRGFOQ
2,刷新token
,
3,OAuth2.0密码模式(数据库操作)
4,OIDC(内存模式)
①介绍
OpenID Connect是OpenID的升级版,简称OIDC。OIDC使用OAuth2的授权服务器来为第三方客户端提供用户的身份认证,并把对应的身份认证信息传递给客户端 。
OAuth2.0主要用于授权。OIDC主要用来认证
5,OIDC(数据库模式)