1.创建控制台应用程序

在 “文件” 菜单上,选择"项目"。 从安装的 “视觉C#对象” 下,选择 " Windows 桌面",然后选择 "控制台应用(.net Framework) "。 将项目命名为 “OwinSelfhostSample”,然后选择 “确定”。

2.添加 Web API 和 OWIN 包

从 “工具” 菜单中,选择 " NuGet 包管理器",然后选择 “程序包管理器控制台”。 在“Package Manager Console”窗口中,输入以下命令:

Install-Package Microsoft.AspNet.WebApi.OwinSelfHost

这会安装 WebAPI OWIN selfhost 包和所有必需的 OWIN 包。
因为这里会用到Mysql数据库,所以还要添加Mysql.Date,添加方法自行百度。

3.为自承载配置 Web API

在解决方案资源管理器中,右键单击项目并选择 “添加 / 类” 添加新类。 将此类命名为 Startup。

将代码替换成如下代码

  public class Startup{public void Configuration(IAppBuilder app){HttpConfiguration config = new HttpConfiguration();ConfigureOAuth(app);//配置路由config.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional });app.UseWebApi(config);}public void ConfigureOAuth(IAppBuilder app){OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions(){AllowInsecureHttp = true,TokenEndpointPath = new PathString("/api/token"),AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),Provider = new ApplicationOAuthProvider()};app.UseOAuthAuthorizationServer(OAuthServerOptions);app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());}}

4.添加 Web API 控制器

接下来,添加 Web API 控制器类。 在解决方案资源管理器中,右键单击项目并选择 “添加 / 类” 添加新类。 将此类命名为 ValuesController。
将此文件中的所有样本代码替换为以下代码:

//此处添加授权认证,加上之后必须用token认证才可以访问接口[Authorize]public class ValuesController : ApiController{// GET api/values public string  Get(){//string connetStr = "server = 192.168.0.121; user = admin; password = 123456; database = Login; persistsecurityinfo = True;";//MysqlHelper mysqlHelper = new MysqlHelper(connetStr);//mysqlHelper.Open();//string sql = "Select * from Login_t1 ";//MySqlDataReader mySqlDataReader = mysqlHelper.ExecuteReader(sql);//if (mySqlDataReader.HasRows)//     return "数据库连接成功";//else//     return "数据库连接失败";//return new string[] { "value1", "value2" };return "登录成功!";}// GET api/values/5 public string Get(int id){return "value";}// POST api/values public void Post([FromBody] string value){}// PUT api/values/5 public void Put(int id, [FromBody] string value){}// DELETE api/values/5 public void Delete(int id){}}

5.添加ApplicationOAuthProvider认证类

右键单击项目创建新类并命名为ApplicationOAuthProvider
复制以下代码:

public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider{public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context){context.Validated();return Task.FromResult<object>(context);}public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context){string username = context.UserName;string password = context.Password;//此处连接的数据库为虚拟机中的Mysql数据库,数据库创建及定义请自行百度string connetStr = "server = 192.168.0.121; user = admin; password = 123456; database = Login; persistsecurityinfo = True;";MysqlHelper mysqlHelper = new MysqlHelper(connetStr);mysqlHelper.Open();string sql = "Select * from Login_t1  WHERE username='" + username +"'AND password= '" + password+"'" +"";MySqlDataReader mySqlDataReader = mysqlHelper.ExecuteReader(sql);if (mySqlDataReader.HasRows){Console.WriteLine( "用户名正确!");}else{Console.WriteLine("用户名或者密码错误");return null;}
//如果不熟悉Mysql数据库,也可以用下面注释的代码,直接写死。//if (username != "test001" || password != "123456")//{//    context.SetError("invalid_grant", "用户名或者密码错误");//    //var response = context.Response = context.Response ?? new HttpResponseMessage();//    //response.StatusCode = HttpStatusCode.Forbidden;//    //response//    return null;//}var identity = new ClaimsIdentity(context.Options.AuthenticationType);identity.AddClaim(new Claim("sub", username));context.Validated(identity);return Task.FromResult<Object>(identity);}public override Task ValidateAuthorizeRequest(OAuthValidateAuthorizeRequestContext context){return base.ValidateAuthorizeRequest(context);}public override Task ValidateTokenRequest(OAuthValidateTokenRequestContext context){return base.ValidateTokenRequest(context);}}

6.附上MysqlHelp类

右键单击项目创建新类并命名为MysqlHelper
复制以下代码:

class MysqlHelper{public string dbConnStr;public MySqlConnection dbConn = null;public MySqlCommand dbCmd = null;public MySqlDataReader dbDataReader = null;public MysqlHelper(string connectionString){dbConnStr = connectionString;dbConn = new MySqlConnection(dbConnStr);dbCmd = new MySqlCommand();dbCmd.Connection = dbConn;}MysqlHelper(){Close();}public void Open(){dbConn.Open();}public void Close(){dbConn.Close();}public MySqlDataReader ExecuteReader(string sqlStr_Read){dbCmd.CommandText = sqlStr_Read;dbDataReader = dbCmd.ExecuteReader();return dbDataReader;}public int ExecuteNonQuery(string sqlStr_Insert){dbCmd.CommandText = sqlStr_Insert;int result = dbCmd.ExecuteNonQuery();return result;}}

7.启动 OWIN 主机,并使用 HttpClient 发出请求

将 Program.cs 文件中的所有样本代码替换为以下代码:

 class Program{static void Main(string[] args){string baseAddress = "http://localhost:9000/";// Start OWIN host using (WebApp.Start<Startup>(url: baseAddress)){// Create HttpClient and make a request to api/values HttpClient client = new HttpClient();var response = client.GetAsync(baseAddress + "api/values").Result;Console.WriteLine(response);Console.WriteLine(response.Content.ReadAsStringAsync().Result);Console.ReadLine();}}}

最后附上一张项目图片:

8.下面开始测试代码

运行程序出现如下界面,此时可以看见接口已被隐藏,拒绝访问。

注意看图片Body内容,这是我数据库预存的账号密码,点击send按钮,如果你输入的body内容和你数据库中内容一样会自动生成token认证码,见下图:

如果你输入的账号密码不对,或者和你数据库中预存的账号密码不一致,则会返回空,见下图:

下面尝试不添加token验证访问接口,可以看到接口拒绝访问。


添加token认证码后,成功访问接口,见下图:


本文基于微软官方文档进行编写,转载请注明出处。

Webapi添加token认证功能相关推荐

  1. 关于wifi portal认证--为浏览器添加wifi认证功能

    ###关于wifi portal认证–为浏览器添加wifi认证功能 1.什么是portal认证 2.android的原生portal认证概要讲述 3.独立出portal认证到浏览器 ####1.什么是 ...

  2. newifi3 web认证_关于wifi portal认证--为浏览器添加wifi认证功能

    关于wifi portal认证--为浏览器添加wifi认证功能 1.什么是portal认证 2.android的原生portal认证概要讲述 3.独立出portal认证到浏览器 1.什么是portal ...

  3. 前端学习(1879)vue之电商管理系统电商系统之通过axios拦截器添加token认证

    目录结构 router.js import Vue from 'vue' import Router from 'vue-router' import Login from './components ...

  4. 微信开发实战(4)—URL、Token认证、java源码、免费新浪SAE部署

    上篇文章概要介绍了微信公众号开发的原理,偏重于讲解理论. 本篇文章通过java web应用实现微信公众号的URL.Token认证.并部署到免费的新浪SAE服务器上,轻松教你实现公众号成为开发者号. 一 ...

  5. 【人人开源】集成通过Token认证统一登录功能

    [人人开源]集成通过Token认证统一登录功能 后端 https://gitee.com/renrenio/renren-fast 前端 https://gitee.com/renrenio/renr ...

  6. 微信公众号配置 Token 认证以及消息推送功能

    前言 公众号服务配置 Token认证 如何配置 Token 认证接口 公众号获取网页授权及用户信息 导向 网页授权 关注后消息触发授权 公众号推送模板消息 模板消息功能插件 推送模版消息接口介绍 获取 ...

  7. token拦截器android_vue.js添加拦截器,实现token认证(使用axios)

    什么是token? token是一个用户自定义的任意字符串,目前开发中,token都是在服务端生成并且token的值会保存到服务器后台.只有服务器和客户端知道这个字符串,于是,这个token就成了两者 ...

  8. SpringSecurity添加图形验证码认证功能

    SpringSecurity添加图形验证码认证功能 第一步:图形验证码接口 1.使用第三方的验证码生成工具Kaptcha https://github.com/penggle/kaptcha @Con ...

  9. Openstack组件实现原理 — Keystone认证功能

    前言 Keystone实现始终围绕着Keystone所实现的功能来展开,所以在理解其实现之前,建议大家尝试通过安装Keystone这一个过程来感受Keystone在Openstack架构中所充当的角色 ...

最新文章

  1. 中医点滴 1 --- 冬季外感喉咙痛 寒性荨麻疹
  2. “技术崇拜”与“技术恐惧”都会阻碍 AI 创新,“技术节制”才是正道
  3. CommonsMultipartFile 转为 File 类型
  4. Hadoop Streaming二次排序
  5. 将Python字符串生成PDF
  6. Java文件操作:文件夹中搜索文件
  7. 计算机电源外形,电源外观及铭牌解析_HKC电源_机箱电源评测-中关村在线
  8. 图像数据格式基础知识
  9. Android之自定义ContentProvider详解
  10. 我在Freebsd下安装帝国CMS系统整合Discuz的服务器环境配置
  11. oracle 28000错误码,Oracle数据库 ORA-28000 错误处理方式
  12. 数据科学和人工智能技术笔记 五、文本预处理
  13. 数字全息 matlab,基于MATLAB实现的数字全息实验系统
  14. 408计算机考研2012真题解析,2018年计算机408统考考研真题及答案解析.pdf
  15. matlab仿真三相整流电路设计,基于MATLAB的三相整流电路仿真研究毕业设计
  16. data参数 layui_layui upload 额外参数上传
  17. 关于iOS自定义推送消息铃声
  18. Google Play In-app Billing
  19. python儿童入门教程视频-Python入门视频全套教程
  20. 函数的单调性和曲线的凹凸性

热门文章

  1. 嵌入式硬件设计与实践(从硬件到产品)
  2. 不是机器人韩剧所有歌曲_不是机器人OST插曲mp3音源哪里有 不是机器人背景音乐详细介绍...
  3. win10安装水星无线网卡MW54U
  4. resty-mongol3的简单封装
  5. I型三电平 28335控制器 有源电力滤波器APF程序源代码
  6. 使用git的正确方式,Git操作不规范,代码被吞两行泪
  7. python 中文编码类型 gb2312 gb180_常用字符集编码详解:ASCII 、GB2312、GBK、GB18030、UTF-8、unicode...
  8. 好程序员Java培训分享Java初学者必读
  9. 2020年最新Python学习路线及学习目标规划 拿走不谢!
  10. 【Unity3D自学记录】Unity3D之localEulerAngles