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原理实现的代码。