欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

.net使用jwt進(jìn)行身份認(rèn)證的流程記錄

 更新時(shí)間:2021年09月17日 14:27:41   作者:程序猿想成程序獅  
這篇文章主要給大家介紹了關(guān)于.net使用jwt進(jìn)行身份認(rèn)證的相關(guān)資料,JWT是Auth0提出的通過(guò)對(duì)JSON進(jìn)行加密簽名來(lái)實(shí)現(xiàn)授權(quán)驗(yàn)證的方案,本文通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

什么是身份認(rèn)證和鑒權(quán)

舉個(gè)例子

假設(shè)有這么一個(gè)小區(qū),小區(qū)只允許持有通行證的人進(jìn)入,陌生人如果想直接進(jìn)入小區(qū)會(huì)被保安攔住,他必須先辦理通行證才會(huì)被允許進(jìn)入

類比身份認(rèn)證和鑒權(quán)體系

一個(gè)人要訪問(wèn)我的一個(gè)機(jī)密的接口,我首先需要知道你是誰(shuí),搞清楚你是誰(shuí)的過(guò)程就是身份認(rèn)證,如果我搞不清楚你是誰(shuí),那你就是陌生人,身份認(rèn)證失敗。

身份認(rèn)證通過(guò),并不一定就允許訪問(wèn)我的機(jī)密的接口,因?yàn)樯矸菡J(rèn)證只是讓我知道了你是誰(shuí),但是我還不知道你有沒(méi)有訪問(wèn)我接口的權(quán)限,因此還需要進(jìn)行鑒權(quán)。

鑒權(quán)就是在身份認(rèn)證的基礎(chǔ)上來(lái)查閱你是否有訪問(wèn)某接口的權(quán)限,有權(quán)限才允許訪問(wèn)。

jwt工作流程

在基于jwt策略的身份認(rèn)證和鑒權(quán)體系中

機(jī)密的接口只允許有token的人訪問(wèn)

它的工作流程是這樣的

首先你向授權(quán)服務(wù)器請(qǐng)求一個(gè)token,服務(wù)器對(duì)你進(jìn)行校驗(yàn),校驗(yàn)成功則給你一個(gè)token
之后你每次訪問(wèn)接口都帶上這個(gè)服務(wù)器給的token,以此來(lái)證明你經(jīng)過(guò)了校驗(yàn)并有權(quán)訪問(wèn)這個(gè)接口,這樣你才能被放行

token是如何生成的

token是由服務(wù)器生成的,

用戶請(qǐng)求token的時(shí)候,拿著自己的一些信息給服務(wù)器

服務(wù)器有它的密鑰基于一些加密算法對(duì)用戶的信息進(jìn)行加密,之后生成一個(gè)token給用戶。

jwt三部分

jwt的toke由三部分,header密文,payload密文和簽名

header

header存放兩個(gè)信息

1.聲明加密的算法

2.聲明類型

像這樣:

{
“alg”: “HS256”,
“typ”: “JWT”
}

payload

存放一些自定義的信息,例如用戶的個(gè)人信息,例如用戶名。

注意:不要存密碼等敏感信息,因?yàn)閠oken可以被解密成明文。

signature

簽名,由服務(wù)器使用它的密鑰對(duì)header和payload進(jìn)行加密后的結(jié)果

jwt是如何保證數(shù)據(jù)不會(huì)被篡改的

服務(wù)器對(duì)token解密獲得header、payload和signature,再拿著自己的密鑰對(duì)header和payload進(jìn)行加密,看加密結(jié)果是否和解密出來(lái)的signature相等,如果相等說(shuō)明數(shù)據(jù)沒(méi)有被篡改,如果不等說(shuō)明數(shù)據(jù)已被篡改

由于服務(wù)器的密鑰是不公開(kāi)的,因此認(rèn)為簽名不能偽造,也就是說(shuō),別人無(wú)法通過(guò)header、payload來(lái)加密得到一個(gè)服務(wù)器認(rèn)可的token

.net webapi 的 demo

為了簡(jiǎn)化,這里只做身份認(rèn)證,也就是說(shuō)登錄的用戶就有權(quán)訪問(wèn)所有接口了

在Starup.cs中開(kāi)啟身份認(rèn)證服務(wù)并指定策略為jwt

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ValidAudience = "xxx",
                    ValidIssuer = "xxx",
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("bc47a26eb9a59406057dddd62d0898f4")),
                };
            });

還需要使用身份認(rèn)證中間件

在需要進(jìn)行身份認(rèn)證的接口或控制器上加上特性[Authorize]

還需要實(shí)現(xiàn)登錄邏輯,準(zhǔn)備一個(gè)Get接口用于測(cè)試

Controller代碼為:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;

namespace JwtTest.Controllers
{
    [ApiController]
    [Route("[controller]/[action]")]
    [Authorize]
    public class WeatherForecastController : ControllerBase
    {
        [HttpGet]
        public ActionResult Get()
        {
            return Ok("ok");
        }

        [HttpPost]
        [AllowAnonymous]
        public ActionResult Login([FromBody] LoginViewModel loginViewModel)
        {
            //驗(yàn)證用戶名密碼是否正確,錯(cuò)誤則不進(jìn)行后續(xù)操作
            {
                //驗(yàn)證邏輯在此省略
            }
			//驗(yàn)證成功則繼續(xù)運(yùn)行后面代碼,來(lái)生成token
            
            //claims是關(guān)于用戶的一些信息,這部分信息將放在payload中,由于token可以被解密,因此不要把密碼放進(jìn)去
            var claims = new Claim[]
            {
                new Claim(ClaimTypes.Name, loginViewModel.Name)
            };
            //指定生成token所需要的密鑰
            SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("bc47a26eb9a59406057dddd62d0898f4"));
            //指定數(shù)字簽名需要使用的密鑰和算法
            SigningCredentials credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

            //生成token
            JwtSecurityToken token = new JwtSecurityToken(issuer: "xxx",
                                                          audience: "xxx",
                                                          claims: claims,
                                                          notBefore: DateTime.Now, //token生效時(shí)間
                                                          expires: DateTime.Now.AddMinutes(5), //token有效時(shí)間
                                                          signingCredentials: credentials);

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

    }
}

進(jìn)行測(cè)試:

不登錄直接訪問(wèn)Get會(huì)報(bào)401

訪問(wèn)Login會(huì)返回一個(gè)token

要想成功訪問(wèn)Get,需要帶上這個(gè)token,如何使請(qǐng)求帶上這個(gè)token呢?

可以借助postman,

輸入Get接口的路徑

將Authorization類型設(shè)置為Bearer Token,之后將生成的token粘貼到右邊

訪問(wèn)成功

總結(jié)

到此這篇關(guān)于.net使用jwt進(jìn)行身份認(rèn)證的文章就介紹到這了,更多相關(guān).net用jwt身份認(rèn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論