任務37:生成 JWT Token

 

實現給用戶辦法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; }
    }
}
LoginViewModel

 

 

建立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();
        }
Token

 

 

這裏要注意一下:咱們須要在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的值

 

出現錯誤的緣由:

相關文章
相關標籤/搜索