欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-03 17:01:29
JWT学习文章: 第一篇:JWT原理 第二篇:JWT原理实现代码 第三篇:在asp.net core中的使用JWT 前两篇文章中我写了jwt的原理,并且也用原理实现了jwt的验证。如果要看前两篇文章,点击上面的连接就能够链接过去。 第二篇文章实现jwt原理时有同学就说每个成熟的框架中都有相应的jwt ......

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),因为此方法不用验证:

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

验证成功!!!

 

接下来测试get2():

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

访问get2()方法的接口名api/value2,粘贴上面获得的token到header中:

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

验证成功!!!

 

总结:至此,使用asp.net core 自带的jwt方法就完成了。


源码地址:https://gitee.com/jingboweilango/demo_jwt_core.git

说明:demo-jwt-core是本篇文章涉及到的源码,是使用asp.net core 自带的jwt方法;

     demo-jwt-core2是上一篇文章的源码,根据jwt原理实现的代码。