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

.net使用jwt進行身份認證的流程記錄

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

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

舉個例子

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

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

一個人要訪問我的一個機密的接口,我首先需要知道你是誰,搞清楚你是誰的過程就是身份認證,如果我搞不清楚你是誰,那你就是陌生人,身份認證失敗。

身份認證通過,并不一定就允許訪問我的機密的接口,因為身份認證只是讓我知道了你是誰,但是我還不知道你有沒有訪問我接口的權(quán)限,因此還需要進行鑒權(quán)。

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

jwt工作流程

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

機密的接口只允許有token的人訪問

它的工作流程是這樣的

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

token是如何生成的

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

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

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

jwt三部分

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

header

header存放兩個信息

1.聲明加密的算法

2.聲明類型

像這樣:

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

payload

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

注意:不要存密碼等敏感信息,因為token可以被解密成明文。

signature

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

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

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

由于服務(wù)器的密鑰是不公開的,因此認為簽名不能偽造,也就是說,別人無法通過header、payload來加密得到一個服務(wù)器認可的token

.net webapi 的 demo

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

在Starup.cs中開啟身份認證服務(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")),
                };
            });

還需要使用身份認證中間件

在需要進行身份認證的接口或控制器上加上特性[Authorize]

還需要實現(xiàn)登錄邏輯,準備一個Get接口用于測試

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)
        {
            //驗證用戶名密碼是否正確,錯誤則不進行后續(xù)操作
            {
                //驗證邏輯在此省略
            }
			//驗證成功則繼續(xù)運行后面代碼,來生成token
            
            //claims是關(guān)于用戶的一些信息,這部分信息將放在payload中,由于token可以被解密,因此不要把密碼放進去
            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生效時間
                                                          expires: DateTime.Now.AddMinutes(5), //token有效時間
                                                          signingCredentials: credentials);

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

    }
}

進行測試:

不登錄直接訪問Get會報401

訪問Login會返回一個token

要想成功訪問Get,需要帶上這個token,如何使請求帶上這個token呢?

可以借助postman,

輸入Get接口的路徑

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

訪問成功

總結(jié)

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

相關(guān)文章

最新評論