jwt-在asp.net core中的使用jwt

中陽裡士發表於2021-07-01

JWT學習文章:

第一篇:JWT原理

第二篇:JWT原理實現程式碼

第三篇:在asp.net core中的使用JWT


 前兩篇文章中我寫了jwt的原理,並且也用原理實現了jwt的驗證。如果要看前兩篇文章,點選上面的連線就能夠連結過去。

第二篇文章實現jwt原理時有同學就說每個成熟的框架中都有相應的jwt實現或整合。說的不錯,每個主流的框架中幾乎毫無例外的都整合了jwt的實現,但是我們上篇文章的重點是希望大家能夠明白原理,和這些框架中實現的基本思路,如無特殊情況也沒有必要自己來寫。

那麼這篇文章我們就來看看asp.net core中jwt如何使用!

注意,本文主要是程式碼,必要的文字說明我已經都在程式碼註釋中寫出來了。文末我會給出原始碼地址。


新建一個空的asp.net core專案:

新建一個類Const放置一些常量:

public class Const

{

    public const string SecurityKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSfLGu+kcFDcJUCV46J+SbgR0lNc2NqgCGzojQTWW9xqjuzPF3mpisvTggYZSGfBzN+88YLZYbBLrDTUMJ4nTieElbP6SHkBFu8F+7fFBi7w3UPsaAXDr2E2srQYU5ZlKAcFBoNajNWj3sfSVRoYRPdqDTj4WdJlUPSNGz0wgRrQIDAQAB";

    public const string Domain = "http://localhost:5000";

}

 

Startup中嚮應用新增jwt驗證服務:

//新增jwt驗證:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)

    .AddJwtBearer(options => {

        options.TokenValidationParameters = new TokenValidationParameters

        {

            ValidateIssuer = true,//是否驗證Issuer

                        ValidateAudience = true,//是否驗證Audience

                        ValidateLifetime = true,//是否驗證失效時間

                        ClockSkew = TimeSpan.FromSeconds(30),

            ValidateIssuerSigningKey = true,//是否驗證SecurityKey

                        ValidAudience = Const.Domain,//Audience

                        ValidIssuer = Const.Domain,//Issuer,這兩項和前面簽發jwt的設定一致

                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Const.SecurityKey))//拿到SecurityKey

                    };

    });

 

管道中新增jwt驗證:

//新增jwt驗證

app.UseAuthentication();

由於管道有執行順序的特性,因此最好放在管道的開始位置。

 

新增登入獲取token的介面:

[ApiController]

[Route("[controller]")]

public class AuthController : ControllerBase

{

    [AllowAnonymous]//指定此屬性應用於的類或方法不需要授權。

    [HttpGet]

    public IActionResult Get(string userName, string pwd)

    {

        if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(pwd))

        {

            var claims = new[]

            {

                    new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}") ,

                    new Claim (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddMinutes(30)).ToUnixTimeSeconds()}"),

                    new Claim(ClaimTypes.Name, userName)

                };

            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Const.SecurityKey));

            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

            var token = new JwtSecurityToken(

                issuer: Const.Domain,

                audience: Const.Domain,

                claims: claims,

                expires: DateTime.Now.AddMinutes(30),

                signingCredentials: creds);

 

            return Ok(new

            {

                token = new JwtSecurityTokenHandler().WriteToken(token)

            });

        }

        else

        {

            return BadRequest(new { message = "username or password is incorrect." });

        }

    }

}

方法中對使用者名稱和密碼的驗證只是簡單的驗空,實際應用中會更復雜,也會與資料庫中的資料比對。

 

接下來就是對jwt的應用了。

新建HomeController,用於驗證jwt是否成功啟用:

[ApiController]

[Route("[controller]")]

public class HomeController : ControllerBase

{

    [HttpGet]

    [Route("api/value1")]

    public ActionResult<IEnumerable<string>> Get()

    {

        return new string[] { "value1", "value1" };

    }

 

    [HttpGet]

    [Route("api/value2")]

    [Authorize]

    public ActionResult<IEnumerable<string>> Get2()

    {

        return new string[] { "value2", "value2" };

    }

}

其中Get()方法不需要驗證,Get2()需要驗證。


 測試:

先測試Get()方法(介面名稱時api/value1),因為此方法不用驗證:

 

驗證成功!!!

 

接下來測試Get2():

訪問Get2()方法的介面名api/value2,貼上上面獲得的token到header中:

 

驗證成功!!!

 

總結:至此,使用asp.net core 自帶的jwt方法就完成了。


原始碼地址:https://gitee.com/jingboweilanGO/Demo_jwt_core.git

說明:Demo-jwt-core是本篇文章涉及到的原始碼,是使用asp.net core 自帶的jwt方法;

     Demo-jwt-core2是上一篇文章的原始碼,根據jwt原理實現的程式碼。

相關文章