實現給用戶辦法token算法
默認是能夠訪問valuesController的,返回的狀態是200json
http://localhost:5429/api/valuesapi
返回的狀態碼是200app
把ValuesController加上屬性值:[Authorize]ide
再次訪問,沒有權限訪問。返回401狀態碼post
新建文件夾:ViewModelsspa
LoginViewModel類來接收用戶的參數和密碼:3d
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace JwtAuthSample.ViewModels { public class LoginViewModel { public string User { get; set; } public string Password { get; set; } } }
建立API控制器:AuthorizeControllercode
給LoginViewModel加上必填的屬性:jwt
咱們要把。appsettings.json內配置的jwtsettings的信息讀取出來
因此這裏引入命名空間:using Microsoft.Extensions.Options;
而後須要生成咱們的tokens須要引入命名空間:
VScode須要安裝Nuet的包的擴展
我在VS2017裏面直接安裝包:Microsoft.AspNetCore.Authentication.JwtBearer
而後能夠引入咱們的命名空間了:
using System.IdentityModel.Tokens.Jwt;
生成token的代碼
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using JwtAuthSample.ViewModels; using System.Security.Claims; using Microsoft.IdentityModel.Tokens; using Microsoft.Extensions.Options; using System.Text; using System.IdentityModel.Tokens.Jwt;
public IActionResult Token(LoginViewModel viewmodel) { if (ModelState.IsValid) { if (!(viewmodel.User == "wjw" && viewmodel.Password == "123456")) { return BadRequest(); } var claims = new Claim[] { new Claim(ClaimTypes.Name,"wjw"), new Claim(ClaimTypes.Role,"admin") }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtsettings.SecretKey)); //把咱們的key放進來,並給它一個算法 var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( _jwtsettings.Issure, _jwtsettings.Audoence, claims, DateTime.Now,//當前時間 DateTime.Now.AddMinutes(30),//過時時間 加了30分鐘 creds); return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) }); } return BadRequest(); }
這裏要注意一下:咱們須要在StartUp裏面進行配置
StartUp裏面配置
SecretKey的長度必須大於16個字符,也就是128個字節以上
必須配置上默認的路由才能訪問到個人AuthorizeController
若是不配置默認的路由信息就訪問不到這個Controller
app.UseMvc(routes => { routes.MapRoute( name: "Default", template: "{controller}/{action}/{id?}", defaults: new { controller = "Authorize", action = "post" } ); });
直接用默認的路由也是能夠的:至關於上面那一段routes.MapRoute{}那一段代碼
app.UseMvcWithDefaultRoute();
http://localhost:5429/Authorize/Post?User=wjw&Password=123456
參數user:wjw
參數2:Password:123456
複製獲取到的token
Authorization:bearer 複製的token的值
出現錯誤的緣由: