ASP.NET FrameWork Web Api JWT Token验证和Attribute拦截器创建和调用Demo

简单口述一下这个JWT Token验证和Attribute拦截器在项目中起到的作用

一.Token存在的意义

Token的存是为了实现接口安全,比如当接口地址泄露了,别人随便就能访问了,当我们有了Token,当别人知道了我们的接口地址,他们没有Token,我们后台检测到token为空,就会返回请求错误

二.Attribute拦截器的意义

就是相当于别人调用你的接口方法,我们加了拦截器,别人调用我们接口的时候就会先进入拦截器,我们就可以先在拦截器里面做一个校验什么的操作了,当然拦截器有进入方法前,返回值前,返回值后等的拦截器,前面的文章我有写到过

三.JWT Token验证结合Attribute拦截器在项目中的使用流程简单描述(表达能力略差)

第一步:客户端登录

第二步:验证用户名和密码以及添加Token

第三步:当用户名密码验证通过且Token生成成功,则返回验证成功状态和token值给前端页面

第四步:前端页面接收到返回验证成功状态和token值则把token值存到页面缓存之中(怎么存都行看你们自己)

第五步:当我们进入主页做其它功能请求接口时,先获取页面缓存中的token,携带token请求接口

第六步:当我们请求方法时,方法加了拦截器,就会先进入拦截器,就会判断这个token是否存在且token值正确

第七步:当token传输过来无误就会解析token存储到请求上下文Request上下文中(这个解析之后你们也可以不用一定存储到Request上下文中,根据情况而定)

第八步:然后再进入请求的接口方法体中进行数据操作

下面开始我们Demo实战演习............................................................

1.添加项目

 2.添加model

using System.Collections.Generic;

namespace JwtWebApi.Models
{
    public class AuthInfo
    {
        //模拟JWT的payload
        public string UserName { get; set; }

        public List<string> Roles { get; set; }

        public bool IsAdmin { get; set; }
        /// <summary>
        /// 过期时间
        /// </summary>
        public string ExpirationTime { get; set; }
    }
}
namespace JwtWebApi.Models
{
    public class LoginRequest
    {
        public string UserName { get; set; }

        public string Password { get; set; }
    }
}
namespace JwtWebApi.Models
{
    public class LoginResult
    {
        public bool Success { get; set; }

        public string Token { get; set; }

        public string Message { get; set; }
    }
}

 3.添加拦截器(创建一个文件夹Attributes)添加一个ApiAuthorizeAttribute类

using JWT;
using JWT.Algorithms;
using JWT.Serializers;
using JwtWebApi.Models;
using System;
using System.Linq;
using System.Web.Http;
using System.Web.Http.Controllers;

namespace JwtWebApi.Attributes
{
    /// <summary>
    /// 拦截器
    /// </summary>
    public class ApiAuthorizeAttribute: AuthorizeAttribute
    {
        /// <summary>
        /// 验证请求是否携带token
        /// </summary>
        /// <param name="actionContext"></param>
        /// <returns></returns>
        protected override bool IsAuthorized(HttpActionContext actionContext)
        {
            //获取token
            var authHeader = from t in actionContext.Request.Headers
                             where t.Key == "auth" 
                             select t.Value.FirstOrDefault();

            //验证token是否为空
            if (authHeader != null)
            {
                string token = authHeader.FirstOrDefault();
                if (!string.IsNullOrEmpty(token))
                {
                    try
                    {
                        const string secret = "To Live is to change the world";
                        //secret需要加密
                        JWT.IJsonSerializer serializer = new JsonNetSerializer();
                        IDateTimeProvider provider = new UtcDateTimeProvider();
                        IJwtValidator validator = new JwtValidator(serializer, provider);
                        IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
                        IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
                        IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder, algorithm);

                        var authInfo = decoder.DecodeToObject<AuthInfo>(token, secret, verify: true);

                        if (authInfo != null)
                        {
                            //验证token是否超时,这里设置的过期时间为两小时
                            if (Convert.ToDateTime(authInfo.ExpirationTime) < DateTime.Now.AddHours(2) && !string.IsNullOrEmpty(authInfo.ExpirationTime))
                            {
                                actionContext.RequestContext.RouteData.Values.Add("autninfoDate", authInfo);
                                return true;
                            }
                            else return true;
                        }
                        return false;
                    }
                    catch (Exception ex)
                    {
                        return false;
                    }
                }
            }
            return false;
        }
    }
}

4.创建Controller

SignInController 控制器

using JWT;
using JWT.Algorithms;
using JWT.Serializers;
using JwtWebApi.Models;
using System;
using System.Collections.Generic;
using System.Web.Http;

namespace JwtWebApi.Controllers
{
    public class SignInController : ApiController
    {
        /// <summary>
        /// 登录/生成token
        /// </summary>
        /// <param name="UserName">用户名</param>
        /// <param name="PassWord">密码</param>
        /// <returns></returns>
        [HttpGet]
        public LoginResult Post(string UserName,string PassWord)
        {
            LoginResult rs = new LoginResult();
            //这是是获取用户名和密码的,这里只是为了模拟
            AuthInfo info = new AuthInfo { 
                UserName = UserName, //用户名
                Roles = new List<string> { "Admin", "Manage","YQ" }, //权限
                IsAdmin = true,
                ExpirationTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") };//过期时间
            try
            {
                const string secret = "To Live is to change the world";
                //secret需要加密
                IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
                IJsonSerializer serializer = new JsonNetSerializer();
                IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
                IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
                var token = encoder.Encode(info, secret);

                #region 模拟数据库存
                //登录用户名密码验证
                List<LoginRequest> list=new List<LoginRequest>();
                list.Add(new LoginRequest { UserName = "admin", Password = "admin" });
                #endregion

                //且数据库有这用户才能登录成功
                if (list.Exists(t => t.UserName == UserName && t.Password == PassWord)==false) 
                    return new LoginResult { Message = "登录失败,账号或密码错误!", Success = false };
                //验证token是否为空
                if (token==null || token=="")
                    return new LoginResult { Message = "登录失败,token生成失败!", Success = false };
                
                return new LoginResult { Message = "登录成功!", Token = token, Success = true };

            }
            catch (Exception ex)
            {
                //异常返回
                return new LoginResult { Message = ex.Message, Success = false };
            }
        }
        
    }
}

UserController 控制器

using JwtWebApi.Attributes;
using JwtWebApi.Models;
using System.Web.Http;

namespace JwtWebApi.Controllers
{
    public class UserController : ApiController
    {
        /// <summary>
        /// 获取测试token
        /// </summary>
        /// <returns></returns>
        [ApiAuthorize]
        [HttpGet]
        public string Get11()
        {
            AuthInfo info = RequestContext.RouteData.Values["autninfoDate"] as AuthInfo;
            if (info == null)
            {
                return "获取不到,失败";
            }
            else
            {
                return $"获取到了,Auth的Name是 {info.UserName}";
            }
        }
    }
}

 5.更改Home/Index页面内容

index页面内容

<div class="jumbotron">
    <fieldset>
        <legend>身份验证</legend>
        <form id="form">
            <label for="UserName">用户名:</label><input type="text" name="userName" id="UserName" />
            <br />
            <br />
            <label for="Password">密码:</label><input type="password" name="password" id="PassWord" />
            <br />
            <br />
        </form>
        <button id="login">登录</button>
    </fieldset>
    <br />

    <fieldset>
        <button id="invoke">调用接口</button>
    </fieldset>
    <script src="~/Scripts/jquery-3.4.1.js"></script>
    <script src="~/Scripts/jquery-3.4.1.min.js"></script>
    <script>

        //调用api站点的登录接口,接口在登录成功后返回一个token。

        $("#login").on("click", function () {
            debugger
            var UserName = $("#UserName").val();
            if (!UserName) {
                alert("用户名不能为空!");
                return;
            }
            var PassWord = $("#PassWord").val();
            if (!PassWord) {
                alert("密码不能为空!");
                return;
            }
            $.ajax({
                //url: "https://localhost:44330/api/SignIn/Post?UserName=" + UserName + "&PassWord=" + PassWord + "",
                url: "../../api/SignIn/Post?UserName=" + UserName + "&PassWord=" + PassWord + "",
                method: "get",
                async: false,
                success: function (data) {
                    if (data.Success) {
                        //为简单起见,将token保存在全局变量中。
                        window.token = data.Token;
                        alert("登录成功");
                    } else {
                        alert("登录失败:" + data.Message);
                    }
                }, error: function (XMLHttpRequest, textStatus, errorThrown) {
                    console.log("请求进入error--" + XMLHttpRequest.status);
                    // 状态
                    console.log(XMLHttpRequest.readyState);
                    // 错误信息
                    console.log(textStatus);
                    console.log(XMLHttpRequest.responseText);
                }
            });
        });

        //调用api站点的获取数据的接口,该接口要求身份验证。
        $("#invoke").on("click", function () {
            console.log(window.token);
            $.ajax({
                //url: "https://localhost:44330/api/User/Get11",
                url: "../../api/User/Get11",
                method: "get",
                headers: {
                    "auth": window.token
                }, //通过请求头来发送token,放弃了通过cookie的发送方式
                complete: function (jqXHR, textStatus) {
                    alert(jqXHR.responseText);
                }, error: function (XMLHttpRequest, textStatus, errorThrown) {
                    console.log("请求进入error--" + XMLHttpRequest.status);
                    // 状态
                    console.log(XMLHttpRequest.readyState);
                    // 错误信息
                    console.log(textStatus);
                    console.log(XMLHttpRequest.responseText);
                }
            });
        });
    </script>
</div>

 完结撒花........

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: b'.net6.0 webapi jwt认证'是指使用jwt来对.net6.0 webapi进行认证。jwt即JSON Web Token,是一种用于身份验证及授权的开放标准。通过使用jwt,我们可以在客户端与服务器之间进行安全的数据传输,同时保证数据的完整性和安全性。在.net6.0 webapi中使用jwt认证,可以有效防止未经授权的访问和攻击。 ### 回答2: 随着互联网技术的不断发展和普及,越来越多的企业和应用程序开始采用WebAPI服务来提供各种不同的功能和服务。随着数据和信息的不断增长,对于WebAPI的安全性和访问控制也变得越来越重要。这正是JWT(Json Web Token)认证的作用所在,它能够让开发者通过在网络上进行点对点的验证来保证信息的安全性。 在.NET 6.0 WebAPI中,JTW验证是一个非常重要的功能,并且可以非常方便地进行集成。它允许通过对包含用户信息的令牌进行签名和加密来进行验证。开发人员只需要在Web API的配置文件(如Startup.cs)中添加验证中间件,并在控制器方法上添加[Authorize]注释。 以下是一个.NET 6.0 WebAPI JTW验证的示例代码: 1.在Startup.cs中添加JTW验证中间件 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.RequireHttpsMetadata = false; options.SaveToken = true; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = Configuration["Jwt:Issuer"], ValidAudience = Configuration["Jwt:Issuer"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["Jwt:Key"])) }; }); 2.在Controller的Action中添加[Authorize]注释 [Authorize] [HttpGet] public async Task<IActionResult> Get() { // handle the request } 实现JTW验证对于WebAPI的安全性和稳定性来说都是非常重要的。.NET 6.0 WebAPI的特性和框架支持让JTW验证变得更加容易和便捷,同时还能够提供高效和可靠的API服务。 ### 回答3: 前言 随着移动互联网的快速发展和普及,用户对互联网产品和服务的需求不断增长,而其中的数据安全问题也愈加突出。为了解决这一问题,许多网站和应用都开始采用JWT(JSON Web Token)来加强对接口的认证和授权。 在.NET 6.0中,WebAPI提供了方便的JWT验证机制,开发人员只需要使用一些简洁的代码,就能快速实现对应用程序的用户验证和授权管理。 如何使用JWT验证 首先,我们需要在.NET 6.0 WebAPI中注册JWT验证服务,以此来实现对用户请求的认证和授权管理。具体的流程如下: 1. 在应用应用程序启动时,向容器注册JWT认证服务 首先通过 NuGet 安装 Microsoft.AspNetCore.Authentication.JwtBearer 包,然后在 Startup.cs 的 ConfigureServices 方法中添加以下代码: services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = "Issuer", ValidAudience = "Audience", IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])) }; }); 2. 在相应的 API 控制器或操作方法中应用 JWT 验证 然后可以在某些API控制器或操作方法上使用Authorize标记,来启用JWT验证。以下是一个使用Authorize标记的示例: [Authorize] [HttpGet] public async Task<IActionResult> GetUserInfo() { var user = await _userManager.GetUserAsync(User); return Ok(user); } 这些API控制器或操作方法,只有在用户已经成功通过JWT验证后,才会返回数据。否则,用户会收到HTTP 401 Unauthorized 的响应。 3.生成一个JSONWebToken 在用户登录或注册成功后,Web API 服务端需要生成一个 JSONWebTokenJWT)并将其返回给客户端。 下面的示例展示如何使用 SymmetricSecurityKey 和 TokenValidationParameters 来建立 JWT: private async Task<string> GenerateJWTToken(User user) { var jwtSettings = Configuration.GetSection("Jwt"); var key = Encoding.UTF8.GetBytes(jwtSettings["Key"]); var issuer = jwtSettings["Issuer"]; var audience = jwtSettings["Audience"]; var expirationTime = int.Parse(jwtSettings["ExpirationTime"]); var credentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256); var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, user.UserName), new Claim(JwtRegisteredClaimNames.Email, user.Email), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()) }; var tokenDescriptor = new JwtSecurityToken( issuer: issuer, audience: audience, claims: claims, expires: DateTime.UtcNow.AddMinutes(expirationTime), signingCredentials: credentials ); var tokenHandler = new JwtSecurityTokenHandler(); var encodedToken = tokenHandler.WriteToken(tokenDescriptor); return encodedToken; } 经过以上的代码实现,已经在.NET 6.0 WebAPI中实现了基于JWT的用户认证和授权,使得开发人员能够快速、简单地实现用户数据的保护和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值