ASP.NET Core 2.1 JWT Token 使用 (二)

接上文覆获,http://www.reibang.com/p/c5f9ea3b4b65 ASP.NET Core 2.1 JWT Token (一)弧可。

如下演示在項(xiàng)目中的 簡(jiǎn)單 的 實(shí)際使用方式:

在后端生成token

1.在Startup.cs中配置 服務(wù) 蛀柴,添加jwt 驗(yàn)證 服務(wù)添加服務(wù) ( 在ConfigureServices方法中 )

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(options => {
                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateIssuer = true,//是否驗(yàn)證Issuer
                        ValidateAudience = true,//是否驗(yàn)證Audience
                        ValidateLifetime = true,//是否驗(yàn)證失效時(shí)間
                        ValidateIssuerSigningKey = true,//是否驗(yàn)證SecurityKey
                        ValidAudience = "igbom_web",//Audience
                        ValidIssuer = "igbom_web",//Issuer吞滞,這兩項(xiàng)和前面簽發(fā)jwt的設(shè)置一致
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["SecurityKey"]))//拿到SecurityKey
                    };
                });

2.啟用 ( 在Configure方法中 )

app.UseAuthentication();//注意添加這一句掰读,啟用jwt驗(yàn)證

3.添加驗(yàn)證邏輯 亡容, 登陸成功就發(fā)放 token 品洛。

    public class HomeController : Controller
    {
        
        private IgbomContext _context;
        private Common _common;
        private readonly IConfiguration _configuration;
        public HomeController(IgbomContext context, Common common, IConfiguration configuration)
        {
            _context = context;
            _common = common;
            _configuration = configuration;
        }

        //登錄操作
        [HttpPost]
        public JsonResult login([FromForm] User model)
        {
            UserMsg msg = new UserMsg()
            {
                mark = 0,
                msg = "",
                token = "",
            };

            User user = _context.User.Where(x => x.name == model.name).FirstOrDefault();
            string password_form = _common.Get_MD5_Method1(model.password);

            if (user != null && user.password == password_form.ToLower())
            {
                JwtTokenUtil jwtTokenUtil = new JwtTokenUtil(_configuration);
                string token = jwtTokenUtil.GetToken(user);   //生成token
                //var headers = new HttpResponseMessage().Headers;
                //headers.Add("Authorization",token);

                msg.mark = 1;
                msg.msg = "登錄成功";
                msg.token = token;
            }
            else
            {
                msg.msg = "用戶名或者密碼錯(cuò)誤";
            }
            return Json(msg);
        }
    }*/
    /*
    public class UserMsg {
        //0是錯(cuò)誤树姨,1 是正確的
        public int mark { get; set; }
        public string msg { get; set; }
        public string token { get; set; }
    }*/

4 .創(chuàng)建JwtTokenUtil工具類,用于生成Jwt Token桥状。

public class JwtTokenUtil
    {
        private readonly IConfiguration _configuration;

        public JwtTokenUtil(IConfiguration configuration)
        {
            _configuration = configuration;
        }

        public string GetToken(User user)
        {
            // push the user’s name into a claim, so we can identify the user later on.
            var claims = new[]
            {
                   new Claim(ClaimTypes.Name, user.name),
                   //new Claim(ClaimTypes.Role, admin)//在這可以分配用戶角色帽揪,比如管理員 、 vip會(huì)員 辅斟、 普通用戶等
                };
            //sign the token using a secret key.This secret will be shared between your API and anything that needs to check that the token is legit.
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["SecurityKey"])); // 獲取密鑰
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); //憑證 转晰,根據(jù)密鑰生成
            //.NET Core’s JwtSecurityToken class takes on the heavy lifting and actually creates the token.
            /**
             * Claims (Payload)
                Claims 部分包含了一些跟這個(gè) token 有關(guān)的重要信息。 JWT 標(biāo)準(zhǔn)規(guī)定了一些字段士飒,下面節(jié)選一些字段:

                iss: The issuer of the token查邢,token 是給誰(shuí)的  發(fā)送者
                aud: 接收的
                sub: The subject of the token,token 主題
                exp: Expiration Time酵幕。 token 過(guò)期時(shí)間扰藕,Unix 時(shí)間戳格式
                iat: Issued At。 token 創(chuàng)建時(shí)間芳撒, Unix 時(shí)間戳格式
                jti: JWT ID邓深。針對(duì)當(dāng)前 token 的唯一標(biāo)識(shí)
                除了規(guī)定的字段外未桥,可以包含其他任何 JSON 兼容的字段。
             * */
            var token = new JwtSecurityToken(
                issuer: "igbom_web",
                audience: "igbom_web",
                claims: claims,
                expires: DateTime.Now.AddMinutes(1),
                signingCredentials: creds
            );

            return new JwtSecurityTokenHandler().WriteToken(token);
        }
    }

然后在前端使用token

5 . 可以通過(guò)Vuex管理token 芥备, 在store.js添加token冬耿,

  token: "",

6 . 在 index.js 中為axios的每個(gè)請(qǐng)求添加 headers,以便每次發(fā)送請(qǐng)求的時(shí)候都在 headers中攜帶token萌壳。

Vue.prototype.$http.defaults.headers.common['Authorization'] = 'Bearer ' + localStorage.getItem('token');

7 . 添加 全局路由守衛(wèi) 亦镶, 在每次路由發(fā)生變化的時(shí)候都判斷本地 localStorage中是否有token。如果有袱瓮,就路由跳轉(zhuǎn)染乌,沒有就跳轉(zhuǎn)到登陸頁(yè)面。#<注意>:判斷路由變化的時(shí)候注意防止 進(jìn)入死循環(huán)

router.beforeEach((to, from, next) => {
    if (localStorage.getItem('token') != '') {//store.state.token
        console.log("333")
        next()
    }
    else {
        console.log("444")
        if (to.path == '/userlogin' || to.path == '/login') {//如果是登錄頁(yè)面路徑懂讯,就直接next()
            next();
        } else {//不然就跳轉(zhuǎn)到登錄;
            //再用一個(gè) if else判斷台颠,防止死循環(huán)
            if (from.path.indexOf('/index') != -1) {
                next('/userlogin');
            }
            else {
                next('/login');
            }
            //next('/userlogin');
        }
    }
})

8 . 添加一個(gè)登陸頁(yè)面褐望,在login.vue中,發(fā)送表單數(shù)據(jù)串前,如果登陸成功瘫里,拿到token,就將token 存放到本地荡碾。

 this.$http.post('/Home/login', formData).then(function (res) {
                if (res.data.mark == 1 && res.data.token != '') {
                    //保存token到狀態(tài)
                    that.$store.commit('changeToken', res.data.token); ///////提交狀態(tài)

                    localStorage.setItem('token', res.data.token);//////token保存到localStorage

                    that.$http.defaults.headers.common['Authorization'] = 'Bearer ' + res.data.token;

                    //跳轉(zhuǎn)到首頁(yè)
                    that.$router.push({
                        path: '/index/energymanagement'
                    });
                } else {
                    //錯(cuò)誤提示
                    that.ruleForm2.errMsg = res.data.msg;
                }
            });

9.在普通頁(yè)面中谨读,每次發(fā)送api請(qǐng)求后返回結(jié)果的時(shí)候都要判斷,如果token過(guò)期了坛吁,跳轉(zhuǎn)到登陸頁(yè)面重新登陸劳殖。
.catch(){}

如果每次發(fā)送api請(qǐng)求后返回結(jié)果的時(shí)候都要判斷,那項(xiàng)目變大以后拨脉,很難維護(hù)哆姻,所以可以進(jìn)行一些封裝,
http://www.reibang.com/p/671410da8f60

  • 至此玫膀,一個(gè)完整的token使用過(guò)程大致完成矛缨。

  • 要理解JWT的使用,首先要清楚后端token生成帖旨,前端發(fā)送請(qǐng)求攜帶token的過(guò)程箕昭,然后針對(duì)這個(gè)過(guò)程去了解每個(gè)部分的實(shí)現(xiàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末解阅,一起剝皮案震驚了整個(gè)濱河市落竹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瓮钥,老刑警劉巖筋量,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烹吵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡桨武,警方通過(guò)查閱死者的電腦和手機(jī)肋拔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)呀酸,“玉大人凉蜂,你說(shuō)我怎么就攤上這事⌒杂” “怎么了窿吩?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)错览。 經(jīng)常有香客問(wèn)我纫雁,道長(zhǎng),這世上最難降的妖魔是什么倾哺? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任轧邪,我火速辦了婚禮,結(jié)果婚禮上羞海,老公的妹妹穿的比我還像新娘忌愚。我一直安慰自己,他們只是感情好却邓,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布硕糊。 她就那樣靜靜地躺著,像睡著了一般腊徙。 火紅的嫁衣襯著肌膚如雪简十。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天昧穿,我揣著相機(jī)與錄音勺远,去河邊找鬼。 笑死时鸵,一個(gè)胖子當(dāng)著我的面吹牛胶逢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饰潜,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼初坠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了彭雾?” 一聲冷哼從身側(cè)響起碟刺,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薯酝,沒想到半個(gè)月后半沽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爽柒,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年者填,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浩村。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡占哟,死狀恐怖心墅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情榨乎,我是刑警寧澤怎燥,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站蜜暑,受9級(jí)特大地震影響铐姚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肛捍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一谦屑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧篇梭,春花似錦、人聲如沸酝枢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)帘睦。三九已至袍患,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間竣付,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工古胆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肆良,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓逸绎,卻偏偏與公主長(zhǎng)得像惹恃,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子棺牧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容