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

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

程序员文章站 2022-03-30 09:36:39
...

本文讲解,在.Net Core WebApi中,使用JWT来进行身份认证和授权。

 

一、在startup文件中配置身份认证

a.配置JWT身份认证:

这里有两种方式,我个人看来没任何差别,如果有需要指定事件之类的(如:认证成功,认证失败时,可以自己去配置它的事件)

第一种:

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

第二种:

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

b.开启JWT身份认证:

这里还额外增加一个异常处理的中间件,在身份认证失败时会进入到这里自动进行处理

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

 

二、配置完毕之后,我们就要开发登录接口,让客户端登录获取到token,之后就可以通过token来请求了

a.登录接口

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

[HttpPost]
        public ResponseModel<UserTokenInfo> Login([FromBody] UserLoginParameter userPara)
        {
            var result = new ResponseModel<UserTokenInfo>();
            try
            {
                if (string.IsNullOrWhiteSpace(userPara.User))
                {
                    throw new Exception("用户名不能为空!");
                }
                if (string.IsNullOrWhiteSpace(userPara.Password))
                {
                    throw new Exception("密码不能为空!");
                }

                //验证用户名和密码
                var userInfo = _UserService.LoginToGetUserInfo(userPara);
                var claims = new Claim[]
                {
                    new Claim(ClaimTypes.Name, userInfo.Name),
                    new Claim(ClaimTypes.NameIdentifier, userInfo.Id.ToString()),
                };

                var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_Configuration.JwtSecurityKey));
                var expires = DateTime.Now.AddHours(24);//有效时长1小时
                var token = new JwtSecurityToken(
                    issuer: _Configuration.Issuer,
                    audience: _Configuration.Audience,
                    claims: claims,
                    expires: expires,
                    signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256));

                //生成Token
                string jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
                result.Code = (int)HttpStatusCode.OK;
                result.Data = new UserTokenInfo() { AccessToken = jwtToken, ExpireDate = expires };
                result.Message = "授权成功!";
            }
            catch (Exception ex)
            {
                result.Message = ex.Message;
                result.Code = (int)HttpStatusCode.InternalServerError;
            }
            return result;
        }

 

b.登录业务层,以及dao层,我这里二合一了,模拟操作

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

c.一些对象:

c.1.ajax请求响应实体:

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

c.2.用户登录参数实体

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

c.3.用户登录成功用户信息

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

 

ok,登录接口也开发完毕了。

 

三、开启了JWT身份认证,也开发了登录接口,接下来就是使用了,我们在需要身份认证的接口上增加Authorize特性即可,若不需要身份认证,添加AllowAnonymous特性即可

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

 

好了,接下来我们来测试一下

 

前端请求:

a.调用登录接口:

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

b.设置全局ajax,带上指定请求头(这里要记得,使用Bearer+空格+token)

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

c.登录成功后,正常请求接口

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

看下测试结果:

没有token时,请求失败,无权限

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

登录获取token,并存储token,之后的请求全部带上token(登录方法不要加权限哦,否则死循环了)

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

再次请求刚才的接口

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

 

这里说下为什么在添加请求头信息时要使用Bearer+空格+token:

我们在拿到token之后,要将token添加到请求头中,在postman中如何操作呢?

在Authorization中添加token,type要选择Bearer Token

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

这个时候我们选择了Bearer Token,填写了token之后,看看请求的header中,postman是如何处理我们的token的

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

postman给我们处理的结果是Bearer+空格+token

所以我们在使用时也要注意这个,这是JWT自身限定的,没有办法

 

如果需要获取到当前用户信息来使用的话,还是跟.Net Core MVC中权限过滤器一样去使用User.FindFirstValue(key)

.Net Core WebApi中,使用JWT身份认证与授权(使用异常处理中间件来处理认证不通过时的情况)

 

Ending~

相关标签: .NetCore