webapi 自定义token验证 - CSDN
精华内容
参与话题
  • ASP.NET WebApi 实现Token验证

    万次阅读 2018-11-27 14:20:41
     我们知道WEB网站的身份验证一般通过session或者cookie完成的,登录成功后客户端发送的任何请求都带上cookie,服务端根据客户端发送来的cookie来识别用户。  WEB API使用这样的方法不是很适合,于是就有了基于...

    转自:https://www.cnblogs.com/dukang1991/p/5627584.html

    基于令牌的认证

        我们知道WEB网站的身份验证一般通过session或者cookie完成的,登录成功后客户端发送的任何请求都带上cookie,服务端根据客户端发送来的cookie来识别用户。

        WEB API使用这样的方法不是很适合,于是就有了基于令牌的认证,使用令牌认证有几个好处:可扩展性、松散耦合、移动终端调用比较简单等等,别人都用上了,你还有理由不用吗?

        下面我们花个20分钟的时间来实现一个简单的WEB API token认证:

    Step 1:安装所需的NuGet包:

    打开NuGet包管理器控制台,然后输入如下指令:

    Install-Package Microsoft.AspNet.WebApi.Owin -Version 5.1.2
    Install-Package Microsoft.Owin.Host.SystemWeb -Version 2.1.0
    Install-Package Microsoft.AspNet.Identity.Owin -Version 2.0.1
    Install-Package Microsoft.Owin.Cors -Version 2.1.0

    Step 2 在项目根目录下添加Owin“Startup”类

    using System;
    using System.Web.Http;
    
    using Owin;
    using Microsoft.Owin;
    using Microsoft.Owin.Security.OAuth;
    using SqlSugar.WebApi;
    
    [assembly: OwinStartup(typeof(WebApi.Startup))]
    namespace WebApi
    {
        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                HttpConfiguration config = new HttpConfiguration();
                ConfigureOAuth(app);
    
                WebApiConfig.Register(config);
                app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
                app.UseWebApi(config);
            }
    
            public void ConfigureOAuth(IAppBuilder app)
            {
                OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
                {
                    AllowInsecureHttp = true,
                    TokenEndpointPath = new PathString("/token"),
                    AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
                    Provider = new SimpleAuthorizationServerProvider()
                };
                app.UseOAuthAuthorizationServer(OAuthServerOptions);
                app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
            }
        }
    }

    Step 3:在项目根目录下添加验证类 SimpleAuthorizationServerProvider,为了简单用户的验证部分我们省略掉;

    using System.Threading.Tasks;
    using System.Security.Claims;
    using Microsoft.Owin.Security.OAuth;
    
    namespace WebApi
    {
        /// <summary>
        /// Token验证
        /// </summary>
        public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
        {
            public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
            {
                await Task.Factory.StartNew(() => context.Validated());
            }
    
            public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
            {
                await Task.Factory.StartNew(() => context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }));
                /*
                 * 对用户名、密码进行数据校验
                using (AuthRepository _repo = new AuthRepository())
                {
                    IdentityUser user = await _repo.FindUser(context.UserName, context.Password);
    
                    if (user == null)
                    {
                        context.SetError("invalid_grant", "The user name or password is incorrect.");
                        return;
                    }
                }*/
    
                var identity = new ClaimsIdentity(context.Options.AuthenticationType);
                identity.AddClaim(new Claim("sub", context.UserName));
                identity.AddClaim(new Claim("role", "user"));
                identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName));
    
                context.Validated(identity);
    
            }
        }
    }

    Step 4:让CORS起作用

    在ASP.NET Web API中启用OAuth的Access Token验证非常简单,只需在相应的Controller或Action加上[Authorize]标记

            [Authorize]
            public ActionResult Index()
            {
                ViewBag.Title = "Home Page";
    
                return View();
            }

    Step 5 : 请求 Token

    获取token, POST   http://localhost:23477/token

    参数BODY x-www-form-urlencoded 格式:

    grant_type=password&username=admin&password=123456

    返回状态200 结果为

    Step 5 调用api

    只要在http请求头中加上Authorization:bearer Token就可以成功访问API就成功了:

    GET   http://localhost:58192/api/testapi/testapi

    Authorization : bearer 

    T5jF97t5n-rBkWcwpiVDAlhzXtOvV7Jw2NnN1Aldc--xtDrvWtqLAN9hxJN3Fy7piIqNWeLMNm2IKVOqmmC0X5_s8MwQ6zufUDbvF4Bg5OHoHTKHX6NmZGNrU4mjpCuPLtSbT5bh_gFOZHoIXXIKmqD3Wu1MyyKKNhj9XPEIkd9bl4E9AZ1wAt4dyUxmPVA_VKuN7UvYJ97TkO04XyGqmXGtfVWKfM75mNVYNhySWTg

     

      结果为:

     

    展开全文
  • 在使用MVC WebApi的授权发放GrantResourceOwnerCredentials时候 如何获得自定义返回错误 而不是 context.SetError的默认格式 context.SetError 显示的是 {"error":""}这种 我想要自定义的 比如 {"errorCode":0,...
  • Asp.net Web Api开发(第一篇) 自定义HTTP消息拦截器,实现统一消息拦截,Token验证,签名验证等。

    拦截器类的实现需要继承DelegatingHandler,借用一张网络上的图,我们要实现的拦截器即图中的Message Handler这一层。

    WebAPI5-2

    上代码:

    /// <summary>
        /// HTTP消息拦截器
        /// </summary>
        public class RequestHandler : DelegatingHandler
        {
            /// <summary>
            /// 拦截请求
            /// </summary>
            /// <param name="request">请求</param>
            /// <param name="cancellationToken">用于发送取消操作信号</param>
            /// <returns></returns>
            protected async override Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
            {
                //获取URL参数
                NameValueCollection query = HttpUtility.ParseQueryString(request.RequestUri.Query);
                //获取Post正文数据,比如json文本
                string fRequesContent = request.Content.ReadAsStringAsync().Result;
    
                //可以做一些其他安全验证工作,比如Token验证,签名验证。
                //可以在需要时自定义HTTP响应消息
                //return SendError("自定义的HTTP响应消息", HttpStatusCode.OK);
    
                //请求处理耗时跟踪
                Stopwatch sw = new Stopwatch();
                sw.Start();
                //调用内部处理接口,并获取HTTP响应消息
                HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
                //篡改HTTP响应消息正文
                response.Content = new StringContent(response.Content.ReadAsStringAsync().Result.Replace(@"\\", @"\"));
                sw.Stop();
                //记录处理耗时
                long exeMs = sw.ElapsedMilliseconds;
                return response;
            }
    
            /// <summary>
            /// 构造自定义HTTP响应消息
            /// </summary>
            /// <param name="error"></param>
            /// <param name="code"></param>
            /// <returns></returns>
            private HttpResponseMessage SendError(string error, HttpStatusCode code)
            {
                var response = new HttpResponseMessage();
                response.Content = new StringContent(error);
                response.StatusCode = code;
                return response;
            }
        }

    既然实现了相关的拦截器,那我们得找个地方把它插入到web api的处理流程中去,


    代码插入到WebApiConfig.cs中:

    public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                // Web API 配置和服务
                config.MessageHandlers.Add(new RequestHandler());
                // Web API 路由
                config.MapHttpAttributeRoutes();
            }
        }
    然后应用该webapi配置

    public class WebApiApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                GlobalConfiguration.Configure(WebApiConfig.Register);
                GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();//设置返回值统一为json
            }
        }

    到此就完成了。自己尝试建个webapi项目测试下吧。

    展开全文
  • WebApi_基于Token的身份验证——JWT(z)

    千次阅读 2017-08-03 22:22:52
    基于Token的身份验证——JWT JWT是啥? JWT就是一个字符串,经过加密处理与校验处理的字符串,形式为: A.B.C A由JWT头部信息header加密得到B由JWT用到的身份验证信息json数据加密得到C...
    
    
    

    JWT是啥?

    JWT就是一个字符串,经过加密处理与校验处理的字符串,形式为:

    A.B.C

    A由JWT头部信息header加密得到
    B由JWT用到的身份验证信息json数据加密得到
    C由A和B加密得到,是校验部分

    怎样生成A?

    header格式为:

    {
        "typ": "JWT",
        "alg": "HS256" 
    }
    

      

    它就是一个json串,两个字段是必须的,不能多也不能少。alg字段指定了生成C的算法,默认值是HS256
    将header用base64加密,得到A
    通常,JWT库中,可以把A部分固定写死,用户最多指定一个alg的取值

    怎样计算B?

    根据JWT claim set[用base64]加密得到的。claim set是一个json数据,是表明用户身份的数据,可自行指定字段很灵活,也有固定字段表示特定含义(但不一定要包含特定字段,只是推荐)。
    这里偷懒,直接用php中的代码来表示claim set了,重在说明字段含义:

    $token = array(
        "iss" => "http://example.org",   #非必须。issuer 请求实体,可以是发起请求的用户的信息,也可是jwt的签发者。
        "iat" => 1356999524,                #非必须。issued at。 token创建时间,unix时间戳格式
        "exp" => "1548333419",            #非必须。expire 指定token的生命周期。unix时间戳格式
        "aud" => "http://example.com",   #非必须。接收该JWT的一方。
        "sub" => "jrocket@example.com",  #非必须。该JWT所面向的用户
        "nbf" => 1357000000,   # 非必须。not before。如果当前时间在nbf里的时间之前,则Token不被接受;一般都会留一些余地,比如几分钟。
        "jti" => '222we',     # 非必须。JWT ID。针对当前token的唯一标识
    
        "GivenName" => "Jonny", # 自定义字段
        "Surname" => "Rocket",  # 自定义字段
        "Email" => "jrocket@example.com", # 自定义字段
        "Role" => ["Manager", "Project Administrator"] # 自定义字段
    );
    

      

    JWT遵循RFC7519,里面提到claim set的json数据中,自定义字段的key是一个string,value是一个json数据。因此随意编写吧,很灵活。

    个人初学,认为一个最基本最简单最常用的claim set为:

    $token=array(
        "user_id" => 123456, #用户id,表明用户
        "iat" => 1356999524, #token发布时间
        "exp" => 1556999524, #token过期时间
    );

    将claim set加密后得到B,学名payload

    怎样计算C?

    A.B使用HS256加密(其实是用header中指定的算法),当然加密过程中还需要密钥(自行指定的一个字符串)。
    加密得到C,学名signature,其实就是一个字符串。作用类似于CRC校验,保证加密没有问题。

    好了,现在A.B.C就是生成的token了。

    怎样使用token?

    可以放到HTTP请求的请求头中,通常是Authorization字段。
    也有人说放到cookie。不过移动端app用cookie似乎不方便。

    token应用流程?

    1. 初次登录:用户初次登录,输入用户名密码
    2. 密码验证:服务器从数据库取出用户名和密码进行验证
    3. 生成JWT:服务器端验证通过,根据从数据库返回的信息,以及预设规则,生成JWT
    4. 返还JWT:服务器的HTTP RESPONSE中将JWT返还
    5. 带JWT的请求:以后客户端发起请求,HTTP REQUEST HEADER中的Authorizatio字段都要有值,为JWT
    服务器端在处理到达的request之前,会将request中的Token值与保存在当前用户session中的令牌值进行比较,看是否匹配。
    
    在处理完该request后,且在response发送给客户端之前,将会产生一个新的 Token,该Token除传给客户端以外,也会将用户session中保存的旧的Token进行替换。
    
    这样,如果用户会退到刚才的提交页面并再次提交的话,客户端传过来的Token值和服务器端的不一致,从而有效地防止了重复提交地发生。

     

     

    展开全文
  • 在ASP.NET WebService服务中可以通过SoapHead验证机制来实现,那么在ASP.NET WebApi中我们应该如何保证我们的接口安全呢?在上此分享课程中阿笨给大家带来了传统的基于Session方式的Token签名...

    一、前言

    明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性。那么对于我们来说,如何确保数据的安全将会是需要思考的问题。在ASP.NET WebService服务中可以通过SoapHead验证机制来实现,那么在ASP.NET WebApi中我们应该如何保证我们的接口安全呢?在上此分享课程中阿笨给大家带来了传统的基于Session方式的Token签名验证,那么本次分享课程阿笨给大家带来另外一种基于JWT方式解决方案。如果您对本次分享课程《ASP.NET WebApi 基于JWT实现Token签名认证》感兴趣的话,那么请跟着阿笨一起学习吧。

    1.1、本次分享课程包含知识点如下:

    1)、对ASP.NET WebApi 如何实现身份认证进一步了解和学习。

    2)、掌握.NET中的JWT组件的基本运用。

    3)、.NET开源轻量级HTTP网络请求框架RestSharp在ASP.NET WebApi中的基本运用。

    4)、ASP.NET WebAPI自定义HTTP参数绑定支持多参数POST请求。(强烈推荐)

    5)、ASP.NET WebApi 基于JWT(Json Web Token)实现Token签名认证。

    1.2、一句话总结:今天我们要解决的问题?

    ASP.NET WebAPI如何保证客户端以安全的方式进行访问。

    废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运

    二、概念名称含义介绍

    2.1、什么是JWT?

    2.2、JWT长什么样?

    2.3、JWT的构成

    三、WebApi如何实现JWT实现Token签名认证原理讲解

    3.1、ASP.NET WebAPI如何保证客户端以安全的方式进行访问

    3.2、基于JWT实现Token签名认证基本思路如下:

    四、实战源码在线实例演示

    登录

     

    基于JWT实现Token签名认证

     

    JWT在线验证

    五、总结

     

    作者:阿笨 

          官方QQ群:422315558 跟着阿笨一起玩NET 574187616跟着阿笨一起玩NET(二) 967920586跟着阿笨一起玩ASP.NET 

          【网易云课堂主页】:https://study.163.com/provider/2544628/index.htm?share=2&shareId=2544628

          【腾讯课堂主页】:https://abennet.ke.qq.com/

          【微信公众号】:http://dwz.cn/ABenNET 

     

    展开全文
  • 使用JWT Token进行RestFul API权限验证

    千次阅读 2018-07-01 17:04:03
    后端提供的RestFul API一般都需要进行权限验证,而Web框架一般采用Cookies+Session来进行认证。但RestFul API属于无状态协议,而在后台使用Session的话,由于Session本身需要服务端进行维持,这样就破坏了Rest的无...
  • H5微信分享、自定义微信分享

    万次阅读 热门讨论 2019-08-12 08:54:09
    在微信公众平台的接口权限内可以看到,个人版公众号是没有权限自定义微信分享的,所以需要企业版公众号并开通认证。 具体步骤: 步骤一:绑定域名 先登录微信公众平台进入“公众号设置”的“功能设置”里...
  • ap.net后端典型的就是采用webapi,但是发现很多时候大家对webapi并不了解,这里我们来说说输入参数的验证。前一段时间我们项目组也开始使用webapi来开发接口,开发之初发现设计了很多输入参数的验证规则(不适用,不...
  • 开发环境:ASP.NET Core Web API 目标框架:.NET Core 2.2 权限认证:JWT Bearer 提供者:成长的小猪 Jason Song 应用场景:当前我们给微信小程序提供服务接口,接口中使用了权限认证这一块,当我使用 JWT Bearer ...
  • 创建一个类,继承自UserFilter,实现OnAccessDenied函数即可。 ...import org.apache.shiro.web.filter.authc.UserFilter; import org.apache.shiro.web.servlet.ShiroHttpServletRequest; ...
  • token验证技术的原理和简单实现

    万次阅读 2018-12-14 09:37:38
    为什么使用Token验证:  在Web领域基于Token的身份验证随处可见。在大多数使用Web API的互联网公司中,token是多用户下处理认证的最佳方式。  以下几点特性会让你在程序中使用基于Token的身份验证  1.无状态、可...
  • yii2项目实战-restful api之授权验证

    万次阅读 2017-03-15 09:43:36
    什么是restful风格的api呢?我们之前有写过大篇的文章来介绍其概念以及基本操作。 既然写过了,那今天是要说点什么吗? 这篇文章主要针对实际场景中api的部署来写。 我们今天就来大大的侃侃那些年api遇到的...
  • 一、课程介绍 ...在ASP.NETWebService服务中可以通过SoapHead验证机制来实现,那么在ASP.NET WebApi中我们应该如何保证我们的接口安全呢?如果您对本次分享课程《ASP.NET WebApi 基于分布式Sessi...
  • Springboot实现filter拦截token验证和跨域

    万次阅读 多人点赞 2019-09-11 17:04:27
    在使用API接口授权验证时,token自定义的方式实现起来不需要引入其他东西,关键是简单实用。合法登陆后一般使用用户UID+盐值+时间戳使用多层对称加密生成token并放入分布式缓存中设置固定的过期时间长(和session...
  • api 接口 shiro 权限控制 springmvc

    千次阅读 2018-07-31 11:19:27
    采用前后端分离的方式,前端api接口访问,后端通过shiro权限控制。 设置跨域访问后,ajax携带cookie需要设置允许的access-orign。 可通过如下设置动态的。 // filter 中设置 if(request.getHeader("Origin&...
  • springboot2.0中添加自定义拦截器

    千次阅读 2018-05-28 11:40:56
    业务场景: 由于需要使用拦截器做apitoken验证,想着添加一个自定义的拦截器去做这个验证。解决思路: 百度了一堆添加拦截器的方法试了下结果都是无效或者是过期方法,于是参考springboot官方文档点击打开链接有...
  • App开放接口api安全性—Token签名sign的设计与实现

    万次阅读 多人点赞 2015-09-28 14:56:55
    在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等,但是为了安全...
  • Authentication

    千次阅读 2018-12-18 12:39:00
    认证 (Authentication) 身份验证需要可插拔。—— Jacob Kaplan-Moss, “REST worst practices” 身份验证是将传入请求与...REST framework 提供了一些开箱即用的身份验证方案,并且还允许您实现自定义方案。 身份验...
  • 为什么是 JWT BearerASP.NET Core 在 Microsoft.AspNetCore.Authentication 下实现了一系列认证, 包含 Cooki...
  • Spring AOP自定义注解 身份验证

    千次阅读 2017-04-27 16:09:36
    最近碰到APP开发权限验证的问题 用过滤器不能解决某些无需验证的方法 所以最终选择用AOP 解决 代码如下定义一个权限注解 package com.thinkgem.jeesite.common.annotation; import java.lang.annotation.Element...
1 2 3 4 5 ... 20
收藏数 15,389
精华内容 6,155
热门标签
关键字:

webapi 自定义token验证