webapi token、参数签名是如何生成的

API接口保障安全性原则:1.有调用者身份2.请求的唯一性3.请求的参数不能被篡改4.请求的有效时间

在刚接触接口开发时,可能脑子里压根就没有这个接口调用安全性的原则,但常识性的经验告诉我们,每一个请求都应该有原则地保障安全性。

例如这个接口  http://127.0.0.1/api/user/list?type=value 这个获取用户列表信息的请求总不能在地址栏一输入就直接显示信息(虽然有点夸张,不至于阿猫阿狗的信息这么容易get吧),在写webapi接口原则性的基本要求必须得保证数据的安全性和请求的有效性

在这里我就使用Token+参数签名+时间戳  这三个系统参数来办证请求的有效性(即时100%请求有效,也不能说100%也安全了)。

参数名必选类型作用
tokenstring调用方标识,保障其身份是来自本系统认证过的,有效识别用户身份
sign否   string接口参数的key,value的记录,防止参数值被篡改,防止伪装请求
timestampf否int时间戳,防止重放攻击

那么问题来

1.token 如何生成?作用是什么?

2.参数签名如何生成?作用是什么?

3.时间戳的作用是什么?

看了这篇文章你就知道了。这三个系统参数是如何保证请求的有效性,一定程度上提高数据的安全性

1.token如何生成的?作用是什么?

token生成:一般的api基本上主要分为两种客户端访问api的token和需要用户登录之后的token,这里我就来说一下后者,(简单通俗做法)用户登录输入用户名、密码,访问api,验证数据库成功。这个时候可以产生token,失败直接返回。问题又来了!

1.token生成的方式是什么?2.token存在哪里?3.token如何验证是否正确

在验证数据成功之后可以获取唯一用户标识(用户名也行),就以username:zhanglin为例吧,对这个标识进行加密(des,MD5、其他的也行,关键数据必须得加密),这个加密之后的字符串就可以做为一个Token了。

2.token每次请求都需要进行传递,推荐存在cookie,也可以持久化到客户端。现在有这样一个api接口http://127.0.0.1/api/user/list?token=encryptUsernameStr

这个encryptZhanglinStr就是登录成功后加密的username返回的给客户端,客户端用什么保存这里就不多介绍了,只需要知道返回给客户端一个用户访问的Token类即可,到了服务器端方法验证的时候再进行解密,获取到字符串zhanglin,然后将这个zhanglin与系统用户(可采用缓存数据库、缓存token的值)对比,如果对比存在,则说明有权限去访问api,反之非法的请求。

还是代码来实现一下吧。代码比较容易理解,就是为了把这个原理说清楚一点

        [Route("login")]
        public bool login(string account, string pwd)
        {
            var obj = Db.dbUsers.FirstOrDefault(f => f.Account == account && f.Pwd == pwd);
            if (obj != null)
            {
                string token = account.DESEncrypt(desKey);//加密产生token,
                HttpCookie cookie = new HttpCookie(cookieToken,token);
                HttpContext.Current.Response.Cookies.Add(cookie);//保存cookie
                return true;
            }
            else
            {
                return false;
            }
        }

token的产生就是登陆之后根据用户标识保存在cookie里,这样在客户端每次发送请求的时候都会带上token这个参数,如下:

        [Route("list"), HttpGet]
        public List<string> List(string  type,string token)
        {
            var obj = Db.dbUsers.FirstOrDefault(p => p.Account == token.DESDecrypt(desKey));
            //验证token
            if (obj != null)
            {
                //返回数据集
            }
            else
            {
                //非法请求
            }
        }

3.这样就可以验证token是否正确,一般都是用缓存。

Token的作用的就是判断请求是否是系统用户发出的,这样能有效识别请求用户的身份信息

2..参数签名如何生成?作用是什么?

参数签名sign:为了提高传参过程中,防止参数被恶意修改,在请求接口的时候加上sign可以有效防止参数被篡改,那么sign是如何起作用的呢?

看看它的生成方法就明白了

比如有这样一个接口http:127.0.0.1/api/product?&type=zl&p1=value1&p2=value2&p3=&sign=signValue

第一步:拼接参数字符串,除去sign参数本身和为空值的p3,那么剩下的就是字符串type=zl&p1=value1&p2=value2,然后按参数名字符升(降)序,得到字符串

p1=value1&p2=value2&type=zl

第二步:然后做参数名和值的拼接,得到字符串p1value1p2value2type=zl,注意编码,不能出现这种&quot; ,要转码后“后拼接

第三步:将字符串进行DES加密,假设p1value1p2value2type=zl进行des加密后的结果是abc123,最终得到的字符串abc123就是参数sign的值signValue

第四步:在接口中我们会接收到参数名sign的参数值abc123,然后解密得到字符串p1value1p2value2type=zl,再与接口中参数拼接排序后进行比较,如果不一样则说明参数的循序不一样,参数的值就一定是被修改过了。

总结:

1.接口的调用方和接口的提供方统一约定参数加密算法

2.参数签名就是对参数key ,value的一个记录。参数如果被修改肯定对不上参数签名,就不会调用请求

3.时间戳的作用?

在api请求的接口,客户端请求的发生时间便是时间戳,这个参数到了服务器,与服务器端时间对比,如果时间间隔较长则无效。

在asp.net mvc的开发webapi接口时,可以使用mvc的过滤器进行以上三个关键参数的拦截过滤。以下代码是在.net core中实现的,方法还是一样的,都是在进入方法前进行拦截,这是一个登录的api。

返回api结果是一个类ApiResult.cs,序列化成json对象,该类包含两个泛型方法请求成功的Ok方法,请求失败的Error方法

public class MyFilterAttribute : Microsoft.AspNetCore.Mvc.Filters.ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            var request_param = context.ActionArguments.Values;
            var  queryCollection = context.HttpContext.Request.Query;
            string account = string.Empty;
            string password = string.Empty;
            long timespan = 0;
            string signature = string.Empty;
            try
            {
                account = queryCollection.Where(p => p.Key == "account").Select(f => f.Value).FirstOrDefault().ToString();
                password = queryCollection.Where(p => p.Key == "password").Select(f => f.Value).FirstOrDefault().ToString();
                timespan = long.Parse(queryCollection.Where(p => p.Key == "timespan").Select(f => f.Value).FirstOrDefault().ToString());
                signature = queryCollection.Where(p => p.Key == "signature").Select(f => f.Value).FirstOrDefault().ToString();
            }
            catch (Exception ex)
            {
                var apiresult = ApiResult<bool>.Error("参数异常"+ex.ToString());
                context.Result = new JsonResult(apiresult);
            }
            //var accountName = context.RouteData.Values["accountName"].ToString()
            var expires_minute = (timespan - DateTime.Now.Ticks) / 60000000000;
            if (expires_minute> 10||expires_minute<-10)
            {
                var apimodel = ApiResult<bool>.Error("请求超时"+expires_minute);
                //var json = JsonConvert.SerializeObject(apimodel);
                JsonResult ret = new JsonResult(apimodel);
                context.Result =ret;
            }
            var ok = ("account" + account + "password" + password).Contains(signature);//ToDO 加密解密
            if (ok == false)
            {
                var apimodel = ApiResult<bool>.Error("非法请求");
                var json = JsonConvert.SerializeObject(apimodel);
                JsonResult ret = new JsonResult(apimodel);
                context.Result = ret;
            }
            base.OnActionExecuting(context);
        }

    }


作者:张林
原文标题: webapi token、参数签名是如何生成的
原文链接:http://blog.csdn.net/kebi007/article/details/72861532
转载随意注明出处

 有兴趣的可以关注一下我的微信公众号[dotNet全栈开发],分享一些编程相关的经典文章

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 在 .NET Core Web API 中进行 Token 验证通常涉及以下步骤: 1. 安装 Microsoft.AspNetCore.Authentication.JwtBearer 包。 2. 在 Startup.cs 文件的 ConfigureServices() 方法中添加身份验证服务,包括 JWTBearerOptions 配置。 3. 在 Startup.cs 文件的 Configure() 方法中启用身份验证中间件。 以下是一个基本的示例: ```csharp using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using System.Text; public void ConfigureServices(IServiceCollection services) { // 配置身份验证服务 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = Configuration["Jwt:Issuer"], ValidAudience = Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SecretKey"])) }; }); // 其他服务注册... } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 启用身份验证中间件 app.UseAuthentication(); // 其他中间件注册... } ``` 上述代码中,我们使用了 `AddAuthentication()` 方法来配置身份验证服务,并指定了 JWTBearerDefaults.AuthenticationScheme 作为默认身份验证方案。 接着,我们使用 `AddJwtBearer()` 方法来配置 JWTBearerOptions,其中 `TokenValidationParameters` 属性用于指定 Token 验证参数,例如验证发行者、受众、过期时间、签名密钥等。 最后,在 Configure() 方法中,我们调用 `UseAuthentication()` 方法来启用身份验证中间件,以确保每个请求都进行身份验证。 ### 回答2: 在.NET Core Web API中配置Token验证,可以按照以下步骤进行操作: 1. 添加NuGet包:在项目中添加Microsoft.AspNetCore.Authentication和Microsoft.AspNetCore.Authentication.JwtBearer两个NuGet包。 2. 配置认证服务:在Startup.cs文件的ConfigureServices方法中添加以下代码,以启用Bearer令牌验证: ``` services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, // 验证发行人 ValidateAudience = true, // 验证受众 ValidateLifetime = true, // 验证生命周期 ValidateIssuerSigningKey = true, // 验证颁发的签名密钥 ValidIssuer = "your_issuer", // 设置发行人 ValidAudience = "your_audience", // 设置受众 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key")) // 设置签名密钥 }; }); ``` 3. 配置授权:在Startup.cs文件的Configure方法中添加以下代码,以启用授权中间件: ``` app.UseAuthentication(); app.UseAuthorization(); ``` 4. 添加[Authorize]特性:在需要验证Token的Controller或Action上添加[Authorize]特性。 现在,当客户端请求受保护的Controller或Action时,将自动检查请求中的Token是否有效。如果Token验证失败,将返回401 Unauthorized状态码。如果验证成功,则可以继续处理请求。 ### 回答3: 在.NET Core WebAPI中配置Token验证主要涉及以下几个步骤: 1. 导入所需的包:首先,需要在`Startup.cs`文件中的`ConfigureServices`方法中导入所需的包。使用`Microsoft.AspNetCore.Authentication.JwtBearer`包来配置JWT验证。 2. 配置认证服务:在`ConfigureServices`方法中使用`services.AddAuthentication`来添加认证服务,并指定默认的身份验证方案。例如: ```csharp services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.RequireHttpsMetadata = false; // 是否要求HTTPS options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, // 验证发行者 ValidateAudience = true, // 验证接收者 ValidateLifetime = true, // 验证令牌有效期 ValidateIssuerSigningKey = true, // 验证签名 ValidIssuer = "your_issuer", ValidAudience = "your_audience", IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key")) }; }); ``` 在上述代码中,可以根据自己的需求调整参数值,如验证发行者、接收者、令牌有效期、签名等。 3. 应用认证中间件:在`Configure`方法中,使用`app.UseAuthentication()`来应用认证中间件。确保此代码位于路由中间件之前。例如: ```csharp app.UseAuthentication(); app.UseRouting(); app.UseAuthorization(); ``` 4. 使用`Authorize`特性:在需要进行Token验证的Controller或Action上,可以使用`Authorize`特性来标记,以进行访问控制。例如: ```csharp [Authorize] public class MyController : ControllerBase { // ... } ``` 5. 在请求中包含Token:最后,在发送请求时,需要在请求头中包含Bearer Token,以进行验证。例如: ``` Authorization: Bearer your_token ``` 通过以上配置,就可以在.NET Core WebAPI中实现Token验证。这样,当请求到达API时,API会验证Token的有效性,并对请求进行授权控制,确保只有拥有有效Token的用户可以访问受保护的资源。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值