webapi验证调用用户是否合法_android调用webapi ,webapi怎么接收 - CSDN
精华内容
参与话题
  • API权限控制

    万次阅读 2018-03-01 18:31:01
    API不存在用户登录这样的概念,我们是通过令牌来管理用户身份的。在传统网站用户登录的概念,转换成用户获取令牌,这个令牌,...用户在每一次调用接口的时候,都需要携带他所获取的令牌,如果令牌合法,那我们认为...

    在API不存在用户登录这样的概念,我们是通过令牌来管理用户身份的。在传统网站用户登录的概念,转换成用户获取令牌,这个令牌,是代表用户身份的 。虽然都是类似用户输入账号密码的东西,但是理解和概念上时不一样的。API是用户拿到令牌,这个令牌具有用户的身份,而且这个身份是分级别的。有些级别是管理员级别,有些级别是普通用户级别。

    用户在每一次调用接口的时候,都需要携带他所获取的令牌,如果令牌合法,那我们认为你有权限调用接口,否则没有权限访问。


    用户一定要获取一个Token,其代表用户身份的。客户端要获取令牌需要携带账号密码,然后获取我们服务器getToken接口。这样就完成用户具体注册的内容,最终客户端是可以拿到服务器的Token的,这个Token就是用于用户的身份识别。我们获取令牌是为了携带令牌,访问API接口。


    这个流程和上面流程大同小异。客户端携带令牌访问下单接口。在我们接口内部业务处理中,他需要比对令牌,根据令牌确认用户身份。有些用户身份是可以访问下单接口的,有些是不能的。不是说携带了令牌,就一定可以访问接口,令牌也许在技术上是合法的,同时身份不对也不行。接口如何验证Token?首先Token一定要有,如果这个Token在用户表根本没有,说明Token是伪造的 ,随意搞的字符串,肯定不合法,别想访问接口,以上是第一个验证。第二个验证,你有Token还不行,你还得没有过期,因为Token是有过期时间的,不可能用户获得令牌,5年过去了还能访问。Token有一个有效期,过了有效期同样不合法。第三层面的验证是,Token合法,没有过有效期,还要验证Token的权限分组,位于某一个分组,并且这个分组有权限对下单分组进行调用的,才可以调用我们的下单接口,否则没有权限一样拒绝访问。这是最简单的接口校验模型3层。

    function getRandChar($length)
    {
        $str = null;
        $strPol ="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
        $max = strlen($strPol) - 1;
    
        for($i=0;
            $i < $length;
            $i++){
            $str .= $strPol[rand(0,$max)];
        }
    }


    展开全文
  • WebApi的安全性解决方案

    千次阅读 2018-11-12 16:20:42
      WebApi的小白想要了解一些关于WebApi安全性相关的问题,本篇文章是整理一些关于WebApi安全、权限认证的文章。 二、内容正文  2.1 不进行验证  客户端调用:http://api.xxx.com/getInfo?Id=value 如上,这种...

    一、前言

      WebApi的小白想要了解一些关于WebApi安全性相关的问题,本篇文章是整理一些关于WebApi安全、权限认证的文章。

    二、内容正文

     2.1 不进行验证

     客户端调用:http://api.xxx.com/getInfo?Id=value
    如上,这种方式简单粗暴,在浏览器直接输入"http://api.xxx.com/getInfo?Id=value",即可获取到相关的信息了,但是这样的方式会存在很严重的安全性问题,没有进行任何的验证,大家都可以通过这个方法获取到产品列表,导致信息泄露。
    那么我们就会有下面的疑问了:

    1. 如何验证调用者身份呢?
    2. 如何防止参数被篡改呢?
    3. 如何保证请求的唯一性?
    4. 如何保证请求的唯一性,防止请求被恶意攻击呢?

     2.2 使用TOKEN+签名认证

      原理如下:

    • 1.做一个认证服务,提供一个认证的WebApi,用户先访问它获取对应的Token

    • 2.用户拿着相应的Token以及请求的参数和服务器端提供的签名算法计算出签名后再去访问指定的Api

    • 3.服务器端每次接收到请求就获取对应用户的Token和请求参数,服务器端再次计算签名和客户端签名做对比,如果验证通过则正常访问相应的Api,验证失败则返回具体的失败信息。

    参考链接:

     2.3 基于Owin OAuth

     使用OAuthClient Credential Grant授权方式,在服务端通过Authorization Server的一个实现成功发放了Access Token,并在客户端成功拿到了Access Token。在ASP.NET WebApi中启用OAuth的Access Token验证非常简单,只需在相应的Controller或Action加上[Authorize]标记。在ASP.NET中基于Owin OAuth`
    参考文章:

      2.4 使用签名来保证ASP.NET MVC 和 WebApi的接口安全

     给每个http请求添加一个签名,服务端来验证签名的合法性,如果签名合法则执行响应的操作,如果签名非法则直接拒绝请求。
    签名算法

    签名算法一般都使用Hash散列算法,常用的有MD5,SHA系列算法。这些算法可以根据不同的输入,计算出不同的结果,而且碰撞的概率很低。
    签名算法跟加密算法不是一回事。HMAC SHA作为一种更加安全的签名算法,使用一个Key来影响签名的结果。这样同样的输入配合不同的Key可以得出不同的签名,更加安全。

    签名参数

    可以用Http请求的queryString然后加上时间戳还有随机数来作为签名的参数。

    参考链接:

    展开全文
  • WebService加密

    千次阅读 2009-01-07 13:16:00
    众所周知,WebService访问API是公开的,知道其URL者均可以研究与调用。那么,在只允许注册用户的WebService应用中,如何确保API访问和通信的安全性呢?本文所指的访问与通信安全性包括:访问安全性:当前访问者是...
     众所周知,WebService访问API是公开的,知道其URL者均可以研究与调用。那么,在只允许注册用户的WebService应用中,如何确保API访问和通信的安全性呢?本文所指的访问与通信安全性包括:
    • 访问安全性:当前访问者是注册合法用户
    • 通信安全性:客户端与服务器之间的消息即使被第三方窃取也不能解密
    本文安全的基本思路是:
    • 注册用户登录时使用RSA加密
    • Web API调用参数使用DES加密(速度快)
    • Web API调用中包含一个身份票据Ticket
    • Web服务器保存当前Ticket的Session,包括:Ticket、DES加密矢量、注册用户基本信息

    1 WebService身份验证


    确保注册用户的访问安全,需要如下步骤:1)产生一个当前客户端机器票据(Ticket);2)请求服务器RSA公钥(RSAPublicKey);3)使用RSA加密登录口令及发布DES加密矢量(DESCipherVector)。

    1.1  产生客户端机器票据Ticket

    一般而言,可以由客户端机器根据自己的MAC、CPU序列号等唯一标识产生一个本机器的Ticket字符串票据,其目的是:唯一标识当前客户端,防止其它机器模仿本客户端行为。

    1.2  请求服务器公钥RSAPublicKey

    客户端携带票据Ticket向服务器请求RSA公钥RSAPublicKey。在服务器端,一般采取如下策略产生RSA加密钥匙:
    • Application_Start时产生一个1024或更长的RSA加密钥匙对。如果服务器需要长久运行,那么Application_Start产生的RSA可能被破解,替代方案是在当前Session_Start时产生RSA加密钥匙对
    • 保存当前票据对应的客户帐号对象,即:Session[Ticket] = AccountObject,在确认身份后在填写AccountObject具体内容:帐号、RSA加密钥匙对、DES加密矢量
    完成上述步骤后,服务器将RSAPublicKey传回给客户端。

    1.3  加密登录口令及DES加密矢量

    客户端获得RSAPulbicKey后,产生自己的DES加密矢量DESCipherVector(至少要8位及以上,该加密矢量用于以后的常规通信消息加密,因为其速度比RSA快)。接着,客户端使用RSAPublicKey加密登录帐号、口令及DESCipherVector,连同Ticket,发送到服务器并请求身份验证。登录API格式如下:

    public void Login(string Ticket, string cipherLongID, string cipherPassword);

    如果验证成功,服务器将当前帐号信息、RSA钥匙、DESCipherVector等保存到会话Session[Ticket]中。

    2 WebService通信安全性


    2.1  加密WebService API参数


    身份确认后,在客户端调用的WebService API中,必须包括参数Ticket,其它参数则均使用DESCipherVector加密。服务器端返回的消息也同样处理。例如,提交一个修改email的函数定义为:

    public void ModifyEmail(string Ticket, string cipherEmai);

    2.2  客户端解密消息

    客户端接收到服务器返回消息后,先做解密操作,如果成功则进入下步处理。否则抛出加密信息异常。

    2.3  服务器端解密消息

    服务器接收到客户提交的API请求后,首先验证Ticket的合法性,即查找Session中是否有该票据以验证客户身份。然后,解密调用参数。如果成功则进入下不操作,否则返回操作异常消息给客户端。

    需要指出,如果第三方截获全部会话消息,并保留其Ticket,此时服务器端仍然认可这个第三方消息。但是,第三方不能浏览,也不能修改调用API的参数内容,此时解密参数时将抛出异常。

    上面探讨了一个基于加密的WebService访问与通信安全方法,即使第三方获取消息,不能查看原始内容,也不能修改内容,保证了WebService API的安全性。

    本方案还是存在一个明显的缺陷,即:如果直接修改调用参数内容,在客户端或服务器端解密时不抛出异常,如何处理?如何保证解密时一定抛出异常?这个待以后研究后回答。
    展开全文
  • webapi鉴权使用token令牌

    千次阅读 2018-07-08 22:51:14
    一为什么使用Token验证:在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认 证,那么这就需要用户提供一些信息,比如...

    一为什么使用Token验证:

    在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认
    证,那么这就需要用户提供一些信息,比如用户名密码等,但是为了安全起见让用户暴露的明文密码次数越少越好,我们一般在web项目中,大多数采用保
    存的session中,然后在存一份到cookie中,来保持用户的会话有效性,但是会在客户端关闭时丢失,还有过期问题。但是app更像一个离线客户端, 因为
    它的用户数据保存在本地,可以实现免登陆等,只在它拿数据的时候 提交认证信息就行了 。

    二什么场景使用Token验证:

    现在很多基于restful的api接口都有个登录的设计,也就是在发起正式的请求之前先通过一个登录的请求接口,申请一个叫做token的东西。申请成功后,后面其他的请求都要带上这个token,服务端通过这个token验证请求的合法性。这个token通常都有一个有效期,一般就是几个小时。


    三Token验证有什么特点
    1.无状态、可扩展
    2.支持移动设备
    3.跨程序调用

    4.安全


    四Token验证的原理
    基于Token的身份验证是无状态的,我们不将用户信息存在服务器或Session中。用户登录后向服务器提供用户认证信息(如账户和密码),服务器认证完后给客户端返回一个Token令牌,用户再次获取信息时,带上此令牌,如果令牌正取,则返回数据。对于获取Token信息后,访问用户相关接口,客户端请求的url需要带上如下参数:
       时间戳:timestamp
       Token令牌:token

    然后将所有用户请求的参数按照字母排序(包括timestamp,token),然后更具MD5加密(可以加点盐),全部大写,生成sign签名,这就是所说的url签名算法。然后登陆后每次调用用户信息时,带上sign,timestamp,token参数。


    五Token如何生成

    token实例

    /**
     * Token 的 Model 类,可以增加字段提高安全性,例如时间戳、url 签名
     * @author ScienJus
     * @date 2015/7/31.
     */
    public class TokenModel {
    
        // 用户 id
        private long userId;
    
        // 随机生成的 uuid
        private String token;
    
        public TokenModel (long userId, String token) {
            this.userId = userId;
            this.token = token;
        }
    
        public long getUserId () {
            return userId;
        }
    
        public void setUserId (long userId) {
            this.userId = userId;
        }
    
        public String getToken () {
            return token;
        }
    
        public void setToken (String token) {
            this.token = token;
        }
    }


    /**
     * 对 token 进行操作的接口
     * @author ScienJus
     * @date 2015/7/31.
     */
    public interface TokenManager {
    
        /**
         * 创建一个 token 关联上指定用户
         * @param userId 指定用户的 id
         * @return 生成的 token
         */
        public TokenModel createToken (long userId);
    
        /**
         * 检查 token 是否有效
         * @param model token
         * @return 是否有效
         */
        public boolean checkToken (TokenModel model);
    
        /**
         * 从字符串中解析 token
         * @param authentication 加密后的字符串
         * @return
         */
        public TokenModel getToken (String authentication);
    
        /**
         * 清除 token
         * @param userId 登录用户的 id
         */
        public void deleteToken (long userId);
    
    }
    
    /**
     * 通过 Redis 存储和验证 token 的实现类
     * @author ScienJus
     * @date 2015/7/31.
     */
    @Component
    public class RedisTokenManager implements TokenManager {
    
        private RedisTemplate redis;
    
        @Autowired
        public void setRedis (RedisTemplate redis) {
            this.redis = redis;
            // 泛型设置成 Long 后必须更改对应的序列化方案
            redis.setKeySerializer (new JdkSerializationRedisSerializer ());
        }
    
        public TokenModel createToken (long userId) {
            // 使用 uuid 作为源 token
            String token = UUID.randomUUID ().toString ().replace ("-", "");
            TokenModel model = new TokenModel (userId, token);
            // 存储到 redis 并设置过期时间
            redis.boundValueOps (userId).set (token, Constants.TOKEN_EXPIRES_HOUR, TimeUnit.HOURS);
            return model;
        }
    
        public TokenModel getToken (String authentication) {
            if (authentication == null || authentication.length () == 0) {
                return null;
            }
            String [] param = authentication.split ("_");
            if (param.length != 2) {
                return null;
            }
            // 使用 userId 和源 token 简单拼接成的 token,可以增加加密措施
            long userId = Long.parseLong (param [0]);
            String token = param [1];
            return new TokenModel (userId, token);
        }
    
        public boolean checkToken (TokenModel model) {
            if (model == null) {
                return false;
            }
            String token = redis.boundValueOps (model.getUserId ()).get ();
            if (token == null || !token.equals (model.getToken ())) {
                return false;
            }
            // 如果验证成功,说明此用户进行了一次有效操作,延长 token 的过期时间
            redis.boundValueOps (model.getUserId ()).expire (Constants.TOKEN_EXPIRES_HOUR, TimeUnit.HOURS);
            return true;
        }
    
        public void deleteToken (long userId) {
            redis.delete (userId);
        }
    }



    展开全文
  • 及页面操作权限验证是B/S系统的基础功能,一个功能复杂的业务应用系统,通过角色授权来控制用户访问,本文通过Form认证,Mvc的Controller基类及Action的权限验证来实现Web系统登录,Mvc前端权限校验以及WebApi服务端...
  • (原创文章,转载请注明来源:http://blog.csdn.net/hulihui)...本文所指的访问与通信安全性包括:访问安全性:当前访问者是注册合法用户通信安全性:客户端与服务器之间的消息即使被第三方窃取也不能解密本文安全的
  • Web API数据传输加密

    万次阅读 2015-08-18 12:03:12
    1、Web API的接口访问分类 Web API接口的访问方式,大概可以分为几类: 1)一个是使用用户令牌,通过Web API接口进行数据访问。这种方式,可以有效识别用户的身份,为用户接口返回用户相关的数据,如包括用户...
  • 用java调用,开发工具输入https...最后改用C#调用 对方是WCF发布的服务,客户端调用必须framework3.5以上 打开vs,新建asp.net网站 添加服务引用,填写wsdl地址. 1:证书问题: 证书不用在代码里写,开始运行输入m
  • 用户登录及API接口设计

    万次阅读 2018-12-11 14:06:40
    comments ...1、如果是web分离开发秘钥可以采用非对称加密; 2、安全性上面采用https(Ps:在安全性要求不是非常严格的情况下,不用TLS的“安全”,都是掩耳盗铃) ------------------------------...
  • 如何实现RESTful Web API的身份验证

    千次阅读 2016-07-28 11:21:02
    最近想拿一个小项目来试水RESTful Web API,项目只有几个调用,比较简单,但同样需要身份验证,如果是传统的网站的话,那不用说,肯定是用户名+密码在登录页获得登录Token,并把登录Token记在Cookie和Session中作为...
  • 基于SpringBoot的WEB API项目的安全设计

    千次阅读 2020-01-16 12:41:28
    SpringBoot的开箱即用功能,大大降低了上手一个WEB应用的门槛,友好的REST接口支持,在SpringCloud微服务体系中可编程性大大提高,本篇基于一个面向企业调用用户WEB API项目,基于SpringBoot来构建,简单看下...
  • 2.在VS中创建WebAPI项目 在nuget中安装: Microsoft.AspNet.WebApi.Owin Microsoft.Owin.Host.SystemWeb 这两个类库并添加Owin启动类Startup using System; using System.Threading.Tasks; using ...
  • WebApi安全性 使用TOKEN+签名验证

    千次阅读 2017-10-18 16:23:41
    首先问大家一个问题,你在写开放的API...请求来源(身份)是否合法?请求参数被篡改?请求的唯一性(不可复制),防止请求被恶意攻击 为了保证数据在通信时的安全性,我们可以采用TOKEN+参数签名的方式来进行相关验证
  • API接口设计要考虑的因素

    千次阅读 2018-07-03 09:46:07
    一、接口版本化二、请求参数的规范性三、请求参数的统一处理四、返回码及信息提示的规范性五、返回参数类型及格式的规范性六、接口安全验证七、接口调用频率的限制...
  • 微信小程序合法域名配置-不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书 很多教程说按照以上方式调用即可。但是当我们在程序中实际调用以上程序时,就会报错, http://14.116.211.92:8099 不在以下 ...
  • Rest API的认证模式

    千次阅读 2020-05-05 06:29:02
    Rest API的认证模式Rest API的认证模式AppKeyAppKey + SecretJWTOAuth Rest API的认证模式 微服务系统中,很多团队采用了API驱动设计开发,服务之间的调用都通过API来实现的。为了统一管理API,一般都会在前面部署...
  • 本文属于个人原创作品、个人总结,谢绝转载、抄袭。如果您有疑问或者希望沟通交流...官方文档中的C#回调demo是ashx文件实现,我这里是应用到个人公司内部企业的WebAPI项目实现,在钉钉上注册回调地址之后,钉钉调用W...
  • 二、OpenStack入门 之 架构分析

    万次阅读 2016-04-16 22:52:02
    OpenStack入门 之 架构分析写在前面学习目标: 了解 OpenStack 各组件的逻辑关系; 了解 OpenStack 的各组件...OpenStack 的API; OpenStack 组件间的通信关系; OpenStack 中几种不同的存储; OpenStack 工作流程; Op
1 2 3 4 5 ... 20
收藏数 19,003
精华内容 7,601
关键字:

webapi验证调用用户是否合法